|
|
在ComboBox中改变列表框的宽度 ; w3 G1 S- ]" \ Q: l; R5 Q
( `0 G( C1 H4 l+ s- T: c
2002-03-07· ·贾旭滨(译) ·· 4 q# g9 U4 v" L( y( Y" l
$ P+ o. c! u3 U4 ^( J, d- c2 d
- c7 v; I, b Y! X) ]1 W0 P 我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。
5 v$ v: ~5 s" M* Q+ r$ o5 p1 P 为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:
( q5 L& U. H; m7 J
; q: o: P. p. cHBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor)
' H: {) @* f' i5 W7 G{' B) i6 F- _. ^5 l6 D
HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);
3 G% R0 a$ w, z% { K" | switch (nctlcolor) {
/ g' U& k v( f& I1 @9 [ case ctlcolor_edit:0 Q! o+ i8 r' Y; p4 G# ~5 c
break;
1 G2 K) m- \2 c( j' Q# |) H case ctlcolor_listbox:# m1 @) E) V+ w
if (listwidth > 0) {
2 J B( D! A; ^1 D. B5 f. r // new width of a listbox is defined+ \6 V2 _( T7 e- c5 S# O1 d
CRect rect;
* {/ g6 L1 \3 x3 v* i5 x6 y pwnd->GetWindowRect(&rect);
" _7 W8 M# Q, Z( F" Y if (rect.Width() != listwidth) {+ x7 k* P" d- x
rect.right = rect.left + listwidth;) z) a! d L6 L8 S
pwnd->MoveWindow(&rect);6 R( }9 A0 W) o q
}
* K Y$ Y4 s; u }. t) A2 q! B. @# K1 c- @2 s: a
break;
! h5 Y0 ~& i7 q: L }& `. j; f3 C* m- e8 v2 F
9 I: h' t' B B: D6 F
// todo: return a different brush if the default is not desired' w' D a% F6 J. C# I
return hbr;& E$ m6 i& I0 a( A# Z) m- {
}2 T, S& |. c6 w, C
1 K6 I2 ~; v! h$ H! t( K O
) b, E, C! I$ D% o) u; T 这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。
, _: }' m8 T% I6 j$ Z
' s% |9 X4 H" g$ z2 ] 上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:$ M8 I1 w, @2 Y3 k- j) N4 v
- ]2 _+ @# e/ l) b, Z
CComboBox::SetDroppedWidth(int width);
$ _% G% T- ]8 E. S0 f0 B
4 i: G% ] a% k/ j. l7 e 通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值:
* {4 w9 |) ~" n- c& P% ]( H$ ]( H1 v7 S
1.你所设置的值(就是通过上面的函数所设置的值)
3 a7 z7 \' O; G" _3 R4 q9 W: A9 v' j0 p$ o0 F' G- D
2.列表框的值 |
|