This page was last modified 20:24, 29 October 2007.
Использование пользовательских элементов управления (Custom Controls) в диалогах
From Forum Nokia Wiki
В данной статье представлена реализация простого пользовательского элемента управления (CSmileControl), а также его использование в диалоге (CAknDialog).
Заголовочный файл 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 |

