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

在ComboBox中改变列表框的宽度

[复制链接]
发表于 2004-2-26 19:37:21 | 显示全部楼层 |阅读模式
在ComboBox中改变列表框的宽度
* h2 D$ W8 V; x4 w5 u6 B9 I, o6 l' i3 W5 _; s+ g  A* b0 n' J
2002-03-07· ·贾旭滨(译) ·· $ m$ T$ y/ F+ h5 }( X$ H

9 |! _! D/ i( D0 c
  ?/ M5 U1 V0 w' I: ]  我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。
/ x" R3 L. H! z- c6 c: F+ ]" c  为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:+ L) n, s' r" t/ Z8 ~) z8 G

5 r, X7 H/ K% i! ^$ zHBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor)
) Z0 s: a$ _+ ^# s& a' U" S{1 D& U7 D; p' `
  HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);
+ f$ t" w" L& ^9 P  switch (nctlcolor) {
. h  p2 _. z# a( _6 s    case ctlcolor_edit:
' I0 f7 q/ s# ^3 J9 N. L    break;, t% a/ Y0 ~3 w) S4 }& g5 }
   case ctlcolor_listbox:
! I" G4 U7 B  Q4 O    if (listwidth > 0) { # J  l) Y' @- U/ R6 |' H8 Y" u  m
       // new width of a listbox is defined( r9 ~6 r4 C( Y- P" {
       CRect rect;9 T: _! ^4 g- F* R4 l5 M/ Z
       pwnd->GetWindowRect(&rect);
( ~% `. a8 x6 o. s- l9 a       if (rect.Width() != listwidth) {$ ~" {% e5 f& R9 w; \+ }$ F$ }
        rect.right = rect.left + listwidth;0 n4 _4 k1 A1 C' C: O0 O! P' d3 c
        pwnd->MoveWindow(&rect);
" e4 j" r6 _" l' P: J. G& J       }. L( M/ H' j, B# F, T, c
    }
( ]! b) m, u4 Q; G    break;
' J8 g  W) B; z* o. Q3 c   }1 T$ U1 Z4 \1 F' a; {1 o  o
5 O+ t7 U$ `: s1 h- @' d
   // todo: return a different brush if the default is not desired( S3 D% |5 ~; p6 E
   return hbr;
& }' i; H1 o, y' b2 {* z- @}1 o# X( G( Q2 A) z* }  j
; `1 ^+ a0 \: {$ C& y$ u4 i, F

$ k- G8 F0 A& X- T% @: [( t, }  这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。
) W+ @. H+ R' k# H" e/ d. t( d% y( z
  上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:
' [6 O. z& o7 d0 U+ _
4 W/ e( O1 q8 F( d6 a# @* ~9 d* GCComboBox::SetDroppedWidth(int width);
% k! V# j. a7 T; A& ?4 \
, v* J+ G  R; ?# [. q5 u  通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值:   " N+ X5 A0 z! p
$ r. S8 k: O1 V
  1.你所设置的值(就是通过上面的函数所设置的值)$ c2 R6 t9 m+ _# @' h) B4 Q6 r

7 f/ s5 M8 s: O% V! Z  2.列表框的值
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-14 18:12 , Processed in 0.017152 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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