|
|
在ComboBox中改变列表框的宽度
+ a6 s" j; C/ y: P: c8 D
( D8 }* G" \: E( q7 P% M# L; l& s/ w5 c2002-03-07· ·贾旭滨(译) ··
2 Q3 k: t' m& ]8 A( d4 v/ J* @! {& E$ ^7 `8 U/ b9 q
5 e2 v% L# K) u. V" g% d6 A
我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。
/ c# H! S$ D* F, J 为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:
$ ]# I/ T( q/ I" o7 A7 y1 K u
" }& g' f( C2 w y2 l( j; jHBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor) : m! J: G5 L5 s1 ?, v! d. E
{4 N4 M1 Y% y% u- T
HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);* |: r: P' `5 |
switch (nctlcolor) {. s- j- A; O/ _
case ctlcolor_edit:
( O U* _4 I! V/ N" \ break;
' ~; r, b+ @$ z4 C0 ?4 u case ctlcolor_listbox:
# s& O3 p2 f/ v. j9 C1 j$ f: ` m if (listwidth > 0) {
# h+ Z R8 W7 L* I // new width of a listbox is defined1 y# H( k% V7 V, q
CRect rect;
$ n& m+ ?$ q4 e- A% k! J pwnd->GetWindowRect(&rect);
7 n% `# T' N* f8 w- v. M# q if (rect.Width() != listwidth) {& ^: Z" E: ? {% m/ G
rect.right = rect.left + listwidth;/ \! e/ I% l; p) n6 }
pwnd->MoveWindow(&rect);) L/ M) s9 T7 [1 F
}/ L2 ?% [ @3 V. f q
}
7 O% ~2 \- M7 y9 d+ f break;
5 x9 ?9 f5 ^& r1 X }
- d& f+ g" |+ A0 }- S$ v
* g' s. x, K* [2 A // todo: return a different brush if the default is not desired
9 O+ f# X# Q8 Q$ u) L return hbr;' w0 g l* k& q* |' d$ T
}
6 e9 i9 {& {; B; p6 R. I* \) G: Z2 S, H# r% q$ x3 t
+ u8 q* a' W1 m% K' p% S 这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。5 S# z* Q7 d4 E
9 L: P0 o9 k+ i; x7 Q
上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:$ G: @, v! c: n+ r3 _
: g9 w& k/ x2 U) c/ _( DCComboBox::SetDroppedWidth(int width); ( P; I. K& \, }4 @4 a8 H
r, Z- Y: @; h8 X 通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值: * L1 R! h M9 L8 p* \3 G: `0 H
6 E. v5 m! M; p; ?
1.你所设置的值(就是通过上面的函数所设置的值)
\0 N2 t3 Y$ _0 @1 u+ b0 T8 i5 H7 @1 b
2.列表框的值 |
|