|
|
在ComboBox中改变列表框的宽度 & C/ y- b# @( A$ w! I# d/ k3 e/ F
' q0 n! J) ^5 Z t3 G. R
2002-03-07· ·贾旭滨(译) ·· ' v+ `, _: W( v1 I2 I0 g
: n6 e/ r2 O& a2 w% i0 i* a+ {3 [' V X
我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。
: S; o% W5 h: f2 v0 f7 T 为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:7 z- G4 l. g3 v% _" V; P( p2 U1 D8 O9 O
" X0 ]+ S4 C! @) _3 OHBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor)
; j! g/ F8 k, ?7 E8 R{$ A& j5 t* Q3 }; r8 g8 A3 ~5 y
HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);: W" e1 F" F$ l
switch (nctlcolor) {% R# j n- N3 @. ?: e# k% q H6 u
case ctlcolor_edit:' q6 Y2 z# L% w$ g
break;
- V1 @$ \9 H ^/ l3 A case ctlcolor_listbox:- e3 [. s% C* y( ^6 T
if (listwidth > 0) {
: Y2 t; D6 g3 S4 h- P2 M // new width of a listbox is defined4 ^9 Y$ E+ `8 N$ S" u. G2 q7 R8 I
CRect rect;: Y- v3 n0 ^# w$ y- f. e, L; L
pwnd->GetWindowRect(&rect);8 u6 `3 n- G( d9 A# ~) `" h
if (rect.Width() != listwidth) {
. D) P A% o; r3 b/ x8 j! r" ^ rect.right = rect.left + listwidth;
5 ~8 q, p% X( _1 D2 Z: u9 i pwnd->MoveWindow(&rect);
3 _" S+ C- |$ W, w }
. N2 |3 r9 \* w4 z, `6 R, _) E }. i; o4 X# m1 k7 A
break;
\8 v3 N* ]2 y4 a$ w( k% X# R! ]/ l }
/ f! I$ ^% E+ [: t/ B6 ], W( h5 |3 w9 w6 z
// todo: return a different brush if the default is not desired; X7 x5 S1 T' e4 O" m' z. ]5 A
return hbr;0 \, b2 \2 @+ q T* a+ t0 J
}( [" n* z; t9 D& n1 Q) ]
- u1 H4 \5 }* e
0 {: {2 g0 v2 s 这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。) T; ^" E% D L0 `6 [
, J5 \! q" n& G+ h) l
上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:5 i' O, J; u) E6 \
5 o% k/ j2 l* C, B" w d& FCComboBox::SetDroppedWidth(int width);
6 }7 ?. G2 g2 @7 z) G; H
) E8 L% t) S6 Y, }; w9 o8 h 通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值: . G/ m' E/ w0 O p
/ I& o6 l" j: X0 k, L 1.你所设置的值(就是通过上面的函数所设置的值)0 q/ u( y% ?; O, |# Q
. W6 T% t- W1 ?8 ^, T: e7 [
2.列表框的值 |
|