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

在ComboBox中改变列表框的宽度

[复制链接]
发表于 2004-2-26 19:37:21 | 显示全部楼层 |阅读模式
在ComboBox中改变列表框的宽度 . E6 x6 [9 j3 h7 x3 P! f

* H9 K% X6 k, K2002-03-07· ·贾旭滨(译) ··
9 w. U- Q4 p' g" n4 J& w$ F% o1 ?
' N* D% H# r# D: V
) @" Y0 Y9 z) {: P( P  我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。 8 k3 _4 ?: c+ s$ U$ |; d, x9 P( f
  为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:& r7 r: F- X( ~6 @

2 {+ P! r1 a3 rHBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor) 2 S; u' K$ a2 d
{
7 n3 I2 w' C+ v8 M0 S  c. m  HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);: v5 ?4 ?8 j# c  R7 K
  switch (nctlcolor) {
6 s- i/ ], e1 Y  T: N" L! j    case ctlcolor_edit:6 Y  s* }: a4 U* g: e% y  N/ F5 ]
    break;  q/ G4 \: D( W6 N3 P9 d& }8 q( t
   case ctlcolor_listbox:! B4 C# m- ?! ?' D1 h% M
    if (listwidth > 0) { * i& O" f4 g' {. x3 O! T
       // new width of a listbox is defined! B: }- g; H1 f
       CRect rect;+ z* l! }+ O5 v- |' A0 D# y2 N
       pwnd->GetWindowRect(&rect);" l, R2 Y0 c8 {% P+ \4 h# X0 n
       if (rect.Width() != listwidth) {( N* j  \( x- r; G
        rect.right = rect.left + listwidth;
  t3 T' x- ?' ~8 \2 C* x        pwnd->MoveWindow(&rect);" H& ^* Z4 G" g) X1 q& S
       }
- _0 u% k6 t+ ^+ w' C7 p    }
# P2 G) _2 \3 T; }" l' m9 j    break;
: _& u+ ?9 P6 o6 a4 O' H6 @- l) f   }9 d; Q# Z( c2 b+ [. @6 W
6 j9 F( k0 P, _6 f& c% s
   // todo: return a different brush if the default is not desired/ K! m0 |4 U- b  B
   return hbr;% B, w. w7 c9 E, J! t6 z( B
}+ A% C& m0 ~# k+ F! N4 q: M

" b! C; S& s  M8 X1 ?% ]! X: N2 _& K
  这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。
$ {- a, ~+ x0 I- O4 ?) q* k( v+ K5 B$ L# T8 A9 u
  上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:
: V7 Z  Y7 U. |: `4 V8 J7 n) K* {" U$ [1 m/ ]& k1 R# b
CComboBox::SetDroppedWidth(int width); * Z9 ~; Y3 j0 N) s* P4 R, ~1 I6 u
3 Q1 V% W% D8 R# t9 h8 a5 y' M
  通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值:   
# d# e8 \: j# f$ J$ N7 Q+ o5 [8 A0 R6 r1 r/ g2 N
  1.你所设置的值(就是通过上面的函数所设置的值); r! m  F& b$ u& j9 B; M4 [

- H$ Z2 p8 t4 W, ], k3 H  2.列表框的值
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-13 10:29 , Processed in 0.017384 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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