|
|
在ComboBox中改变列表框的宽度
, [5 n+ n: C/ u* }# ?2 m Y
! o T7 T$ {4 M6 t8 p2002-03-07· ·贾旭滨(译) ··
. R* {# Q; N8 L8 n+ t
7 p3 u) n; T8 W) e# {5 U" E9 o1 {" z& o, w
我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。
4 V& j: Y' h$ ?/ S1 q' b- M 为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:4 Z" W: G$ D3 u6 m
7 x! ~; f+ i) N8 iHBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor)
4 |. y( u9 ~" p& T% ?8 N" g C{
' Z4 O4 J3 \5 K. I& Q2 {3 g% n HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);
2 d1 S' S1 N3 I) X9 P switch (nctlcolor) {
% k7 z% I5 f$ ^9 u case ctlcolor_edit:
! X. C# S0 z& l break;
& y: w+ P: H* g: w" _ case ctlcolor_listbox:
& u. c! e1 F( d o& m# `, p if (listwidth > 0) {
$ | N* `8 y2 t% Y6 C // new width of a listbox is defined
5 T8 }4 {7 c, n5 l CRect rect;+ Q' m4 W5 m* O2 T
pwnd->GetWindowRect(&rect);
; G. e+ H0 ^. f! X1 P* C if (rect.Width() != listwidth) {
& g/ O* R; ` i( n0 I# ^ rect.right = rect.left + listwidth;
6 t3 R) _% c# K+ c) `6 O& g8 g) g pwnd->MoveWindow(&rect);6 m: k$ ]4 j+ ?& b
}
4 o& _1 N4 V9 o: l }
' g W# d* ?" ]2 U1 P break;4 Z! U1 V* H+ `3 W8 N' o
}& I I! Y& z* T8 i5 J) H
) d' c s q$ [! O // todo: return a different brush if the default is not desired. J! F' s) b+ b9 L# y
return hbr;' B a: K% m3 ~* r' H
}$ v( m! f* \! T
U& B) \! x) O% c+ F4 w8 q9 S7 z, q' V# w
这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。: z3 `2 f3 m |. z5 h7 d/ n, P
, w& {' W8 f$ B( S! n 上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:
' ~5 C4 U: ?! c3 E. Z% w, l7 y; N! W/ \! e+ v8 i% J& |
CComboBox::SetDroppedWidth(int width);
: `1 P l" z4 a0 b* m; R4 L
6 y, X0 h! P/ q6 R9 @9 ] 通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值: $ z+ C- z! R" ?4 w1 _# n
0 |6 V5 ^; E4 ~! I& ^; K" ]. O- G 1.你所设置的值(就是通过上面的函数所设置的值)
. j2 R& A q; N$ B& V" L4 S2 r, F$ ~; h! P4 n8 D# j1 E. ]8 B# D0 T5 U' f1 m- m
2.列表框的值 |
|