Join Now
Quality Rating:
  • Currently 0.0 / 5
(0.0 / 5 - 0 votes cast)
Expertise Level:
  • Currently 0.0 / 5
(0.0 / 5 - 0 votes cast)

This page was last modified 20:24, 29 October 2007.

Использование пользовательских элементов управления (Custom Controls) в диалогах

From Forum Nokia Wiki


В данной статье представлена реализация простого пользовательского элемента управления (CSmileControl), а также его использование в диалоге (CAknDialog).

Image:SmileControl.jpg

Заголовочный файл SmileControl.h:

#include <akncontrol.h> 
 
class CAknsBasicBackgroundControlContext;
class CSmileControl : public CAknControl
{
   public:
      ~CSmileControl();
      void ConstructL( const CCoeControl* aParent );
      TTypeUid::Ptr MopSupplyObject(TTypeUid aId);
 
      TSize MinimumSize();
	
   protected:
      void SizeChanged();
	
   private:
      void Draw( const TRect& aRect ) const;
	
   private:
      CAknsBasicBackgroundControlContext* iBackground;	
};

Тело класса SmileControl.cpp:

#include "SmileControl.h"
 
#include <aknutils.h> 
#include <AknsDrawUtils.h>
#include <AknsBasicBackgroundControlContext.h> 
 
 
CSmileControl :: ~CSmileControl()
{
   delete iBackground;
}
 
void CSmileControl :: ConstructL( const CCoeControl* aParent )
{	
   if( aParent == NULL )
	CreateWindowL(); 
   else
	SetContainerWindowL( *aParent );		
   // поддержка тем
   iBackground = CAknsBasicBackgroundControlContext :: NewL ( 
                     KAknsIIDQsnBgAreaMain, Rect(), EFalse );	
   ActivateL();
}
 
TTypeUid::Ptr CSmileControl::MopSupplyObject(TTypeUid aId)
{
   // поддержка тем
   return iBackground != NULL ?
              MAknsControlContext :: SupplyMopObject( aId, iBackground ) :
              CAknControl :: MopSupplyObject( aId );
}
 
TSize CSmileControl :: MinimumSize()
{
    // в этом примере элемент управления занимает Main Pane полностью
    TSize mainPaneSize;
    AknLayoutUtils :: LayoutMetricsSize( 
         AknLayoutUtils::EMainPane,  mainPaneSize );
    return mainPaneSize;
}
 
void CSmileControl::SizeChanged()
{
   // изменение размеров нужно учесть для отображения фона
   if( iBackground )
      iBackground->SetRect(Rect());
}
 
 
 
void CSmileControl :: Draw( const TRect& /*aRect*/ ) const
{
   TRect rect = Rect();
   CWindowGc& gc = SystemGc();
	
   // отображение фона текущей темы
   MAknsSkinInstance* skin = AknsUtils::SkinInstance();
   MAknsControlContext* cc = AknsDrawUtils::ControlContext( this );
   AknsDrawUtils::Background( skin, cc, this, gc, rect );
 
   // отрисовка смайла
   rect.Shrink( 10, 10 );
   gc.SetPenStyle( CGraphicsContext :: ESolidPen );
   gc.SetPenColor( KRgbBlack );
   gc.SetPenSize( TSize( 5, 5 ) );
   gc.SetBrushStyle( CGraphicsContext :: ESolidBrush );
   gc.SetBrushColor( KRgbYellow );
   gc.DrawEllipse( rect );	
	
   // глаза
   gc.SetBrushColor( KRgbBlack );
   TRect eyeRect = rect;
   eyeRect.Resize( -rect.Width() * 0.8, -rect.Height() * 0.8 );
   eyeRect.Move( rect.Width() / 4, rect.Height() / 4 );
   gc.DrawEllipse( eyeRect );
   eyeRect.Move( rect.Width() / 2 - eyeRect.Width(), 0 );
   gc.DrawEllipse( eyeRect );
	
   // рот
   gc.SetPenSize( TSize( 20, 20 ) );
   rect.Move( 0, rect.Height() / 7 );
   rect.Shrink( rect.Width() * 0.2, rect.Height() * 0.3 );
   gc.DrawArc( rect, 
               TPoint( rect.iTl.iX, 
                       rect.iTl.iY + rect.Height() * 0.6 ), 
               TPoint( rect.iTl.iX + rect.Width(), 
                       rect.iTl.iY + rect.Height()* 0.6 ) 
             );
}

Для того чтобы отобразить пользовательский элемент управления в диалоге, нужно определить ресурс диалога:

RESOURCE DIALOG r_smile_dialog
{
   flags = EEikDialogFlagNoDrag | EEikDialogFlagFillAppClientRect | 
	   EEikDialogFlagWait | EEikDialogFlagCbaButtons |    
           EikDialogFlagNoTitleBar;	
   buttons = R_AVKON_SOFTKEYS_OK_EMPTY;
}

Создать класс - наследник CAknDialog, он может выглядеть следующим образом:

#include <akndialog.h>
 
class CSmileControl;
class CSmileDialog : public CAknDialog
{
   private:
      SEikControlInfo CreateCustomControlL(TInt aControlType);	
      void PreLayoutDynInitL();
			
   private:
      CSmileControl* iSmileControl;
};

Тело класса:

#include "SmileDialog.h"
#include "SmileControl.h"
 
 
void CSmileDialog :: PreLayoutDynInitL()
{
   CAknDialog :: PreLayoutDynInitL();
   const TInt KSmileControlId = 1;
   // создание элемента диалога
   // используется незанятое значение для типа EAknCtLastControlId
   CCoeControl* ctrl = 
         CreateLineByTypeL( KNullDesC, 
                            KSmileControlId, 
                            EAknCtLastControlId,  
                            NULL );
   iSmileControl = static_cast<CSmileControl*>( ctrl );
   // вторая фаза конструирования
   iSmileControl->ConstructL( this );
}    
 
_LIT( KModule, "CSmileDialog :: CreateCustomControlL" );
SEikControlInfo CSmileDialog :: CreateCustomControlL( TInt aControlType )
{
   // создаваемый элемент управления должен быть типа aControlType
   __ASSERT_ALWAYS( aControlType == EAknCtLastControlId, 
	            User::Panic( KModule, KErrArgument ) );
	
   // создаем пользовательский элемент управления
   iSmileControl = new (ELeave) CSmileControl;	
   SEikControlInfo controlInfo;
   controlInfo.iFlags = EEikControlHasEars;
   controlInfo.iTrailerTextId = 0;
   controlInfo.iControl = iSmileControl;
   STATIC_CAST(CSmileControl*, 
               controlInfo.iControl)->SetContainerWindowL( *this );
	
   return controlInfo;
}

Диалог можно вызвать следующим образом:

CSmileDialog* dialog = new (ELeave) CSmileDialog();
   dialog->ExecuteLD( R_SMILE_DIALOG );
Related Discussions
Thread Thread Starter Forum Replies Last Post
assiging controls on bitmaps Priju Jacob Paul Symbian User Interface 1 2006-04-28 04:42
A Player for streaming Paranoid_Android Mobile Java Media (Graphics & Sounds) 2 2006-07-17 12:50
How to Add buttons....? nandi1225 General Symbian C++ 4 2008-04-16 11:57
Multiselect Listbox - unticked icon? parisn General Symbian C++ 4 2007-12-16 17:42
UI control hierarchy dexterpost Python 2 2008-03-19 09:37
 
Powered by MediaWiki
     
     RDF Facets:
     
     
     qfnZtypeQUqfnTypeZCommunityContentQ
     qfnZtypeQUqfnTypeZWebpageQ
     qfnZtypeQUqfnTypeZWikiContentQ
     qmarsZlanguageQUxhttpE3aE2fE2fswE2enokiaE2ecomE2flanguageE2d1E2fenX