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

在ComboBox中改变列表框的宽度

[复制链接]
发表于 2004-2-26 19:37:21 | 显示全部楼层 |阅读模式
在ComboBox中改变列表框的宽度   k# D* V4 ]( f6 Y" k2 J$ X

# h: `5 x- G+ l( `2 P: ~7 m& d2002-03-07· ·贾旭滨(译) ·· 2 B* U' M- ?# z5 Q: W7 c0 T. K) W

! g1 J0 W8 I$ V- l4 ~" P: w
2 E" {2 Y+ m: w6 {5 f+ M/ C  我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。 - L% h1 N' j9 @0 ^# ?! ~/ J3 O
  为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:
- J8 I' j) h0 M. ^7 K
' G$ A2 [+ S! _& @; E2 AHBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor) 2 ]2 ?( m+ A* o) ^' I' |
{
6 U2 X; I& }, {% k" `  HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);
; U' a8 x. d: G  switch (nctlcolor) {
  G1 G  e1 D; X2 a3 q1 i: v    case ctlcolor_edit:
  {3 e' k: k' s4 b+ F# S' k2 o/ O    break;$ t5 N7 G6 b: v$ Y1 X, O$ D
   case ctlcolor_listbox:
3 Y( o/ w; e6 }9 N7 q6 Q    if (listwidth > 0) {
+ Z/ p' Y4 P0 E9 p9 \4 C       // new width of a listbox is defined- i4 o6 U" H8 q
       CRect rect;  v! l  T( d& Q+ ^" D' r, @
       pwnd->GetWindowRect(&rect);
1 }* A& z/ r: b2 i8 c5 W2 x+ r       if (rect.Width() != listwidth) {% |5 |. S. [( ~! c- i
        rect.right = rect.left + listwidth;
3 x. T0 b) [% f# D% P        pwnd->MoveWindow(&rect);
4 z' W3 P" Y4 e' I& |( X       }
1 F2 f5 f' h) E. R! r    }$ _. |3 ?/ i. X9 v4 C
    break;
/ o& N; _' m& e' a   }
  v" A8 D6 s! T" y8 }! u, ?
6 I1 ~- P; y& `% _* `% }7 e   // todo: return a different brush if the default is not desired
0 {0 e" L' Z$ D* G$ s   return hbr;
9 O2 F4 \+ ]9 l4 V* y}
$ R; J) S% {5 ?# q8 ?
5 n$ v4 [9 G9 I' e' l. C7 E( e$ ]. b8 r; o
  这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。
4 d4 c, a4 u( Z1 c4 V
7 |1 [) F! L7 l; j- ~9 k  上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:
2 d' {4 c# c: r
1 }9 r' Q5 |4 N. D( K3 VCComboBox::SetDroppedWidth(int width); + x' T/ @4 D5 q5 ?( y* Z

" a; a' |* f' V/ n. w: E3 z( J  通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值:   
2 I9 ]) u1 u* m! c  ]7 \( ?9 l- G9 C% @  q; G5 K0 B
  1.你所设置的值(就是通过上面的函数所设置的值)
/ a# ~% f$ e1 d- n7 V8 q1 ^$ m% q  R! G" s
  2.列表框的值
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-15 10:27 , Processed in 0.017795 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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