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

在ComboBox中改变列表框的宽度

[复制链接]
发表于 2004-2-26 19:37:21 | 显示全部楼层 |阅读模式
在ComboBox中改变列表框的宽度 5 z/ t5 B2 a7 K3 N
" ?( Z1 r5 g! x3 [
2002-03-07· ·贾旭滨(译) ··
! l8 H% k. h4 x7 Q# H
9 A$ s8 V$ g  F; x$ H) j* G1 }. t2 x7 W9 G' p8 q5 Q' S8 I
  我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。 4 x, l1 {. p' B; U% a' w
  为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:% r8 d' L* _6 i3 q+ p! ^

) ^8 L0 t" ]( H, h6 |HBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor)
3 e" A& `/ A& H9 Z{: J3 A5 K1 }% `  S% x$ d8 y' W1 k
  HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);
% }( ?+ e/ |2 m  switch (nctlcolor) {
. s$ w: B+ A, ^: g* o    case ctlcolor_edit:" _' d# M$ p% }; @) I9 a5 I0 l
    break;0 g" }; {" C9 H+ }2 z. w% R
   case ctlcolor_listbox:5 d: L! w" K7 w1 e1 g$ p
    if (listwidth > 0) {
, y/ y/ h2 Z0 ^8 k       // new width of a listbox is defined, l, U3 [( {1 z3 ?: m- S# Q" a
       CRect rect;
" z6 |8 {4 t  W       pwnd->GetWindowRect(&rect);: ^: w3 s" ~5 `1 N
       if (rect.Width() != listwidth) {; z5 S7 \2 \+ Z/ C, r" N) Z
        rect.right = rect.left + listwidth;
6 {) ?4 _" m+ `0 Y0 N) b" L/ r& C- L        pwnd->MoveWindow(&rect);
  ]1 o9 v5 D) I2 Y; f       }; X$ ~7 E% |0 z
    }# K, t" Y1 l, ^8 w
    break;: H! N7 D) g- y% _
   }  f3 t5 {! U$ n! G0 m

) C! W. z9 Q' z( e! _   // todo: return a different brush if the default is not desired
6 F6 F3 v+ z6 S% Z9 e& f   return hbr;
5 E: A0 c$ ^; l- u}
- M5 v* F  f8 Q, c' W' O" T- G# A0 v% B
1 I6 B9 h* a- b
  这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。
2 s  k$ \- L2 G- v% e1 Y# W  T& e9 g) r' o: N4 z
  上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:' _, K; M8 m& M1 _
$ J" ^8 S4 w( l0 J& V( e
CComboBox::SetDroppedWidth(int width); , [3 @& k1 T! B" J

8 D. y2 `# X+ F4 a  通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值:   , J* M, o- C: M5 E1 i0 k5 I. Y4 t( v
5 L! F* K# l) q/ A9 R6 Q
  1.你所设置的值(就是通过上面的函数所设置的值)
) \1 _+ b; B/ l
+ g; V5 S4 S4 c: f- {9 z4 O  2.列表框的值
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-6-19 08:16 , Processed in 0.014669 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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