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

在ComboBox中改变列表框的宽度

[复制链接]
发表于 2004-2-26 19:37:21 | 显示全部楼层 |阅读模式
在ComboBox中改变列表框的宽度 8 |7 p4 G4 V+ Q8 N
, Q+ V% N; z6 a% Z  H
2002-03-07· ·贾旭滨(译) ··
! w9 q( _$ C! D9 b" h  c4 x9 B) ^& h5 g" L+ j0 s5 J+ \
  B8 v% R- L% f1 a$ ]
  我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。
, V3 J; P9 b, ^1 I  为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:- [* f" }) L2 O

3 j+ n3 Y, u9 n5 A1 C# a, V! MHBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor)
8 G; b; j1 S# _% K1 y6 a{) ?5 {' h0 a9 ?& H3 j" T
  HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);$ j' |& e1 p4 z
  switch (nctlcolor) {* e) n/ z* c4 p( O" S2 i
    case ctlcolor_edit:
" B8 ?- A! m9 O/ o. f2 N9 q' q    break;
, Z. H) u1 w0 S7 [" z5 I   case ctlcolor_listbox:& R* |, r% d1 e
    if (listwidth > 0) { ) ]( S( K: w- v1 ~4 z5 I
       // new width of a listbox is defined% \' t5 v, B& e3 R7 C
       CRect rect;/ f! r3 g! r+ u! y3 r
       pwnd->GetWindowRect(&rect);
/ Y! G" S# B( H3 C$ x! _9 d6 c       if (rect.Width() != listwidth) {
% m5 a3 s: P  U$ |5 {        rect.right = rect.left + listwidth;
( v2 @. R5 Y% L/ m        pwnd->MoveWindow(&rect);
% ^" O# b6 x) R4 ]" p       }1 l9 T9 ?' c3 j4 n* y$ ~
    }$ I  `2 r' M. u6 z7 `
    break;
- ?3 g1 J( f, Y   }9 Y/ n& `$ I% g5 B$ ?. ~  H! ^
  g. a3 o% T. j4 S  c! o
   // todo: return a different brush if the default is not desired
7 r( H8 c  l" v' d9 L" o* i, o   return hbr;
4 A( ~2 h6 G: k- A% z: @& b9 x" p}
+ v$ v; M( |* ~; Z) ~0 u& u! k
1 a4 }) W/ g- F& n
/ u! l9 A* Y0 h+ ?6 x; }  这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。; t2 s5 D# x9 V4 @6 ~( `

6 B* A* Q# ?% A- M1 I) h$ {) }) }  上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:" W/ P. B3 U* s& z" Z

$ y. {/ `8 M# y4 @' PCComboBox::SetDroppedWidth(int width); - C7 h6 ]5 V$ ?2 g

% u4 S9 u0 s9 v0 T1 }% w+ c- D, Y  通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值:   ; B# ]1 F! K& w  T: T& A) v

8 H) Y3 V+ ]2 C5 J% h  1.你所设置的值(就是通过上面的函数所设置的值)
! D- K. Y0 y& ?
5 O+ G1 L) b- u2 l8 f  |6 _  2.列表框的值
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-30 00:33 , Processed in 0.019956 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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