|
在ComboBox中改变列表框的宽度
' V& O; _' O" y( D- p
7 G s# C$ \( c! e2002-03-07· ·贾旭滨(译) ··
* t4 `/ O( k1 h) W8 ^5 p/ B$ @* n$ ]2 z+ B1 }0 ]
# \# L- y9 g0 @: }; F0 c! `7 z, ] 我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。 9 U* I, f# T# I+ ]* p0 @) S
为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:
5 m" M9 O% C4 B2 E* b) H
! @! ^: r2 `2 | y* F( vHBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor) 3 N. |5 Z* K0 a0 x. H& {& _
{
1 ~% U. q- l! H6 M: W HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);& q; d h% d, X) t) o+ v# S/ G/ q
switch (nctlcolor) {
8 R/ y: e U& J: H7 d7 y case ctlcolor_edit:) d" N: B& L5 j# O
break;! l4 a# W5 U0 m" g
case ctlcolor_listbox:5 Q9 Q7 l% i3 c) [# S ^: p' Y
if (listwidth > 0) { r9 {7 G/ ~ J& }- h+ ?
// new width of a listbox is defined& o8 Y" C G( m8 g- L
CRect rect;+ p2 m" ~( u9 B; x
pwnd->GetWindowRect(&rect);
( e1 O6 q: I/ v3 b if (rect.Width() != listwidth) {
( e' o$ H8 Y; r" t# g rect.right = rect.left + listwidth;
|+ U% ^ T" P* i pwnd->MoveWindow(&rect);
5 f2 w: `! H4 J; G1 p% M1 x3 R }9 B( ]4 f8 F8 O- P9 ]
}
- M/ q9 O) ]8 c r break;( @% Q b g% D5 p
}, ^) N+ y( j1 M1 e0 @8 y
0 A" K0 `( H6 \) f3 C; h // todo: return a different brush if the default is not desired' K/ p/ I3 ~9 a4 c7 T2 L2 _! [
return hbr;
+ x) B. j/ g9 |9 m}
+ T. ^- ?6 w; r% {$ X! U' K% ^
8 _; B" }: \ Y3 }: j6 B5 l6 J' c- H2 B( F7 P$ C
这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。1 M6 b2 C/ X) d/ p0 j. Z
1 p# Y) s2 d1 y0 j 上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:* f& y- Y2 y& ^8 Z3 `5 O/ J
2 R# D- \3 Z8 X+ V! |
CComboBox::SetDroppedWidth(int width); + L D$ N! C' T& V2 B8 w5 q2 c
4 v/ x- s- O# `6 E+ f9 w
通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值: 0 {0 ~1 ^5 I7 y- m, Y) A9 i
% m J( `& J, w0 }2 X
1.你所设置的值(就是通过上面的函数所设置的值)
& h# e' U, a& O5 |/ X8 |: }* J
& H6 Q9 u. y( c$ \8 _4 t 2.列表框的值 |
|