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

在ComboBox中改变列表框的宽度

[复制链接]
发表于 2004-2-26 19:37:21 | 显示全部楼层 |阅读模式
在ComboBox中改变列表框的宽度 + R, }" t" a6 t0 N, u  D

% E2 S0 ]3 d) M  u1 ~2002-03-07· ·贾旭滨(译) ·· 9 \) B+ P2 g: C9 X4 m# C/ l  Y
5 r+ E3 r$ x& [# o; e

2 y1 o+ ~+ M, s2 n, M7 }, C& ^  我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。 3 n5 i6 m5 _: l7 [
  为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:- _) e. x0 j+ x% Z" O0 {

. `7 f. S% |4 Q: y# |  kHBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor)
  q$ M% M1 t2 t: U{" t/ M: m% t& s$ p
  HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);
' X1 R5 G5 e' j  switch (nctlcolor) {
2 Y2 S: G4 O$ P5 z# I6 g    case ctlcolor_edit:2 i8 K) o2 [5 [) q: E: U
    break;
) |% A; o- L0 i' G) f+ I   case ctlcolor_listbox:3 i0 `6 p0 P. O( t0 ]* W* `
    if (listwidth > 0) {
. g9 v  N) G; N8 \       // new width of a listbox is defined
; Q( c7 X0 f* q6 f       CRect rect;5 U: O  M5 J0 B1 m+ U
       pwnd->GetWindowRect(&rect);
& [2 A5 i  E% C# }% j6 X3 S       if (rect.Width() != listwidth) {
/ [% R9 [$ Z/ ]) T        rect.right = rect.left + listwidth;* N$ Z/ c, _6 i& ^
        pwnd->MoveWindow(&rect);2 s. m- b6 S" ^3 c0 O
       }
( l; J3 l6 U; I7 K0 ~' y0 j    }
3 n6 M$ f" x2 m+ h) C- N% D    break;9 \' ~5 z* A4 ?
   }- @, M7 ?: }; i# k4 |, K

8 x; R/ x, k' K1 L7 q   // todo: return a different brush if the default is not desired4 u* s, J1 p/ @  [
   return hbr;
- B. A: T" E& M, U}
' ?# ]6 G6 m* @$ j% j2 j; n
$ h# F0 L+ b/ |' N$ w: Z" Z1 ^
# ^" t5 _- V. p* J( b6 ?  这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。
  u# j1 G3 F2 P7 o) }( K
! ~# r& F9 w3 b  上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:
* V% L( a6 W% T8 m* }8 e& I+ v& f/ w  X
CComboBox::SetDroppedWidth(int width);
) s! l* W7 o& ^+ P5 ^* d; Q3 B( T1 V. `0 ]0 s& G8 i. r" l
  通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值:   
9 d" b% L5 j! C# i# K( y! c" @$ X) W% L& [2 b
  1.你所设置的值(就是通过上面的函数所设置的值)4 G+ ?* p1 P5 m# F! G4 ]
0 V% b3 {0 N+ G# Y' G2 x# ]  e
  2.列表框的值
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-29 22:21 , Processed in 0.024212 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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