|
|
在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.列表框的值 |
|