|
在ComboBox中改变列表框的宽度 6 z; S8 r" a6 Z- z0 {6 i5 o* W0 Q
! R0 ]8 Y+ f' E; l6 m3 f9 ? s2002-03-07· ·贾旭滨(译) ·· 0 i1 {1 q! K3 m# h& c/ l8 y Y
/ q( }# \7 m% {! P `
$ D& Z) \. e+ w0 ^3 Q( | 我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。
! d7 K7 X9 r Y2 e( g7 w 为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:
$ @" k1 e1 z: G# ~( o( Z s5 I4 S$ t1 Q/ f" k4 b; H$ s4 i- p% g
HBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor)
9 J. E' z- { C0 M7 {% }7 g; h/ b{
7 M% B. i# ^4 i HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);
2 ?& l9 r- L2 r2 i2 L* X switch (nctlcolor) {
, k8 x9 \" o. s7 ]. d case ctlcolor_edit:
* E; M. Z9 U) _! U; p% ` break;
0 s: j, v' L7 E! e7 c case ctlcolor_listbox:
# H0 t5 n" N# d& ^( E if (listwidth > 0) { ) D* i+ S, j, m" |, C; z
// new width of a listbox is defined+ g' f( N2 ?! C
CRect rect;% u( g! c( u3 x" t* p' n
pwnd->GetWindowRect(&rect);4 v: z7 l4 [6 Q9 [' \+ S' J
if (rect.Width() != listwidth) {
7 @3 @7 ?+ J# a rect.right = rect.left + listwidth;% h- p6 A5 E2 I* v* k* H# M( j/ U
pwnd->MoveWindow(&rect);1 r$ r0 x: U" R/ N8 ?4 p
}. u" [, J o9 |/ v: j: ~$ O
}# j( J" i2 `( K; \
break;
$ P8 P# }# d8 a$ i }
6 y% I* s3 @9 K- p4 w: I) x
4 h1 u$ K% z) w) S; _! p8 Q: a // todo: return a different brush if the default is not desired! w6 d+ Q# E0 m. @, a7 K/ o3 ^
return hbr;: x2 A- o# r: L- B+ i
}, b, v% l9 Y) ?7 u- z: W
; q& D5 p1 J; }* S" r
, y( R K( p9 M' O9 c 这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。
/ i3 M" J$ ~) I# S1 E. v7 O* T8 s2 T1 Z& ?7 ?3 u
上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:
0 m7 o0 }' p" d& C; f# J$ s7 ^' S7 z. C2 c$ k
CComboBox::SetDroppedWidth(int width); # l! \3 n n3 J1 A$ y2 V; L* v
/ j+ I9 ]) m: A9 z3 z# o0 d: O 通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值:
6 I5 k ~* u6 b$ _+ F9 |5 E6 h
* R+ U; J: D9 m0 S0 g 1.你所设置的值(就是通过上面的函数所设置的值)
# W. V/ Z1 u. n+ g
8 I" u' S5 A4 \/ T- Q' ? 2.列表框的值 |
|