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

在ComboBox中改变列表框的宽度

[复制链接]
发表于 2004-2-26 19:37:21 | 显示全部楼层 |阅读模式
在ComboBox中改变列表框的宽度 6 z; S8 r" a6 Z- z0 {6 i5 o* W0 Q

! R0 ]8 Y+ f' E; l6 m3 f9 ?  s2002-03-07· ·贾旭滨(译) ·· 0 i1 {1 q! K3 m# h& c/ l8 y  Y

/ q( }# \7 m% {! P  `
$ D& Z) \. e+ w0 ^3 Q( |  我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。
! d7 K7 X9 r  Y2 e( g7 w  为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:
$ @" k1 e1 z: G# ~( o( Z  s5 I4 S$ t1 Q/ f" k4 b; H$ s4 i- p% g
HBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor)
9 J. E' z- {  C0 M7 {% }7 g; h/ b{
7 M% B. i# ^4 i  HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);
2 ?& l9 r- L2 r2 i2 L* X  switch (nctlcolor) {
, k8 x9 \" o. s7 ]. d    case ctlcolor_edit:
* E; M. Z9 U) _! U; p% `    break;
0 s: j, v' L7 E! e7 c   case ctlcolor_listbox:
# H0 t5 n" N# d& ^( E    if (listwidth > 0) { ) D* i+ S, j, m" |, C; z
       // new width of a listbox is defined+ g' f( N2 ?! C
       CRect rect;% u( g! c( u3 x" t* p' n
       pwnd->GetWindowRect(&rect);4 v: z7 l4 [6 Q9 [' \+ S' J
       if (rect.Width() != listwidth) {
7 @3 @7 ?+ J# a        rect.right = rect.left + listwidth;% h- p6 A5 E2 I* v* k* H# M( j/ U
        pwnd->MoveWindow(&rect);1 r$ r0 x: U" R/ N8 ?4 p
       }. u" [, J  o9 |/ v: j: ~$ O
    }# j( J" i2 `( K; \
    break;
$ P8 P# }# d8 a$ i   }
6 y% I* s3 @9 K- p4 w: I) x
4 h1 u$ K% z) w) S; _! p8 Q: a   // todo: return a different brush if the default is not desired! w6 d+ Q# E0 m. @, a7 K/ o3 ^
   return hbr;: x2 A- o# r: L- B+ i
}, b, v% l9 Y) ?7 u- z: W

; q& D5 p1 J; }* S" r
, y( R  K( p9 M' O9 c  这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。
/ i3 M" J$ ~) I# S1 E. v7 O* T8 s2 T1 Z& ?7 ?3 u
  上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:
0 m7 o0 }' p" d& C; f# J$ s7 ^' S7 z. C2 c$ k
CComboBox::SetDroppedWidth(int width); # l! \3 n  n3 J1 A$ y2 V; L* v

/ j+ I9 ]) m: A9 z3 z# o0 d: O  通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值:   
6 I5 k  ~* u6 b$ _+ F9 |5 E6 h
* R+ U; J: D9 m0 S0 g  1.你所设置的值(就是通过上面的函数所设置的值)
# W. V/ Z1 u. n+ g
8 I" u' S5 A4 \/ T- Q' ?  2.列表框的值
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-8-9 07:17 , Processed in 0.033652 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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