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

在ComboBox中改变列表框的宽度

[复制链接]
发表于 2004-2-26 19:37:21 | 显示全部楼层 |阅读模式
在ComboBox中改变列表框的宽度
- j3 N. Z- c# I9 k# g2 P) L
; I0 q9 \7 M' e1 }2 q2002-03-07· ·贾旭滨(译) ··
/ I" W1 h: a2 H6 b- j5 s5 `5 a8 f  D+ U/ |# l, E& p! k

& i3 s1 h- h: m5 \7 E, ]; q0 a- Q  我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。
" M: C; K$ q* \' x: c, u  为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:
8 o7 `; X* H3 F, A1 f9 U
: t- P" q% e3 Q& K1 e$ b/ zHBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor) 3 W$ y; L4 |7 l8 M7 d7 R
{
* R) _) C" ]* j1 i  HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);7 x* T, O4 n" a/ Q8 e! m
  switch (nctlcolor) {
( O) F- x6 g0 z    case ctlcolor_edit:
! ~. z2 B$ D9 o  e. Z, S; Z    break;1 m5 |$ V7 A* ~! @; I4 G- X0 W5 _; ?
   case ctlcolor_listbox:
; C# ?3 c6 _; a! L3 C$ W    if (listwidth > 0) { ) L: W+ S! Y$ B+ t& Q
       // new width of a listbox is defined  |+ Y5 m( f5 j/ t5 o4 V
       CRect rect;1 c3 ]  x' ?" y9 K
       pwnd->GetWindowRect(&rect);9 [6 {7 O6 E' P) F. x1 b- k  F
       if (rect.Width() != listwidth) {! {- b( ~' j7 N$ l
        rect.right = rect.left + listwidth;7 K/ H, B2 u8 x+ k4 V) ^2 ~6 U
        pwnd->MoveWindow(&rect);
- c6 R0 a: g! V% H2 _       }
4 j; V; ]' f1 a  r% @    }
) y. J% D; G7 B+ D* X3 ]1 R    break;3 `( T% G4 f" R5 H* ?8 U
   }
' y" H% q& d  x5 A' d4 _
) G4 Q- V. ~7 S! Z0 T' h/ W- h: P; {   // todo: return a different brush if the default is not desired
3 S. x( e+ c6 @" V: s, F( z; _# a* \   return hbr;0 p' j' |, \* w' H- P. P" O
}
% S$ [4 [: q+ u1 ?
1 @" n: z: K/ t: Q2 H
3 y0 w9 v0 b" c! r8 g* k, `; c9 n  这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。3 a; J. a0 Q+ F0 ~% f2 u
- v0 K6 \: B( C* P
  上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:
; J, }) g2 H& A& D
) A# f7 x" u- r* t( f7 y2 eCComboBox::SetDroppedWidth(int width); ) T. q+ V# c% N) h
5 {: l1 l6 L' U4 L& u7 }$ K2 Z
  通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值:   
( i" @( l( J7 Z5 L; t
4 R  [1 V* U9 P7 m* k) t  1.你所设置的值(就是通过上面的函数所设置的值)  e) v" j* p, E) v  r
5 _# i9 R8 O1 d. k, b
  2.列表框的值
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-5-2 08:55 , Processed in 0.019011 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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