|
|
在ComboBox中改变列表框的宽度
+ R* `1 }$ r4 U, T. Q; }) N6 G9 {% `
2002-03-07· ·贾旭滨(译) ··
5 L8 K7 N4 k! i( O- }6 q1 u
( r* D3 W8 i+ z
4 D, O) m7 M" n9 `, h3 j4 Z: Z 我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。
' j$ ]% y" e6 |) m, A" o5 j 为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:
6 w9 w0 u! G R8 s' z# c5 m' G6 ^5 ]6 g3 W+ w2 q( N8 u F& ]
HBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor) " m5 B# L- J( F! u: U9 W! O; E* \5 w
{
& H5 [5 o0 \1 P) c* ]% D$ V HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor); I8 u9 p$ P/ h8 ^
switch (nctlcolor) {
7 g, ], k% h9 y$ r case ctlcolor_edit:0 p7 d' Q c3 |
break;$ s! c/ Q0 ~ m* v1 r' a% N
case ctlcolor_listbox:' _) l4 O* t, Q; ^6 U! o
if (listwidth > 0) { , z; E/ a5 |4 s$ h5 Q
// new width of a listbox is defined
) r! [* t4 l- a3 C4 i CRect rect;$ J1 ?0 |# E h' l
pwnd->GetWindowRect(&rect);
/ A9 |6 X0 ]/ G+ F if (rect.Width() != listwidth) {" F2 \# G; K) P) N9 {3 u) n; }# S
rect.right = rect.left + listwidth;
9 T/ G, Q7 n! [0 F9 t2 o' G pwnd->MoveWindow(&rect);6 q; C: i! {0 U$ A5 P) N$ y+ `/ _1 F
}
9 |) ^ y! V0 g* |, G }
" ?- V9 }8 R# x5 p+ X, A0 T break;
6 j n; k- ?) L: p* N+ u }
7 N$ q$ I i* m' ~9 `3 Z; |8 F
9 Z; z) h; F. A9 T# A. g4 v // todo: return a different brush if the default is not desired' s; a; b! f! L6 I4 S3 c a* k
return hbr;: Q# F0 e8 G- K: x0 l
}9 D6 w# [) J* C2 ]0 x
) X$ o) @/ u- |' u
+ D; o+ @" V% ^; ?; J( T( Y 这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。
# D2 U' C' ?9 W$ J9 C" ?- X2 g1 }9 |
上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:
1 i: f& k! C9 z1 F8 L$ l) S7 s
1 [( u/ k0 p( s; R! nCComboBox::SetDroppedWidth(int width); . G( \" G% y- v9 v
1 G( P- q$ z/ l, U 通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值:
; P) G0 W$ y3 V+ `
7 t' e, k2 [, w* A0 L+ S# l 1.你所设置的值(就是通过上面的函数所设置的值)# L4 a9 E2 |+ {5 v/ G5 o9 b
/ M/ Y" p; l" ?4 N2 _ 2.列表框的值 |
|