|
在ComboBox中改变列表框的宽度
5 ] J6 e/ `6 a, B9 o6 `8 a" S# k7 E! y, u* O
2002-03-07· ·贾旭滨(译) ·· 3 X8 T' I. ]* X4 x2 p0 C
8 J" W5 K, [$ t- Q' e' Y
; z" V8 J" ?3 b- U' J 我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。 ( w) x- W- }* G! W. Z2 x
为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:
2 X- {# V2 E% K1 N4 o3 s3 Y$ o8 I
HBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor) # [5 B% V; q2 ?- q( D
{
+ T( d6 ~+ d$ E# _3 L HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);& K3 Y$ v) b; G; \. x1 J C) R
switch (nctlcolor) {) ?1 E/ a$ X6 E6 d& m8 {) @
case ctlcolor_edit:
5 [% F" |7 |% T/ v break;
) W) }( K: N1 P# w, B8 b case ctlcolor_listbox:% O) I! _+ x) j
if (listwidth > 0) { 0 J( _, [" V, e. T
// new width of a listbox is defined5 R1 B- a/ U0 s4 `
CRect rect;2 f* \, Q3 Y ]- m
pwnd->GetWindowRect(&rect);
5 r' T* `" n& l% U% n" b if (rect.Width() != listwidth) {
, X1 ^& K% N* b7 u rect.right = rect.left + listwidth;
; u* |* }" ^( ^8 @! Q& ] pwnd->MoveWindow(&rect);
3 \/ [% y. s6 u, X4 h }9 m# `$ l$ K" d( E( n, Z( [
}' i! y0 r1 ^% A; \' j1 f2 G
break;
' R5 D; v a" ]$ \6 ^ }1 ^- f; r' E" ]5 d+ X+ _8 H
' {* U! _3 r* t/ Z. D, f& R
// todo: return a different brush if the default is not desired5 p8 T( F+ k$ Z# _
return hbr;6 l1 p! I8 d, Y0 v i
}
1 y+ G1 X5 Y* n }- [6 e- a
; @" R, M& p$ ]# H+ a7 O. H, O2 T, N7 x* ~8 s" B( H3 L2 m+ e
这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。
) m6 _& T: d* K6 ]3 T, s4 ?$ o% _
上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:5 P! A: v4 j% V8 i* C2 ^, n. J
: m0 r2 M0 n- P' N$ l' {; DCComboBox::SetDroppedWidth(int width);
; j) d3 Z* }" y) T$ ]% i5 Y: l' r, w7 R2 W! S- w
通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值:
, I) ~; A. L& J* w- K3 X Y2 ~2 F
7 }3 W8 k: i* _1 |, |/ A; [ 1.你所设置的值(就是通过上面的函数所设置的值)
/ J3 t% p7 Y9 D6 k$ b
$ J7 u9 w% n+ o4 U% ^ 2.列表框的值 |
|