找回密码
 注册
搜索
查看: 4722|回复: 0

在ComboBox中改变列表框的宽度

[复制链接]
发表于 2004-2-26 19:37:21 | 显示全部楼层 |阅读模式
在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.列表框的值
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2025-5-5 04:59 , Processed in 0.014153 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表