|
|
在ComboBox中改变列表框的宽度 7 T- @( y/ I0 Z( O
5 B0 ?, v% A0 ?6 `/ G* X
2002-03-07· ·贾旭滨(译) ··
) t/ c" g) M5 l
% e+ t4 P( Z7 g2 @+ L
0 U" l, M* L1 n5 Y0 Z) k) A$ U9 W5 ~1 Y 我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。
( H, `4 w4 V4 O) w7 }4 s 为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:
! I; W" w( P6 l# X0 T" t/ l" ~4 P% d: R* @, y
HBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor)
, a- p7 q6 l' M3 j& F1 W) z- O; W{$ b0 |8 v: e( R6 S" Q
HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);4 d; w. M$ J3 ^1 v2 D* v* i4 B! p
switch (nctlcolor) {. k# l- C; {+ s3 W
case ctlcolor_edit:3 `3 _4 N& Z+ H3 m
break;
! k, B! p8 E1 {5 \$ U) o* v! ] case ctlcolor_listbox:
- A# ^5 }% G8 I( A6 k0 |6 } if (listwidth > 0) {
; I7 D7 x. n) M0 j- H // new width of a listbox is defined
6 |) ~" B% q. @ T2 R- v CRect rect;
2 {) r! T) \0 B5 x6 l pwnd->GetWindowRect(&rect);
$ j, P7 y2 ~ r e- \ if (rect.Width() != listwidth) {( {9 b8 P; d' y: h
rect.right = rect.left + listwidth;) m* Y/ A9 a2 e# q1 N
pwnd->MoveWindow(&rect);
~. i. `9 t) O% R" ] }
' A4 G8 o- ?! y5 y' w4 p8 j$ ^ }
+ V* J6 v8 o* c/ C+ \ break;
$ @8 c9 Y# J& Z% r }( [9 ~' _4 ]5 l0 |8 [4 {* C
0 Q3 G' e. s0 X6 }8 `! M8 N // todo: return a different brush if the default is not desired$ c, m( g/ Z! P$ h/ d4 F. B
return hbr;
3 C R% i) t1 h}
8 k o/ ~7 \+ l0 f: c8 Z, N, `$ } T: c9 i$ t& Z, r$ c
8 \* H6 P; T9 e! n4 m( o, ?' H+ b& y
这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。$ h. ^- m# v% P% c3 q+ r
- @) Y! C$ `' s" K, s1 t3 y/ l
上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:
# D% J1 ~, W m' S* j4 W% R. [# N- A9 E g6 k
CComboBox::SetDroppedWidth(int width); 1 Z1 F0 ~9 ]) i! K3 F! n
: N/ b9 Q# \5 C* P% T) x
通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值: 3 | o% D/ _/ o2 i4 |% Z- X
$ j- H D8 ?4 s ~8 c5 e' C* ]9 F' b 1.你所设置的值(就是通过上面的函数所设置的值)
! l' g* Q* ?6 D$ F" E
6 m$ m9 O5 ]5 i8 y( U 2.列表框的值 |
|