|
在ComboBox中改变列表框的宽度
( H; f8 Z7 U8 m ^# [; t; j- D+ p6 v; p$ I
2002-03-07· ·贾旭滨(译) ··
: |$ P3 `" \4 Y8 @, s- l
' G4 u6 |9 e* t7 E# o8 a2 s d4 t- Z- ?2 x
我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。 ; k; ]0 N/ c3 X$ Y$ y7 M3 p7 G
为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码: o' A1 V% I# L1 |# }/ Y% F
/ V0 f2 i. z7 z& h IHBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor)
0 C( K. Q5 z; g6 K9 z3 y0 N% `" _{; V) M3 O m4 Q/ S+ R
HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);
+ z$ ~$ \7 t5 g& g S switch (nctlcolor) {* k9 s$ a: M# }4 l* M1 n5 _
case ctlcolor_edit:
& I; e! G( C( [* h, u' ` break;1 r0 J; j2 B( Y' o& ^3 R
case ctlcolor_listbox:
/ Q" t* R, o1 t if (listwidth > 0) { 8 O( `. S# S( m. r$ P
// new width of a listbox is defined; {5 Y* _ f% \
CRect rect;
: [2 f5 f P$ e* ? D; L pwnd->GetWindowRect(&rect);2 L; j! i6 u: f, s6 ~
if (rect.Width() != listwidth) {% R- s& ]6 ?" Q+ H) P7 ^
rect.right = rect.left + listwidth;( R. x5 O9 T& U* ~4 k* Z/ S4 n
pwnd->MoveWindow(&rect);
/ j. c% A9 ]5 [ M }
- Y& g$ ^- G$ L5 H0 [9 T }
6 [9 o2 V; n! \; Y& d7 X: i% f- L break;
$ M; j/ b" |3 | }
: ]9 `6 s$ N4 G( c! }2 Z' c2 @6 P! p# u& {
// todo: return a different brush if the default is not desired( @, I7 U9 d8 C" k( Q# x7 m5 g
return hbr;
2 S& ^+ k3 q4 G/ y8 [}
9 p* T3 v# z$ F o5 I! K# x- h; {+ }2 k( X, @
% O( F0 E$ D( I
这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。, O+ A4 \/ g0 W) X2 Q3 V
. s. ?* Q) y, z+ a$ ~, E 上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:% x0 H- G* ^6 {! O
& J% z7 ]4 _' D- {! n" b
CComboBox::SetDroppedWidth(int width);
' v. M. T& I( \" |7 ~8 M) n' p, e! g% o" q0 R
通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值: : d) I' W5 A- w0 w0 c7 R; d3 |7 ~
3 x5 _: [3 {& d- E7 G5 o5 u 1.你所设置的值(就是通过上面的函数所设置的值)
8 x# h! }# {$ x j$ D% V4 \
- o; R# u i8 ~ 2.列表框的值 |
|