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

在ComboBox中改变列表框的宽度

[复制链接]
发表于 2004-2-26 19:37:21 | 显示全部楼层 |阅读模式
在ComboBox中改变列表框的宽度 8 I0 {7 ?" f! x" t8 J! ?
7 m7 [3 X5 {. T6 N( n
2002-03-07· ·贾旭滨(译) ··
+ h: G7 H! h  o  y8 E0 k
1 K8 f6 r! g% o0 ]4 \# ]
! u5 ~; Z* Y/ b5 @) z  我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。   T- @) b9 ]6 M' Z: v& u
  为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:
& X( S$ h" c% _) t2 R/ r# K& P& Q, X) Q) n  ]  k( S
HBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor) 8 a$ u6 c0 R" T
{8 W! ]7 @/ m7 F% s$ \
  HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);
0 A) g7 |4 W2 u% s  switch (nctlcolor) {
/ o/ r, u% L' k* k* ~7 ]    case ctlcolor_edit:
0 E: j- A/ S7 x! t# E' `6 |    break;
8 G$ o% J7 I; [$ c3 ~6 i9 O" g& `   case ctlcolor_listbox:
* b/ \. n7 A6 Y; ^% M2 x3 k7 \& R3 Y8 ]    if (listwidth > 0) { : |4 L  }1 Q0 G7 e
       // new width of a listbox is defined
- I7 {; t& E: T- D1 w8 R/ `6 M) v       CRect rect;
, p3 q3 n" \+ w* K       pwnd->GetWindowRect(&rect);7 |! X' t$ P0 w% X
       if (rect.Width() != listwidth) {
+ U- {8 j% w0 {% K4 D% z% r9 U        rect.right = rect.left + listwidth;
" V1 o! D+ r5 z' y0 G" B% v* r6 l        pwnd->MoveWindow(&rect);
/ c7 M: p/ J" [+ ?) l5 B       }$ H+ O0 |, W2 ~8 M
    }% U9 p2 a2 F, N3 F. L/ X) i- D
    break;
! J2 }* d5 Y- k   }; f# a  G6 b/ K! O

* i4 F+ H! D5 Y( P* O! t6 ~& j   // todo: return a different brush if the default is not desired
1 G1 J5 C9 \. l5 r5 n+ n% x9 s   return hbr;
# k* r" u8 v/ h}
1 L& L% w+ A1 C6 }6 C' Z$ k2 v5 O4 E& _8 q
6 Q5 q) H! H% x* R- B, Y
  这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。
  k. k" O2 l1 ]
/ {4 @9 n  Y. y) |0 r8 u" N( @" C  上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:! ^' G: T( v* M& i  g" v- Z8 M
5 `# q/ P. A, J' W9 [& K# o
CComboBox::SetDroppedWidth(int width); : r  f  b4 k% d& A  Z" z3 E/ O* E9 X
' [+ ?8 _; y) M* c4 G% s7 _) W1 j
  通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值:   
( h: B5 X6 N, m, H
& P" i# K) v0 q9 n$ i7 G  1.你所设置的值(就是通过上面的函数所设置的值)
: L; S2 F' P: g' M$ n; v
6 P6 ]7 j! E+ P- Q5 s: N+ D% y  2.列表框的值
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-9-30 09:02 , Processed in 0.034058 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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