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

在ComboBox中改变列表框的宽度

[复制链接]
发表于 2004-2-26 19:37:21 | 显示全部楼层 |阅读模式
在ComboBox中改变列表框的宽度 " e  ?2 ~6 t* A2 c' K
: [5 s) S- b- _, ?0 N
2002-03-07· ·贾旭滨(译) ··
( L- \6 P' H! ?5 Z0 ?' D
, H9 I( R& Q6 w) E/ w1 R: |4 ^( e
9 E2 |& j6 x6 [4 C( {1 h! [! x  S  我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。 ; k3 _# b. |3 r
  为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:( V& O0 |, Z. R' ]9 K- W) J: `
! C* `( _2 W* d4 x2 ^
HBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor) * G+ i; J: H; r/ }: n" U
{
& V% ]+ P. E; Q$ ^# s9 T% v& y2 T  HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);4 P  T) v. g" q
  switch (nctlcolor) {
6 g* r- D% {3 @1 c4 H5 Z: S    case ctlcolor_edit:
7 i$ T5 E2 s2 Q% C. S0 J7 u  ^! }    break;
. B, L$ b% V& i& ]1 F+ |   case ctlcolor_listbox:
# C: N& C/ E3 |& r, _; D1 \2 ?$ {6 z    if (listwidth > 0) { ( d6 t4 i! {4 Z
       // new width of a listbox is defined# E- l4 Y  R) v: H
       CRect rect;5 l6 |& u7 W& n: W7 B
       pwnd->GetWindowRect(&rect);& b! X& V* q+ f6 _  c6 X
       if (rect.Width() != listwidth) {
) t5 F' b0 Q) h5 C        rect.right = rect.left + listwidth;
0 T1 x3 V) f+ }/ i* d# ~4 ~        pwnd->MoveWindow(&rect);4 |, C6 }; C1 A  @. N- P
       }
% d0 a: H( o' O0 D    }9 F7 |/ ~6 }0 g/ b2 J
    break;- r7 c. O8 m3 }( W
   }: x* ^! P' A; O2 l5 v* ?9 C
$ K0 s* U; `2 e5 w6 X3 @0 p# N
   // todo: return a different brush if the default is not desired
: ~5 u; T: w( \3 O' q7 B9 `9 D( p* p   return hbr;
! K/ t8 p5 E+ R! N$ f& P6 w! l}) ]8 j& d2 f; q4 E

& @; a; B  e; u9 g6 B: {/ j& j# K
- f7 j% n" h6 I  这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。
. A: _7 o. w4 Y0 P, W; h$ J
6 ~7 y2 Q, n- p! p0 V5 Z0 o6 b' j: B  上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:0 B. T: _0 X4 t7 T: g

! f& u. T( u4 i8 e1 ^- ?CComboBox::SetDroppedWidth(int width);
2 s( |9 e3 e# I* b7 q2 m
1 e* \7 i+ T: M  通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值:   
& _9 C2 \) {) ?# U' o6 K
' ]" V. _4 A% s% ~) G  1.你所设置的值(就是通过上面的函数所设置的值)- o5 G( V+ ]. D; V2 r3 O

5 D2 t0 W9 }! ]$ H  2.列表框的值
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-5-2 10:24 , Processed in 0.019383 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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