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

在ComboBox中改变列表框的宽度

[复制链接]
发表于 2004-2-26 19:37:21 | 显示全部楼层 |阅读模式
在ComboBox中改变列表框的宽度 6 I. B: C" l6 ^5 F

( \& h% Y* S! B2002-03-07· ·贾旭滨(译) ··
% B$ R0 z3 I! n* o! f. ^2 @5 {8 j% |7 r3 T# O. X, \
5 l' w8 K7 e  }  v* p, N1 D/ I% X
  我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。
$ H. L" h- c3 ?  r$ y$ A  为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:/ D7 Z2 c0 N: u) Q3 C

2 X+ O8 c+ `+ E0 [  d5 k- @HBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor) . c+ T/ r( ]# e9 [' f1 @  @
{
3 h( q9 s+ c- g) o) l, S6 x- Z# d% e  HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);
6 c7 y$ n# |: C% u3 q  switch (nctlcolor) {
2 o/ b" y9 b0 h( k& u; S    case ctlcolor_edit:
( C, N8 ?0 O( P/ N* Y    break;
0 X! f' w9 b7 G0 C   case ctlcolor_listbox:3 |, X: ]+ M. v3 I1 W
    if (listwidth > 0) {
! x& O  d9 G, [/ s7 j       // new width of a listbox is defined; {& S9 P) m, z% k3 N; E
       CRect rect;
9 a+ }$ {: w/ v" E       pwnd->GetWindowRect(&rect);
; I& p# E" u3 _/ L! Y       if (rect.Width() != listwidth) {7 {4 N. t, o2 D$ r7 g) |6 I
        rect.right = rect.left + listwidth;
% C+ o! v* B( {3 g9 C; b        pwnd->MoveWindow(&rect);
5 {0 X  }4 t: E       }3 I$ g/ J2 P$ [7 o2 l9 R& M
    }" {* j- F/ K6 y& z" n8 q! l
    break;: N% a" ^3 C3 {% a1 r2 w
   }* l# M& K) ?% x5 @9 t

# ], v: C$ {1 U  M% [1 \   // todo: return a different brush if the default is not desired
* b, j" I2 k6 ~5 n: b* ?) D   return hbr;
3 N7 L1 A! V9 |4 y% O) F: x}& r+ {/ k- u4 A: B8 L* B
3 X: J( M" w& X# Z3 D
" M, ?9 R3 e7 N
  这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。
0 v; k, F% I& d5 N% l- f! X5 c0 k( x* S7 P. z& Y! A, k
  上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:$ e/ x1 E/ }) L( T: z5 y2 O  R

$ u2 |  A& y) ~8 o; w! h+ \* N" mCComboBox::SetDroppedWidth(int width); . r9 u# H4 O$ j% ~- m

7 ~. h: g8 n, ~) w  \. g/ s  通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值:   5 D+ t5 m  M- ~
2 G2 c3 f, e$ i9 I! ~8 v% @
  1.你所设置的值(就是通过上面的函数所设置的值)% n2 w& ^* l, K0 C9 H
4 j6 c! S8 Y, ]3 b1 t9 A
  2.列表框的值
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 06:48 , Processed in 0.018071 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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