【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