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

在ComboBox中改变列表框的宽度

[复制链接]
发表于 2004-2-26 19:37:21 | 显示全部楼层 |阅读模式
在ComboBox中改变列表框的宽度
+ a6 s" j; C/ y: P: c8 D
( D8 }* G" \: E( q7 P% M# L; l& s/ w5 c2002-03-07· ·贾旭滨(译) ··
2 Q3 k: t' m& ]8 A( d4 v/ J* @! {& E$ ^7 `8 U/ b9 q
5 e2 v% L# K) u. V" g% d6 A
  我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。
/ c# H! S$ D* F, J  为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:
$ ]# I/ T( q/ I" o7 A7 y1 K  u
" }& g' f( C2 w  y2 l( j; jHBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor) : m! J: G5 L5 s1 ?, v! d. E
{4 N4 M1 Y% y% u- T
  HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);* |: r: P' `5 |
  switch (nctlcolor) {. s- j- A; O/ _
    case ctlcolor_edit:
( O  U* _4 I! V/ N" \    break;
' ~; r, b+ @$ z4 C0 ?4 u   case ctlcolor_listbox:
# s& O3 p2 f/ v. j9 C1 j$ f: `  m    if (listwidth > 0) {
# h+ Z  R8 W7 L* I       // new width of a listbox is defined1 y# H( k% V7 V, q
       CRect rect;
$ n& m+ ?$ q4 e- A% k! J       pwnd->GetWindowRect(&rect);
7 n% `# T' N* f8 w- v. M# q       if (rect.Width() != listwidth) {& ^: Z" E: ?  {% m/ G
        rect.right = rect.left + listwidth;/ \! e/ I% l; p) n6 }
        pwnd->MoveWindow(&rect);) L/ M) s9 T7 [1 F
       }/ L2 ?% [  @3 V. f  q
    }
7 O% ~2 \- M7 y9 d+ f    break;
5 x9 ?9 f5 ^& r1 X   }
- d& f+ g" |+ A0 }- S$ v
* g' s. x, K* [2 A   // todo: return a different brush if the default is not desired
9 O+ f# X# Q8 Q$ u) L   return hbr;' w0 g  l* k& q* |' d$ T
}
6 e9 i9 {& {; B; p6 R. I* \) G: Z2 S, H# r% q$ x3 t

+ u8 q* a' W1 m% K' p% S  这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。5 S# z* Q7 d4 E
9 L: P0 o9 k+ i; x7 Q
  上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:$ G: @, v! c: n+ r3 _

: g9 w& k/ x2 U) c/ _( DCComboBox::SetDroppedWidth(int width); ( P; I. K& \, }4 @4 a8 H

  r, Z- Y: @; h8 X  通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值:   * L1 R! h  M9 L8 p* \3 G: `0 H
6 E. v5 m! M; p; ?
  1.你所设置的值(就是通过上面的函数所设置的值)
  \0 N2 t3 Y$ _0 @1 u+ b0 T8 i5 H7 @1 b
  2.列表框的值
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-15 09:21 , Processed in 0.017749 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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