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

在ComboBox中改变列表框的宽度

[复制链接]
发表于 2004-2-26 19:37:21 | 显示全部楼层 |阅读模式
在ComboBox中改变列表框的宽度
# D* Q% |- |# b8 u" D' V
' z; G& b- ?4 H: O5 O2002-03-07· ·贾旭滨(译) ··
) O8 I( q, q  {0 l, C4 ]5 X, M% Y. g5 _. a+ N* A& t4 o

4 g* I# r7 l! ~1 \& U  我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。 0 A  B' I9 ?- h5 S; l# x& b4 p
  为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:, S9 t5 D* q$ G6 V
  I. b7 G9 @9 M7 ^7 L
HBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor) 2 U  ~7 T  z/ N, D6 ~# c) h, _
{& J* ]0 E) q% D) j9 x' R
  HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);# P/ o9 C6 K. E* ]
  switch (nctlcolor) {# l" F& k/ A  O( ^! q) _: z
    case ctlcolor_edit:
' L  x" W2 m8 H0 J5 C% e& R. X    break;
4 i! m0 g! q% w& ?$ p( n5 J   case ctlcolor_listbox:' K3 _; V- r, _
    if (listwidth > 0) { + R+ W" Q* Q" r$ F& e" x7 J  ^
       // new width of a listbox is defined, m; p+ A6 K9 z' E* G$ o. ^6 ^
       CRect rect;
( W% N: v: e+ B6 o  ]1 Z' c       pwnd->GetWindowRect(&rect);
! K) Q. k1 X' R  A  ?8 o       if (rect.Width() != listwidth) {& E7 d) h; W" J" H, o& ]* r
        rect.right = rect.left + listwidth;: r1 O( E( r7 C. Y
        pwnd->MoveWindow(&rect);6 A5 a) C2 A1 n) [. J- l
       }
5 l" r7 ^, V# H9 w5 i) U; {    }
5 `0 P# p) N/ Y9 C    break;" {: X" [. v% @, _7 h
   }
4 f- Y; t0 b. B0 S' H5 R6 `! ^4 S  W, R8 P
   // todo: return a different brush if the default is not desired7 X, C* K$ F6 ~  ~2 m$ y4 ?
   return hbr;0 ?* d: A, A; T- Z, q  V5 S0 v
}
, k; Z" J8 q& \9 k6 A/ C5 r+ S! ^
+ @7 P+ L# _$ |3 q% V; d( Q" C8 @+ i* h( P: Z
  这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。, Z( ?3 @1 J* ~1 p8 q1 D, `

, L3 Q9 n6 k3 }2 C, c* ^0 p  上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:  h! s0 F* r: N3 I" A1 J

  \( s5 M( l& ^) c  O4 e0 HCComboBox::SetDroppedWidth(int width); 9 ]) c% H5 P4 r4 e. c% E4 K

5 t( x+ p' a9 M, |0 Y& s  通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值:   $ J5 V# D0 j3 }$ e% y
6 r  k5 E; u7 y% O8 x7 P# R
  1.你所设置的值(就是通过上面的函数所设置的值); n& M7 Z3 X; M

; T- o* {9 {) A8 g: n+ [2 F7 W  2.列表框的值
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-2 06:53 , Processed in 0.016626 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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