|
|
在ComboBox中改变列表框的宽度
. k, Y5 A' I$ n, p
5 N" g$ T; y- B2002-03-07· ·贾旭滨(译) ··
4 t7 n; @* s+ V6 e
# F* e! g0 G2 b. z
5 s [+ M5 ?5 k7 _- u9 |0 t5 z& T 我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。 , G+ I$ k2 a) h4 T# Z6 c) l/ ^ E
为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:3 N$ `8 A. ]- s+ x: }; B1 D
. {3 \4 \9 l3 L: R* \0 A
HBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor) O& h. j# |% R0 P7 M
{) g2 E/ b, ^% [
HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);
: x% R) I& I. t! | switch (nctlcolor) {
: E) g4 e) V r* o3 T. r case ctlcolor_edit:5 F) |. z5 m) h
break;5 M9 r+ g4 c8 r, v6 t
case ctlcolor_listbox:
7 z, ?. ?/ p U; ?2 C* i if (listwidth > 0) { 4 W" L) [+ k6 _4 e5 J, \
// new width of a listbox is defined* @$ M# ~* S; D5 p
CRect rect;
* u' k4 q: U& N: y) G6 Z pwnd->GetWindowRect(&rect);
' B y8 u: G5 l if (rect.Width() != listwidth) {
& Y3 [7 b( B. j rect.right = rect.left + listwidth;$ `! X1 ]: I: ~- y
pwnd->MoveWindow(&rect);0 S7 K8 B4 t' y8 Z4 {
}
, Z1 f! J$ w/ p! K' n# J% u }
- } ]9 @/ }0 T7 x9 N break;
( \+ P) E4 e; K0 {, h1 ]( I% a }7 H/ e' j+ A( j. W5 K) D% a
9 w' p! I+ Q# Q# p7 ^ // todo: return a different brush if the default is not desired% ~+ @+ w9 d' x5 G& X( T8 l
return hbr;+ {9 k' ^% @& ?- M t
}
8 x0 h3 {" T" H% e; q: ~' {3 \
% B( d: i# @8 F0 Q, D/ y1 T: B, L! W% c
这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。
, t$ g4 l' J( e4 a$ y% m p' E2 @/ _2 [/ m- n* N6 o" ~/ n/ K3 E
上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是: T% L0 X& O, w
( [5 T. y* P8 x! A, D# N
CComboBox::SetDroppedWidth(int width); # e. \& s$ y+ U3 P% N9 w: _! N5 L5 |/ o
) @6 ^. r' e6 z. X
通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值:
, v0 ]; b9 ]/ C, S
: G; m# s( k- o 1.你所设置的值(就是通过上面的函数所设置的值)/ C1 E+ w, X" |! N( T
+ U: k7 O: B7 ]/ e; P- I8 O
2.列表框的值 |
|