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

在ComboBox中改变列表框的宽度

[复制链接]
发表于 2004-2-26 19:37:21 | 显示全部楼层 |阅读模式
在ComboBox中改变列表框的宽度
  r5 a6 p1 H* {2 A( C0 R7 v5 i8 `5 e5 q+ q- U3 Q; t+ U/ p
2002-03-07· ·贾旭滨(译) ·· : n- k! @& u: B% N

- b7 b7 J2 N  x2 X! [/ m6 S
+ \' U2 y. o2 U. `  R' e) @  我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。
# o1 J, g) S; [4 I0 R) m% U  为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:
* g6 y' U  a' k- H2 Q8 l7 Y
+ U. m& G9 t  }HBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor) & Q& D) o6 G# e' C# L( N
{) \' x6 G6 u: J, T2 m- K: m
  HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);' d/ E0 T' s5 o( T! o
  switch (nctlcolor) {
* N3 `: j' d! c+ O4 t# V  T& M5 m3 O$ c    case ctlcolor_edit:) B: F, _! d' m( z
    break;
( c( B) n* b! A   case ctlcolor_listbox:
8 S- a/ O2 g* Q    if (listwidth > 0) { # k( S: V' r, a8 {+ s
       // new width of a listbox is defined0 {' a8 U& r( |  b2 m
       CRect rect;
3 c) F5 y# s2 a& L+ |& l" ^       pwnd->GetWindowRect(&rect);
& x! S  y! U+ y4 m. P7 {& T! N       if (rect.Width() != listwidth) {
0 o: s+ I. ?  F& n: A) S! q        rect.right = rect.left + listwidth;
+ G; b% a" g8 c9 [; e+ k        pwnd->MoveWindow(&rect);: z8 [/ I3 L  a0 }8 ?+ M$ l
       }
( W# D, A6 R5 x, h$ L% g0 Q8 g$ I    }
2 A/ F, g# ]: F7 n" R% l    break;
, s; B( f* L( x% L3 b. b/ i6 P   }
# B. `  K5 [6 q+ ]
* A) V6 ^0 v6 _% ~   // todo: return a different brush if the default is not desired: D  p/ V+ m3 l- q
   return hbr;
1 T. c) |$ }! D9 q! D: R# b}
6 X6 |% U' n/ Z2 j. S$ H% ?1 J
! K9 S$ ]4 U( d( _( U- o+ p" P4 H! f& i3 P8 _" k' w* ^7 t
  这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。
% b, D; E1 S) ]. }% A% t
) \' M3 b% t8 }4 J& Q' K4 j; N  上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:* `# R5 _+ G, m) \* i2 g# _
, B: E! j* r1 ^# @: x/ s5 U
CComboBox::SetDroppedWidth(int width);
9 X# h4 b% j# J1 {6 a) V4 c% B* Y8 B8 R' F; i  T
  通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值:   
* i3 u2 C- q$ H, ], U8 x0 I
! K$ b. h/ |4 w$ B3 z  1.你所设置的值(就是通过上面的函数所设置的值)
" `# N: b$ e) K8 F! T) B, i( |- D
  2.列表框的值
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-15 11:36 , Processed in 0.016198 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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