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

在ComboBox中改变列表框的宽度

[复制链接]
发表于 2004-2-26 19:37:21 | 显示全部楼层 |阅读模式
在ComboBox中改变列表框的宽度 * [% J9 R, d8 A: y  |

" {7 ~' Q( d0 I! Y2 Q3 j, ^2002-03-07· ·贾旭滨(译) ··
. g7 B6 a9 e$ U5 Q/ U7 x- c) ]$ E) k) v* Y$ q6 B& C) o) E

( \) J  }( j; D7 \; ^/ Q  我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。
' B& j- O. y9 V% ?9 A  为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:, F. k& \7 a( \

3 V! A9 _( W* NHBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor) 4 a; I: A, Q5 o1 `' j; M& I* q: V
{
3 W; y/ _7 j6 ]; T" z' H, g3 P  HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);3 w: m0 l; Q9 o; W  S8 f' F- ^1 d; ]3 x
  switch (nctlcolor) {" r7 g$ O" Q' Q7 Q8 O' x
    case ctlcolor_edit:$ c3 X- K) O9 \& X" R
    break;* p4 ]; P8 K# r# q
   case ctlcolor_listbox:* A3 F3 I; h4 k  e% g' E: g2 F) @' C9 V
    if (listwidth > 0) { 8 [4 X4 t- C: P% X0 n8 c4 \1 X
       // new width of a listbox is defined
: J  q; c' B- Y       CRect rect;
2 I0 @: F  o, w0 A( U& L) f       pwnd->GetWindowRect(&rect);
" \6 H  X+ H" N' d6 f       if (rect.Width() != listwidth) {
# Z& m& [5 V% A1 d        rect.right = rect.left + listwidth;
8 W% E( w$ ^8 ~1 l: b        pwnd->MoveWindow(&rect);7 i( v6 |" B5 P+ n4 t
       }
; |3 d2 o1 V% v/ y    }
- ~: y' _& u2 h& r3 c' i# l    break;
4 m6 e2 V" g* Z2 W   }
0 j; E& B8 a5 ~' i  _, t8 w$ J  P, s
   // todo: return a different brush if the default is not desired5 K1 x$ m; M% |1 }4 x2 O; D
   return hbr;& w0 ]& X! Z. Z7 I* _
}
' p4 w. a5 q2 j* ?, \
4 @, n) d* d8 m9 b! @
4 o: a' @! n" m, k5 \  这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。
9 n' T& m% @% U# t, R$ v# W  E. A  E4 w# A, f( L5 ?* ]% z1 q
  上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:
; W6 g; A4 F+ i4 _( s- U: @& z7 `2 ]% H9 G  x0 o
CComboBox::SetDroppedWidth(int width);
6 q& o, E& T+ m7 M4 [6 ?" {: N/ L3 @$ r! B, m" @; Y- v4 @
  通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值:   - V# R( M; E: f4 w7 z+ d

: l; m) J. A1 m. ^6 V6 v  1.你所设置的值(就是通过上面的函数所设置的值)$ H$ A) {! B& \3 y0 h" s, P  L

% u: F$ ~. n0 @  2.列表框的值
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-5 09:09 , Processed in 0.013975 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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