|
|
在ComboBox中改变列表框的宽度
* h2 D$ W8 V; x4 w5 u6 B9 I, o6 l' i3 W5 _; s+ g A* b0 n' J
2002-03-07· ·贾旭滨(译) ·· $ m$ T$ y/ F+ h5 }( X$ H
9 |! _! D/ i( D0 c
?/ M5 U1 V0 w' I: ] 我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。
/ x" R3 L. H! z- c6 c: F+ ]" c 为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:+ L) n, s' r" t/ Z8 ~) z8 G
5 r, X7 H/ K% i! ^$ zHBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor)
) Z0 s: a$ _+ ^# s& a' U" S{1 D& U7 D; p' `
HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);
+ f$ t" w" L& ^9 P switch (nctlcolor) {
. h p2 _. z# a( _6 s case ctlcolor_edit:
' I0 f7 q/ s# ^3 J9 N. L break;, t% a/ Y0 ~3 w) S4 }& g5 }
case ctlcolor_listbox:
! I" G4 U7 B Q4 O if (listwidth > 0) { # J l) Y' @- U/ R6 |' H8 Y" u m
// new width of a listbox is defined( r9 ~6 r4 C( Y- P" {
CRect rect;9 T: _! ^4 g- F* R4 l5 M/ Z
pwnd->GetWindowRect(&rect);
( ~% `. a8 x6 o. s- l9 a if (rect.Width() != listwidth) {$ ~" {% e5 f& R9 w; \+ }$ F$ }
rect.right = rect.left + listwidth;0 n4 _4 k1 A1 C' C: O0 O! P' d3 c
pwnd->MoveWindow(&rect);
" e4 j" r6 _" l' P: J. G& J }. L( M/ H' j, B# F, T, c
}
( ]! b) m, u4 Q; G break;
' J8 g W) B; z* o. Q3 c }1 T$ U1 Z4 \1 F' a; {1 o o
5 O+ t7 U$ `: s1 h- @' d
// todo: return a different brush if the default is not desired( S3 D% |5 ~; p6 E
return hbr;
& }' i; H1 o, y' b2 {* z- @}1 o# X( G( Q2 A) z* } j
; `1 ^+ a0 \: {$ C& y$ u4 i, F
$ k- G8 F0 A& X- T% @: [( t, } 这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。
) W+ @. H+ R' k# H" e/ d. t( d% y( z
上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:
' [6 O. z& o7 d0 U+ _
4 W/ e( O1 q8 F( d6 a# @* ~9 d* GCComboBox::SetDroppedWidth(int width);
% k! V# j. a7 T; A& ?4 \
, v* J+ G R; ?# [. q5 u 通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值: " N+ X5 A0 z! p
$ r. S8 k: O1 V
1.你所设置的值(就是通过上面的函数所设置的值)$ c2 R6 t9 m+ _# @' h) B4 Q6 r
7 f/ s5 M8 s: O% V! Z 2.列表框的值 |
|