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

在ComboBox中改变列表框的宽度

[复制链接]
发表于 2004-2-26 19:37:21 | 显示全部楼层 |阅读模式
在ComboBox中改变列表框的宽度 & }9 l, p8 {! Y. ^
6 k* C3 C) T; G  O- Y
2002-03-07· ·贾旭滨(译) ··
$ b, _8 O3 b) h2 e! D3 P( m- R5 G$ c, B$ T
0 }+ Y+ h% P- |" y0 `! W. {6 F# F
  我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。 ! b' P) U& h$ r, D4 G# U
  为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:" t2 l$ p" \2 a
' |- C; b1 B" Z. S% r3 M( J
HBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor)
/ Y- N- m" M& W: E. X2 q{& U. V4 r" W& m! i3 @2 A2 m. {
  HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);
2 m5 R3 F! l* ~  j* o0 L  switch (nctlcolor) {
! h. p2 P" L2 T0 r7 L0 A8 p" ~" g  @* V    case ctlcolor_edit:
1 R; h; Y7 v! _4 K1 l) C0 O    break;
% [. f, A/ M% g" v" _/ x# _# b5 Z2 _   case ctlcolor_listbox:# L3 x+ s9 ~% b& r
    if (listwidth > 0) {
# \! W% P0 j# F- a7 s9 q       // new width of a listbox is defined
0 X. u7 G# F0 Y! l       CRect rect;; h7 z; I+ \- i0 i
       pwnd->GetWindowRect(&rect);
- _. |5 I  m  L8 O7 D       if (rect.Width() != listwidth) {
, l4 ?9 Y! M2 _& R        rect.right = rect.left + listwidth;
9 O8 j* V0 k5 G        pwnd->MoveWindow(&rect);* C1 m$ L, J4 @" j. V. N, W
       }: L* D- |6 ^9 s/ ?5 N: B
    }
7 V3 r& R% N7 Y' p    break;8 q2 c, I! ~+ V
   }
; @# q4 J- f8 ^% Z! S
/ B* B6 _  ]8 A- B6 \   // todo: return a different brush if the default is not desired, \( Z9 \/ A$ M& p
   return hbr;
* D  c0 g# G- g9 R2 u* r5 L}
, X8 m  j; H, \, L5 w: T- J# z2 \& R5 B- T+ @
" \! r2 T. z3 [% \8 _( i4 ~
  这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。  D: y+ X2 O2 w3 _$ Q+ V! b- k/ ^4 E

; V- Y! l; o+ I  上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:1 ^$ ^% J1 S% G7 B

5 S+ R# [* \. \6 f' vCComboBox::SetDroppedWidth(int width); + A7 R  w% o) F0 m4 ~1 [; t

9 E- T+ V  Q) e. H" V  通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值:   $ c* r2 v! |5 p* ^- N9 J2 j
% X0 E, r  |5 c+ Q, I& V* e$ Q/ t) M5 p
  1.你所设置的值(就是通过上面的函数所设置的值)
! P  \: F5 ?  \# V% l# J
/ z/ G$ s( ]1 f" w: i: S- U  2.列表框的值
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-8-9 04:07 , Processed in 0.034078 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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