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

在ComboBox中改变列表框的宽度

[复制链接]
发表于 2004-2-26 19:37:21 | 显示全部楼层 |阅读模式
在ComboBox中改变列表框的宽度   r* f$ c% P9 D5 `& O
* w" c2 _/ J3 i8 [+ [: @5 e$ O
2002-03-07· ·贾旭滨(译) ··
7 N. ]9 O3 s3 d" d% b- ?. f2 _7 c: [6 \) L* {

6 I6 C6 U, X' T; }  我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。 , x8 l/ p3 }  }5 n; V- L
  为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:
+ {- S; a) b+ ?, e4 r1 u0 |" A
4 v( ^" E, b+ z' l0 u  G1 iHBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor) 5 \. H% H/ _( m. S0 X. o1 o- @3 Z0 q
{* K" V% C/ i" c$ S" t
  HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);( Z; P( R* g& A8 P9 w6 X
  switch (nctlcolor) {0 [. v6 {9 d- J9 q6 o7 R4 T
    case ctlcolor_edit:
7 D8 Q' c/ I& I6 I    break;
4 `! `" C' q" v1 K  d8 p   case ctlcolor_listbox:+ _6 h4 Y5 V" V2 Y4 Q
    if (listwidth > 0) {
$ V* @& I* o9 f  q) J4 n8 f  v1 @       // new width of a listbox is defined* C# T$ w# Q' V1 n2 {
       CRect rect;4 Z- |' e7 k7 ^# B3 j: m
       pwnd->GetWindowRect(&rect);: O2 o3 i/ k, z* K2 R3 h; f
       if (rect.Width() != listwidth) {8 w. l6 [7 [: r0 d1 T# {6 W
        rect.right = rect.left + listwidth;
- P7 \9 \6 Q9 \3 z- Q        pwnd->MoveWindow(&rect);% h% M- r$ l$ W4 v$ Y
       }
$ X' L' S; |- E3 K; N, ^$ f$ ?    }0 }+ B# n0 _5 C
    break;
( X& z# \3 M0 D0 D& }) ~   }* Z; p# l0 C6 A# _4 d- {/ p
# H$ G% n! E5 X* W, P" d0 t  [
   // todo: return a different brush if the default is not desired
6 @9 s( \% _2 l2 v9 Q   return hbr;3 ]4 ~% @+ o+ i; Q6 c
}" d+ T5 j/ Z5 V
; ~) m! R$ G& j0 j
6 C( b" V  R9 J) J5 J9 [
  这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。
) f8 ]" f" C9 }/ o. U' e' g6 k# G' t
  上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:
% r/ k- N5 e- z0 {3 C& T! n9 I, j8 V' X6 ?9 g9 ?
CComboBox::SetDroppedWidth(int width);
7 X# M5 g/ ?" w: m& U
9 H" Z6 ~- ?' k4 b/ u  通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值:   
& I3 f: i: S9 r9 I9 D& f
" c; H- k3 K, L: u5 r% O  1.你所设置的值(就是通过上面的函数所设置的值)
$ Q' b5 {% J/ t: m. c2 J$ S6 t5 H+ }. `% X) c7 D6 J% x* |
  2.列表框的值
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-29 20:00 , Processed in 0.019125 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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