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

在ComboBox中改变列表框的宽度

[复制链接]
发表于 2004-2-26 19:37:21 | 显示全部楼层 |阅读模式
在ComboBox中改变列表框的宽度
+ R* `1 }$ r4 U, T. Q; }) N6 G9 {% `
2002-03-07· ·贾旭滨(译) ··
5 L8 K7 N4 k! i( O- }6 q1 u
( r* D3 W8 i+ z
4 D, O) m7 M" n9 `, h3 j4 Z: Z  我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。
' j$ ]% y" e6 |) m, A" o5 j  为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:
6 w9 w0 u! G  R8 s' z# c5 m' G6 ^5 ]6 g3 W+ w2 q( N8 u  F& ]
HBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor) " m5 B# L- J( F! u: U9 W! O; E* \5 w
{
& H5 [5 o0 \1 P) c* ]% D$ V  HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);  I8 u9 p$ P/ h8 ^
  switch (nctlcolor) {
7 g, ], k% h9 y$ r    case ctlcolor_edit:0 p7 d' Q  c3 |
    break;$ s! c/ Q0 ~  m* v1 r' a% N
   case ctlcolor_listbox:' _) l4 O* t, Q; ^6 U! o
    if (listwidth > 0) { , z; E/ a5 |4 s$ h5 Q
       // new width of a listbox is defined
) r! [* t4 l- a3 C4 i       CRect rect;$ J1 ?0 |# E  h' l
       pwnd->GetWindowRect(&rect);
/ A9 |6 X0 ]/ G+ F       if (rect.Width() != listwidth) {" F2 \# G; K) P) N9 {3 u) n; }# S
        rect.right = rect.left + listwidth;
9 T/ G, Q7 n! [0 F9 t2 o' G        pwnd->MoveWindow(&rect);6 q; C: i! {0 U$ A5 P) N$ y+ `/ _1 F
       }
9 |) ^  y! V0 g* |, G    }
" ?- V9 }8 R# x5 p+ X, A0 T    break;
6 j  n; k- ?) L: p* N+ u   }
7 N$ q$ I  i* m' ~9 `3 Z; |8 F
9 Z; z) h; F. A9 T# A. g4 v   // todo: return a different brush if the default is not desired' s; a; b! f! L6 I4 S3 c  a* k
   return hbr;: Q# F0 e8 G- K: x0 l
}9 D6 w# [) J* C2 ]0 x
) X$ o) @/ u- |' u

+ D; o+ @" V% ^; ?; J( T( Y  这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。
# D2 U' C' ?9 W$ J9 C" ?- X2 g1 }9 |
  上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:
1 i: f& k! C9 z1 F8 L$ l) S7 s
1 [( u/ k0 p( s; R! nCComboBox::SetDroppedWidth(int width); . G( \" G% y- v9 v

1 G( P- q$ z/ l, U  通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值:   
; P) G0 W$ y3 V+ `
7 t' e, k2 [, w* A0 L+ S# l  1.你所设置的值(就是通过上面的函数所设置的值)# L4 a9 E2 |+ {5 v/ G5 o9 b

/ M/ Y" p; l" ?4 N2 _  2.列表框的值
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 08:42 , Processed in 0.021264 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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