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

在ComboBox中改变列表框的宽度

[复制链接]
发表于 2004-2-26 19:37:21 | 显示全部楼层 |阅读模式
在ComboBox中改变列表框的宽度   v6 Q8 X7 `" t! }

, Q5 w6 y9 {2 ^; H- _2002-03-07· ·贾旭滨(译) ·· 1 F8 W, N3 a; J
( _. Z# r$ m0 ~) U1 P9 R

# @* k" F2 e, o' }0 @  c  我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。
; Z) d) @) l- T' r1 I  {  为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:
6 E6 _+ ]1 v  R0 N  S$ j: z+ O! o# |  J( }
HBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor)
6 L5 |" F9 ]  p0 L* S# c& V{
  F: }- q0 r. ^, o* P7 O  HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);
  }" ~- r' X. s* P  switch (nctlcolor) {
, ]4 @+ L3 M& w; Z" ?( G$ ]3 A    case ctlcolor_edit:9 V5 m1 r& @* V' k" P
    break;  x! N" w. B2 O/ ?8 L
   case ctlcolor_listbox:
/ A' A" h/ Q$ t/ t9 H  N( y5 }    if (listwidth > 0) {
7 Y# g3 {* ~( H: u2 p+ h       // new width of a listbox is defined* c: t' q$ g# b- R: O, E
       CRect rect;3 K2 v! ?' x) ]
       pwnd->GetWindowRect(&rect);. E/ W/ ^6 ]4 E& }9 C( _  K
       if (rect.Width() != listwidth) {
/ z0 i3 `; ?( j1 g& Z3 S1 _        rect.right = rect.left + listwidth;$ m. D, ~( `) m7 H7 l  L" X  L
        pwnd->MoveWindow(&rect);& s" [; x/ @. y& w
       }
1 C3 |6 f( [4 [; |) _2 L; S0 t9 e/ I    }
+ o$ M; F5 Z( J, v    break;, S. [4 `2 g+ y" w: m/ X+ Y
   }
$ F) A# G- E$ M4 l8 T$ {( F- [; n7 I; Z+ Y9 k5 L6 ~2 p. U
   // todo: return a different brush if the default is not desired
5 O7 @+ x+ l3 }% x! E. h) p   return hbr;: H8 W/ W# Y" N0 c5 d
}$ ?, r$ k  d% r& ]

3 f- @+ ^* `9 y5 `, y" p8 k0 p4 P/ T% S4 y) s& |
  这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。
8 Y# r4 E7 p: h' ^9 y; D) v: Z+ A4 [( m$ M/ r7 Y2 c
  上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:
! x* ^$ c0 B2 J% i! d3 B7 P+ Q! k  T: V( r3 ]/ Q6 _% C
CComboBox::SetDroppedWidth(int width); + Q& Q6 h4 b' h4 B

, V5 c8 D: ~6 o  通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值:     C$ m% n4 u, r$ P7 |

" B6 s* ]- D2 k3 C8 P& S+ }  1.你所设置的值(就是通过上面的函数所设置的值)
5 |, @: Q& Q  M5 t
4 d/ a* h+ t; u6 E  {, v  2.列表框的值
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-8-9 03:29 , Processed in 0.034250 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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