找回密码
 注册
查看: 5266|回复: 0

在ComboBox中改变列表框的宽度

[复制链接]
发表于 2004-2-26 19:37:21 | 显示全部楼层 |阅读模式
在ComboBox中改变列表框的宽度 6 n/ {1 E  E0 c1 P4 K: ?; T! f
# @: s, V/ N8 H& o2 Z, T
2002-03-07· ·贾旭滨(译) ·· * R5 I* n" r% m

1 |6 s2 i/ S0 y, \
+ E) V6 E; w8 V6 x  我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。 ( F: l4 V8 |. m
  为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:& H0 x$ I1 C: I( Q- G8 i' e+ V9 o

, j( b( V8 ]: V, H8 D4 M7 A! g# ]HBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor)
1 @- m# M4 L- I  i' ?{
5 w$ h) C5 E9 U, T6 @  HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);
* L3 n6 z8 h+ o2 C, H  switch (nctlcolor) {( r  v3 U$ J( F9 H
    case ctlcolor_edit:- F3 Y; Q# F; \9 r9 G. E' e- `# g
    break;
8 v5 F, V/ t) X" G   case ctlcolor_listbox:
* K1 Y6 R# r2 g& E4 p% b8 T8 x- w    if (listwidth > 0) { 3 Z) V3 G; F  p( a( s4 s
       // new width of a listbox is defined7 \+ F. k" g7 T* Y6 X$ O, L
       CRect rect;1 B& w& i& [, o2 t6 {
       pwnd->GetWindowRect(&rect);/ g! D3 P' E6 r1 R
       if (rect.Width() != listwidth) {
. ]6 o: G" |/ q) A$ B3 s& e' |        rect.right = rect.left + listwidth;
; m3 z' b' q4 T; @9 }/ d8 z6 a        pwnd->MoveWindow(&rect);+ g/ @3 g0 U5 W" C" Z
       }7 u* \( N- I. ?; K
    }
5 C# o9 b7 N7 A. U8 k4 l$ s    break;
; z; A0 \- K$ `- v   }, s; o! r7 l1 v1 b

  Y! s1 w. ^+ I) f   // todo: return a different brush if the default is not desired
5 ?# }# I, ?& f6 S& H# \& w   return hbr;
3 e* D! ?) e! d+ w( Z7 V" k0 ?}
( w# w  I9 P  r2 G- I, z
/ X( q/ m6 g% Z! t& A
1 U4 \0 Y+ a# `2 S- p  这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。
9 \2 k% {# e4 j6 ^
5 R6 k+ _( l9 y% d! d! ~8 o  上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:
$ q! Z$ {  C) m# V9 m6 U- p5 B& ?
( T5 G( a  z3 d; k# j( ?CComboBox::SetDroppedWidth(int width); ' N0 A  L3 Q2 L8 O  ?+ T9 @

4 A7 f" B; [7 v  }4 H+ m  通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值:   
# B* r9 |. p+ z6 b0 P8 K/ H8 k3 \1 Z
+ w3 p- _6 Q" s, d" T5 R  1.你所设置的值(就是通过上面的函数所设置的值)5 l# U% l) b+ T8 T0 Y# h
3 U" ^: ?, N% s! [( n
  2.列表框的值
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-2 04:57 , Processed in 0.016024 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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