技术开发 频道

初学者的练手--ComboBox实现过程

  【IT168技术】给初学者提供一个练习制作ComboBox的代码,但是大家最好先要自己试着写一下代码的实现过程,这样印象才会深刻,毕竟作为程序员,写代码是基本功练习,没有足够多的代码编写经验,是不具备一个程序员的基本素质的。

  以上是两张效果图

  下面给源码

  ComboBox.h // 头文件

  1 #include

  2

  3 class CComboBox : public CCoeControl

  4 {

  5 public:

  6 // 设置下拉列表框中的内容

  7 void SetComboContent(const TDesC& aContent);

  8 // 获得一条的显示的区域

  9 TRect GetItemRect();

  10 // 设置显示区域右边的那个小图标

  11 void SetBitmapLogo(CFbsBitmap* aBitmapLogo);

  12 // 设置他是否要被操作

  13 void SetIsOperate(TBool aIsOperate);

  14 // 设置是否显示下拉列表

  15 void SetIsList(TBool aIsList);

  16 // 获得当前选中的条目编号

  17 TInt GetCurrentIndex();

  18 public:

  19 // 设置ComboBox的背景颜色(默认为黑色)

  20 void SetComboBoxColor(TRgb aComboBoxColor);

  21 // 设置选中并开始操作的边框颜色(默认为蓝色)

  22 void SetOperateColor(TRgb aOperateColor);

  23 // 设置字体颜色(默认为白色)

  24 void SetTextColor(TRgb aTextColor);

  25 // 设置列表的填充颜色(默认为黑色)

  26 void SetListColor(TRgb aListColor);

  27 // 设置选中条目的颜色(默认为蓝色)

  28 void SetSelectColor(TRgb aSelectColor);

  29 public:

  30 // 获得ComboBox的背景颜色

  31 TRgb GetComboBoxColor();

  32 // 获得选中并开始操作的边框颜色

  33 TRgb GetOperateColor();

  34 // 获得字体颜色

  35 TRgb GetTextColor();

  36 // 获得列表的填充颜色

  37 TRgb GetListColor();

  38 // 获得选中条目的颜色

  39 TRgb GetSelectColor();

  40 public:

  41 static CComboBox* NewL(const CCoeControl* aParent);

  42 static CComboBox* NewLC(const CCoeControl* aParent);

  43 virtual ~CComboBox();

  44 TKeyResponse OfferKeyEventL(const TKeyEvent &aKeyEvent, TEventCode aType);

  45 // 设置一条的坐标

  46 void SetItemPoint(TPoint aPoint);

  47 private:

  48 CComboBox();

  49 void ConstructL(const CCoeControl* aParent);

  50 private:

  51 void Draw(const TRect& aRect) const;

  52 private:

  53 // 控件所控制区域的大小

  54 TRect iRect;

  55 // 存储下拉列表中的内容

  56 RPointerArray iComboInformationArray;

  57 // 显示的区域的大小

  58 TSize iDisplaySize;

  59 // 条目所占的大小

  60 TSize iItemSize;

  61 // 图标所占的大小

  62 TRect iLogoRect;

  63 // 设置ComboBox右边的那个小图标

  64 CFbsBitmap* iBitmapLogo;

  65 // 是否对ComboBox进行操作

  66 TBool iIsOperate;

  67 // 是否显示下拉列表框

  68 TBool iIsList;

  69 // 设置要显示的数组里的哪一个元素

  70 TInt iCurrentIndex;

  71 private:

  72 // ComboBox的背景颜色(默认为黑色)

  73 TRgb iComboBoxColor;

  74 // 选中并开始操作的边框颜色(默认为蓝色)

  75 TRgb iOperateColor;

  76 // 字体颜色(默认为白色)

  77 TRgb iTextColor;

  78 // 列表的填充颜色(默认为黑色)

  79 TRgb iListColor;

  80 // 选中条目的颜色(默认为蓝色)

  81 TRgb iSelectColor;

  82 };

  83

  ComboBox.cpp 文件

  1 #include "ComboBox.h"

  2 #include

  3 #define MEM_FREE(a) if(a){delete a; a=NULL;}

  4

  5 // 设置下拉列表框中的内容

  6 void CComboBox::SetComboContent(const TDesC& aContent)

  7 {

  8 if (aContent.Length() <= 0)

  9 {

  10 return;

  11 }

  12 HBufC* itemInformation = NULL;

  13 itemInformation = HBufC::NewLC(aContent.Length()+1);

  14 itemInformation->Des().Copy(aContent);

  15 iComboInformationArray.Append(itemInformation);

  16 CleanupStack::Pop();

  17

  18 const CFont* fontUsed = ApacPlain16();

  19 iDisplaySize.iHeight += (fontUsed->HeightInPixels()+4);

  20 iItemSize.iHeight = fontUsed->HeightInPixels() + 4;

  21 TInt width = fontUsed->TextWidthInPixels(itemInformation->Des()) + 2*fontUsed->MaxCharWidthInPixels();

  22 if (width > iDisplaySize.iWidth)

  23 {

  24 iDisplaySize.iWidth = width;

  25 iItemSize.iWidth = iDisplaySize.iWidth;

  26 }

  27 }

  28

  29 // 获得一条的显示的区域大小

  30 TRect CComboBox::GetItemRect()

  31 {

  32 return iRect;

  33 }

  34

  35 // 设置显示区域右边的那个小图标

  36 void CComboBox::SetBitmapLogo(CFbsBitmap* aBitmapLogo)

  37 {

  38 iBitmapLogo = aBitmapLogo;

  39 }

  40

  41 // 设置他是否要被操作

  42 void CComboBox::SetIsOperate(TBool aIsOperate)

  43 {

  44 iIsOperate = aIsOperate;

  45 }

  46

  47 // 设置是否显示下拉列表

  48 void CComboBox::SetIsList(TBool aIsList)

  49 {

  50 iIsList = aIsList;

  51 }

  52

  53 // 获得当前选中的条目编号

  54 TInt CComboBox::GetCurrentIndex()

  55 {

  56 return iCurrentIndex;

  57 }

  58

  59 // 设置ComboBox的背景颜色(默认为蓝色)

  60 void CComboBox::SetComboBoxColor(TRgb aComboBoxColor)

  61 {

  62 iComboBoxColor = aComboBoxColor;

  63 }

  64

  65 // 设置选中并开始操作的边框颜色(默认为蓝色)

  66 void CComboBox::SetOperateColor(TRgb aOperateColor)

  67 {

  68 iOperateColor = aOperateColor;

  69 }

  70

  71 // 设置字体颜色(默认为白色)

  72 void CComboBox::SetTextColor(TRgb aTextColor)

  73 {

  74 iTextColor = aTextColor;

  75 }

  76

  77 // 设置列表的填充颜色(默认为黑色)

  78 void CComboBox::SetListColor(TRgb aListColor)

  79 {

  80 iListColor = aListColor;

  81 }

  82

  83 // 设置选中条目的颜色(默认为蓝色)

  84 void CComboBox::SetSelectColor(TRgb aSelectColor)

  85 {

  86 iSelectColor = aSelectColor;

  87 }

  88

  89 // 获得ComboBox的背景颜色

  90 TRgb CComboBox::GetComboBoxColor()

  91 {

  92 return iComboBoxColor;

  93 }

  94

  95 // 获得选中并开始操作的边框颜色

  96 TRgb CComboBox::GetOperateColor()

  97 {

  98 return iOperateColor;

  99 }

  100

  101 // 获得字体颜色

  102 TRgb CComboBox::GetTextColor()

  103 {

  104 return iTextColor;

  105 }

  106

  107 // 获得列表的填充颜色

  108 TRgb CComboBox::GetListColor()

  109 {

  110 return iListColor;

  111 }

  112

  113 // 获得选中条目的颜色

  114 TRgb CComboBox::GetSelectColor()

  115 {

  116 return iSelectColor;

  117 }

  118

  119 CComboBox::~CComboBox()

  120 {

  121 iComboInformationArray.ResetAndDestroy();

  122 MEM_FREE(iBitmapLogo);

  123 }

  124

  125 TKeyResponse CComboBox::OfferKeyEventL(const TKeyEvent &aKeyEvent, TEventCode aType)

  126 {

  127 if (iIsOperate)

  128 {

  129 if (iIsList)

  130 {

  131 if ((aType == EEventKey) && (aKeyEvent.iCode == EKeyDevice3))

  132 {

  133 SetIsList(EFalse);

  134 }

  135 else if ((aType == EEventKey) && (aKeyEvent.iCode == EKeyDownArrow))

  136 {

  137 iCurrentIndex = (iCurrentIndex+1)%iComboInformationArray.Count();

  138 }

  139 else if ((aType == EEventKey) && (aKeyEvent.iCode == EKeyUpArrow))

  140 {

  141 iCurrentIndex = (iCurrentIndex+iComboInformationArray.Count()-1)%iComboInformationArray.Count();

  142 }

  143 }

  144 else

  145 {

  146 if ((aType == EEventKey) && (aKeyEvent.iCode == EKeyDevice3))

  147 {

  148 iCurrentIndex = 0;

  149 SetIsList(ETrue);

  150 }

  151 }

  152 }

  153

  154 }

  155

  156 // 设置一条的坐标

  157 void CComboBox::SetItemPoint(TPoint aPoint)

  158 {

  159 // 设置显示区域

  160 iRect.iTl = aPoint;

  161 iRect.iBr.iX = iRect.iTl.iX + iItemSize.iWidth;

  162 iRect.iBr.iY = iRect.iTl.iY + iItemSize.iHeight;

  163 CCoeControl::SetExtent(iRect.iTl, iRect.Size());

  164 // 图片显示区域的大小

  165 TSize lBitmapSize(TSize(iItemSize.iHeight, iItemSize.iHeight));

  166 iLogoRect.iBr.iX = iRect.iBr.iX - 1;

  167 iLogoRect.iBr.iY = iRect.iBr.iY - 1;

  168 iLogoRect.iTl.iX = iRect.iBr.iX - lBitmapSize.iWidth + 1;

  169 iLogoRect.iTl.iY = iRect.iBr.iY - lBitmapSize.iHeight + 1;

  170 }

  171

  172 CComboBox::CComboBox(): iIsOperate(EFalse), iIsList(EFalse), iComboBoxColor(KRgbBlack),

  173 iOperateColor(KRgbBlack), iTextColor(KRgbWhite), iListColor(KRgbBlack),

  174 iSelectColor(KRgbBlue)

  175 {

  176 iRect.iTl = TPoint(0, 0);

  177 iRect.iBr = TPoint(0, 0);

  178 iDisplaySize.iWidth = 0;

  179 iDisplaySize.iHeight = 0;

  180 iItemSize.iWidth = 0;

  181 iItemSize.iHeight = 0;

  182 iLogoRect.iTl = TPoint(0, 0);

  183 iLogoRect.iBr = TPoint(0, 0);

  184 iBitmapLogo = NULL;

  185 }

  186

  187 void CComboBox::Draw(const TRect& aRect) const

  188 {

  189 CWindowGc& gc = SystemGc();

  190 // 填充列表条的背景颜色

  191 gc.SetBrushStyle(CGraphicsContext::ESolidBrush);

  192 gc.SetBrushColor(iComboBoxColor);

  193 gc.DrawRect(iRect);

  194

  195 if (iIsOperate)

  196 {

  197 // 画出选中效果的边框

  198 gc.SetBrushStyle(CGraphicsContext::ENullBrush);

  199 gc.SetPenStyle(CGraphicsContext::ESolidPen);

  200 gc.SetPenColor(iOperateColor);

  201 gc.DrawRect(iRect);

  202 }

  203

  204 // 在框中设置填充字

  205 const CFont* fontUsed = ApacPlain16();

  206 gc.UseFont(fontUsed);

  207 gc.SetPenStyle(CGraphicsContext::ESolidPen);

  208 gc.SetPenColor(iTextColor);

  209 // 字体的高度

  210 TInt n_text_height = fontUsed->HeightInPixels();

  211 TInt n_point_iX = iRect.iTl.iX + 2;

  212 TInt n_point_iY = (iRect.Height() - n_text_height)/2 + n_text_height + iRect.iTl.iY;

  213 TPoint point_text = TPoint(n_point_iX, n_point_iY);

  214 if (iComboInformationArray[iCurrentIndex])

  215 {

  216 gc.DrawText(iComboInformationArray[iCurrentIndex]->Des(), point_text);

  217 }

  218

  219 // 画下拉列表的LOGO

  220 gc.DrawBitmap(iLogoRect, iBitmapLogo);

  221

  222 if (iIsList)

  223 {

  224 // 填充列表的背景颜色

  225 gc.SetBrushStyle(CGraphicsContext::ESolidBrush);

  226 gc.SetBrushColor(iListColor);

  227 TInt n_point_display_iX = iRect.iTl.iX;

  228 TInt n_point_display_iY = iRect.iTl.iY + iRect.Height() + 1;

  229 TPoint point_display = TPoint(n_point_display_iX, n_point_display_iY);

  230 TRect rect_display = TRect(point_display, iDisplaySize);

  231 gc.DrawRect(rect_display);

  232

  233 TInt nZeroFlag = 0;

  234 for (TInt i=0; i {

  235 // 一条条目的区域

  236 TInt n_point_item_iX = rect_display.iTl.iX;

  237 TInt n_point_item_iY = rect_display.iTl.iY + iRect.Height() *i;

  238 TPoint point_item = TPoint(n_point_item_iX, n_point_item_iY);

  239 TRect rect_item = TRect(point_item, iRect.Size());

  240

  241 if (iCurrentIndex == nZeroFlag)

  242 {

  243 // 条目的选中效果

  244 gc.SetBrushColor(iSelectColor);

  245 gc.DrawRect(rect_item);

  246 }

  247

  248 // 字体的坐标

  249 TInt n_text_item_iX = (rect_item.Width() - fontUsed->TextWidthInPixels(iComboInformationArray[i]->Des()))/2 + rect_item.iTl.iX;

  250 TInt n_text_item_iY = (rect_item.Height() - n_text_height)/2 + n_text_height + rect_item.iTl.iY;

  251 TPoint point_text = TPoint(n_text_item_iX, n_text_item_iY);

  252 // 绘制字体

  253 gc.DrawText(iComboInformationArray[i]->Des(), point_text);

  254

  255 ++ nZeroFlag;

  256 }

  257 }

  258

  259 gc.DiscardFont();

  260 }

  261

  使用方法:

  // 设置条目内容

  1 iComboBox->SetComboContent(_L("Choice..."));

  2 iComboBox->SetComboContent(_L("Text1..."));

  3 iComboBox->SetComboContent(_L("Text2..."));

  4 iComboBox->SetComboContent(_L("Text3..."));

  5 iComboBox->SetComboContent(_L("Text4..."));

  6 iComboBox->SetComboContent(_L("Text5..."));

  7 iComboBox->SetComboContent(_L("Text6..."));

  8 // 设置LOGO小图标

  9 CFbsBitmap* pBitmap = new (ELeave) CFbsBitmap();

  10 User::LeaveIfError(pBitmap->Load(sMbmPath, EMbmYipocoCombologo));

  11 iComboBox->SetBitmapLogo(pBitmap);

  12 iComboBox->SetItemPoint(TPoint(100 ,100));

  13 lComboBox->SetIsOperate(ETrue);

  需要设置SetIsOperate()为 ETrue,才能对其进行操作

  重绘需要重绘container

0
相关文章