找回密码
 注册
查看: 5265|回复: 0

在ComboBox中改变列表框的宽度

[复制链接]
发表于 2004-2-26 19:37:21 | 显示全部楼层 |阅读模式
在ComboBox中改变列表框的宽度
7 w& p/ R& z9 D# ]( h- q. q  ]+ C% B
2002-03-07· ·贾旭滨(译) ··
! {2 q3 |' {6 D4 i
2 f: `2 d, I$ |7 ?" |! n1 \" y4 A% s" D7 H0 f0 Y
  我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。 ( j; y- o) t1 T1 }! `# b
  为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:
# j% l2 L2 w  _: ~4 U" P" K5 i
5 z% z/ _% \4 u( \7 y, a+ gHBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor)
* k3 d) `' H- Z' a8 G/ |! C{6 L+ x' v7 }4 u; C4 K
  HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);# F  g5 r4 x! v" Z
  switch (nctlcolor) {! g6 u) _! D2 D& j
    case ctlcolor_edit:
3 z8 Q, O- c3 q  _) U- C1 d* {! q    break;
# V8 ^+ |9 B: n& Q+ d" Q   case ctlcolor_listbox:
$ Q2 P5 q& B* m1 l    if (listwidth > 0) {
9 {; R# O5 J5 G+ H, Q. `- M       // new width of a listbox is defined
8 M4 k/ b* ~1 q. w" j       CRect rect;
% \8 @9 H5 C" ]) l8 Q8 `) W0 v4 w       pwnd->GetWindowRect(&rect);
9 f; p8 e  ?, G. G4 t& m9 r       if (rect.Width() != listwidth) {1 B1 [) {* u( H. Y3 O* D! Y
        rect.right = rect.left + listwidth;5 a1 F9 p, H# b- v( u% V
        pwnd->MoveWindow(&rect);
7 u5 B+ m8 b: h; g" o       }
5 B9 H' I; g. W) _2 C" R; P" r- a    }; n" l+ f+ n0 P2 `$ M
    break;
4 ^+ g9 v4 Q9 x* z  {, f   }, J' z: e# k" ~$ ]/ W
9 {( b4 S+ d# n( D# \7 m/ \6 d
   // todo: return a different brush if the default is not desired! s  h* W% A9 l. |6 ^
   return hbr;4 t) y* t6 G8 T  r% x9 g
}: @1 I  B7 h$ ^/ k0 e; O
( o+ D/ A" [5 z
+ {3 g8 s2 R  n" m) U
  这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。
* Q& d( @! o. M0 X, E4 j% o8 [' @: p" }- ^
  上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:
: o, V0 F# w/ v) r" ?3 U. r! L' G
! o9 }0 A: i+ G9 p" gCComboBox::SetDroppedWidth(int width);
0 U* B* J: D, M$ ~. m  A6 }- A$ i( z2 P
  通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值:   ) `* ^! e$ ~( A+ Z" N4 I* a
" C$ U8 K7 O( a8 Q0 T- q
  1.你所设置的值(就是通过上面的函数所设置的值)/ t$ q/ L% y2 h' }' ]5 e

* e( {3 F0 ~0 o/ w  2.列表框的值
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-2 03:51 , Processed in 0.016330 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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