|
在ComboBox中改变列表框的宽度
; s2 N- V7 [3 G1 Z$ R
o: n, n# \$ v6 }, F" n0 W2002-03-07· ·贾旭滨(译) ··
, A4 J& c( o' _: J% y8 H4 H; H9 o
I$ d) m: V# r4 ]2 ?! m9 p! I. k' t2 Y; N
我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。
8 B5 X, w8 }6 [9 w) |& i- a 为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:( L! E" o$ V( P5 r. K
1 ?4 Q6 k, d1 j; g
HBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor) 6 ?; C: F6 P+ M, O; o% \
{- b" z' X& k% J
HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);
' s8 a+ a5 B; V switch (nctlcolor) {1 w2 V8 ~2 d2 `' m+ k
case ctlcolor_edit:% R: d) t' C: v* p: d3 U& y
break;; |6 [8 o( `% H5 T
case ctlcolor_listbox:
) A3 K# G0 c- @5 _2 q if (listwidth > 0) { 8 B7 c% g+ O' L" H1 @; H
// new width of a listbox is defined
3 s* X. V( A; U CRect rect;
8 k/ N0 C4 K4 i% h# U2 M pwnd->GetWindowRect(&rect);4 g7 M/ P4 X4 o# u2 i% @, e
if (rect.Width() != listwidth) { F( p7 I0 b4 C* G
rect.right = rect.left + listwidth;7 E. q0 q* M# h4 c) |- \
pwnd->MoveWindow(&rect);0 v- e2 F% E+ |" [
}
) I3 d7 E3 c2 M; _3 ]: j }
# W1 T6 a Z4 T& p) V* m6 s break;
, v0 z5 W& ?1 i1 L6 K* ~ }/ b0 X4 T7 n6 [
( P0 P* E8 T! h8 n& q3 O3 |5 n // todo: return a different brush if the default is not desired7 l( `$ `- \& w# f$ C4 G2 K
return hbr;4 [( G+ h$ K. T. h# x* ~1 w
}) L' O9 y$ D4 A# O+ U
2 }7 ^1 j7 H6 T3 F
! j7 J9 R5 f* z: b5 N2 n: [
这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。) ]; G) V' Y4 \4 D8 l7 r
P: @1 A! t8 D6 T# S& v1 M8 a 上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:0 L0 ?/ B* d. O
4 u6 s+ x+ i1 E. yCComboBox::SetDroppedWidth(int width);
/ F8 a4 e/ i" Y: b7 O- Q: Y
" x' o% q0 V# D% b. U 通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值: # o1 \" I6 N. P6 }" B
4 R4 } |% B Z, |8 ]) [4 O 1.你所设置的值(就是通过上面的函数所设置的值)8 k) ^" P. j& u
" H d& @: U& [0 u+ d' i% X 2.列表框的值 |
|