|
在ComboBox中改变列表框的宽度
# B9 h0 u* Q* C' m; ^* g* }* c' X
6 i/ K5 L8 O9 r& H& s T& V5 G2002-03-07· ·贾旭滨(译) ·· . t$ G/ W) d; N; S. T; }% c
z9 M3 o, l( W; O5 Z
0 e4 c# y7 w5 n5 S/ x 我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。
: [- `- L$ b. N# r7 O: [ 为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:1 D5 Q3 O( e( L% _# V0 F% k
# j& G2 G( ^8 s8 fHBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor) , j! \0 H/ @ g. U3 g1 X9 g
{
8 f2 h1 j# u: o- P* F) p j HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);3 N8 w5 M) ~! E6 P. C4 p
switch (nctlcolor) {+ k1 L. a" L# u0 J6 A
case ctlcolor_edit:
8 F* c5 p) J6 R* b* x4 c break;9 j& m' i" c% g
case ctlcolor_listbox:
: }# k% e1 Y# e, B, \. F if (listwidth > 0) {
5 ~6 Y. b0 p7 Z+ F- W // new width of a listbox is defined
* u# F7 B5 o/ H6 {; t* @ CRect rect;
% w2 ?4 J9 w( Z- \4 T! [ pwnd->GetWindowRect(&rect);( _3 o6 R" J) L# o7 A- Q
if (rect.Width() != listwidth) {
: t1 e! W3 ]/ e) \ rect.right = rect.left + listwidth;
5 s/ x. g' J' u2 a1 ^/ K/ X pwnd->MoveWindow(&rect);
4 |, U* ?5 f4 }. O4 X2 @) L }. O9 F5 j/ ?* ~4 a1 G$ C+ m8 _; N9 f
}
7 P/ ^+ x8 X7 x& W4 h* {3 ]8 {) X break;
7 I, m# Z( \8 a7 s }
$ V0 R" ?$ y, p. j) l. o, ~% [, \' ^ E( [# Y
// todo: return a different brush if the default is not desired
/ f8 u4 B& F$ w0 D+ ?$ I return hbr;) b/ @. m K9 r7 _. `! j4 I
}
& n2 S5 y! K$ X/ F" g
* w& c8 n+ T3 r% J! \& o- @
2 d! t1 {! Q; I 这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。3 `4 _3 V8 @' o0 Z8 ~+ ^
+ _3 z; h2 R- p! [ 上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:
% S% [9 L; }$ u. ~' v6 Z- y0 a* G' W2 a; j' X) j5 c7 }! E
CComboBox::SetDroppedWidth(int width); 0 E% `9 z; l3 J" `; n
+ j3 w' E4 \1 Y# }: V* h0 x; M: O 通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值:
2 w& Y# b* x: C
8 Q8 T1 l- j5 x, E 1.你所设置的值(就是通过上面的函数所设置的值)( t5 \* n' n/ C/ G! D p( b8 ]
& d- {2 k9 Q5 l0 s
2.列表框的值 |
|