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

在ComboBox中改变列表框的宽度

[复制链接]
发表于 2004-2-26 19:37:21 | 显示全部楼层 |阅读模式
在ComboBox中改变列表框的宽度 & C/ y- b# @( A$ w! I# d/ k3 e/ F
' q0 n! J) ^5 Z  t3 G. R
2002-03-07· ·贾旭滨(译) ·· ' v+ `, _: W( v1 I2 I0 g

: n6 e/ r2 O& a2 w% i0 i* a+ {3 [' V  X
  我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。
: S; o% W5 h: f2 v0 f7 T  为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:7 z- G4 l. g3 v% _" V; P( p2 U1 D8 O9 O

" X0 ]+ S4 C! @) _3 OHBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor)
; j! g/ F8 k, ?7 E8 R{$ A& j5 t* Q3 }; r8 g8 A3 ~5 y
  HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);: W" e1 F" F$ l
  switch (nctlcolor) {% R# j  n- N3 @. ?: e# k% q  H6 u
    case ctlcolor_edit:' q6 Y2 z# L% w$ g
    break;
- V1 @$ \9 H  ^/ l3 A   case ctlcolor_listbox:- e3 [. s% C* y( ^6 T
    if (listwidth > 0) {
: Y2 t; D6 g3 S4 h- P2 M       // new width of a listbox is defined4 ^9 Y$ E+ `8 N$ S" u. G2 q7 R8 I
       CRect rect;: Y- v3 n0 ^# w$ y- f. e, L; L
       pwnd->GetWindowRect(&rect);8 u6 `3 n- G( d9 A# ~) `" h
       if (rect.Width() != listwidth) {
. D) P  A% o; r3 b/ x8 j! r" ^        rect.right = rect.left + listwidth;
5 ~8 q, p% X( _1 D2 Z: u9 i        pwnd->MoveWindow(&rect);
3 _" S+ C- |$ W, w       }
. N2 |3 r9 \* w4 z, `6 R, _) E    }. i; o4 X# m1 k7 A
    break;
  \8 v3 N* ]2 y4 a$ w( k% X# R! ]/ l   }
/ f! I$ ^% E+ [: t/ B6 ], W( h5 |3 w9 w6 z
   // todo: return a different brush if the default is not desired; X7 x5 S1 T' e4 O" m' z. ]5 A
   return hbr;0 \, b2 \2 @+ q  T* a+ t0 J
}( [" n* z; t9 D& n1 Q) ]

- u1 H4 \5 }* e
0 {: {2 g0 v2 s  这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。) T; ^" E% D  L0 `6 [
, J5 \! q" n& G+ h) l
  上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:5 i' O, J; u) E6 \

5 o% k/ j2 l* C, B" w  d& FCComboBox::SetDroppedWidth(int width);
6 }7 ?. G2 g2 @7 z) G; H
) E8 L% t) S6 Y, }; w9 o8 h  通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值:   . G/ m' E/ w0 O  p

/ I& o6 l" j: X0 k, L  1.你所设置的值(就是通过上面的函数所设置的值)0 q/ u( y% ?; O, |# Q
. W6 T% t- W1 ?8 ^, T: e7 [
  2.列表框的值
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 08:54 , Processed in 0.017308 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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