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

在ComboBox中改变列表框的宽度

[复制链接]
发表于 2004-2-26 19:37:21 | 显示全部楼层 |阅读模式
在ComboBox中改变列表框的宽度 $ H/ d4 L+ P) j0 f- O  s

5 {" {/ z3 e/ X- L  t! Q2002-03-07· ·贾旭滨(译) ·· & `. g4 r: U. C9 H" X) v

$ Q$ {5 I2 d7 C: x6 g  ~" H/ @2 o* Q1 v- v% _* G. y0 l
  我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。
$ d9 |# x+ }! t7 S0 [4 `* t  为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:/ \! A. n' V+ h

( o% o) n: Y7 x- d, w0 Q2 u# L9 YHBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor)
; h2 Z7 T! w2 m$ ~7 R* c. E{
- u' @5 e/ h; p9 ]3 ^  HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);
2 a; X! d  o( a+ p  switch (nctlcolor) {, ?4 L5 |% O" L- T0 h
    case ctlcolor_edit:! X0 h  F2 T0 K3 R. t* ?
    break;/ V7 p0 e0 ~* r6 g. k  m0 V
   case ctlcolor_listbox:
" ^8 @$ d7 u6 T, Y    if (listwidth > 0) { 1 I7 o% u, [4 V; {
       // new width of a listbox is defined: q, t$ R( P4 r7 j. F
       CRect rect;
9 H7 [9 x& S: }! l( z4 V; N       pwnd->GetWindowRect(&rect);
- k+ F# ?4 G- ]5 s       if (rect.Width() != listwidth) {; y" `$ |1 @1 y% K& M- L# ^
        rect.right = rect.left + listwidth;( |+ N) X' I7 ]4 Y
        pwnd->MoveWindow(&rect);. `, L5 ?. I& J$ {
       }4 g: Z2 W- `! }% W( I. m% E
    }3 J- b7 b; l4 Z; I7 }& ]7 h
    break;; o1 b$ g2 O  Q; A3 y/ \6 R
   }
% J7 w2 y4 T: [* w( V) C( m5 X' V1 p" W& A. P
   // todo: return a different brush if the default is not desired
  v) X* Q8 @1 @9 ^: V- z' \   return hbr;& A/ h  Y: l  a6 J/ f; D7 G6 m- p
}
$ c- U- s; g, E7 }) d% \2 X1 G$ U
# Y- y% f# C. x0 u( o, n
3 s2 W% M5 Q- e$ _' a- _  这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。2 Y& f( J9 ^) t+ |

' N6 n% C' ~3 f: K7 l  上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:
  o. X! R5 D! ?4 I* E7 ?, p5 M' ~1 u" a+ ^) i
CComboBox::SetDroppedWidth(int width); 8 k% H) |2 S! F0 T: ~5 t& F

8 M$ r, u! O8 S' j  通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值:   " }. ^3 m+ n( b$ x: G: S

6 L3 j& _( f* g1 e  1.你所设置的值(就是通过上面的函数所设置的值)' D  P% M5 s( D# w1 _# z  i$ Q5 e1 [* f
" e4 s: M) P- H6 `% e% ~
  2.列表框的值
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-5 08:30 , Processed in 0.014269 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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