|
|
在ComboBox中改变列表框的宽度 . m9 @; M s: B
' E& M5 Y. ~% |: ], }6 a$ E2002-03-07· ·贾旭滨(译) ·· ) |% o( o6 ^ L K8 Q& K Q
( f) l# K0 ^) Q* v
9 {& L/ g, j8 F+ R
我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。 $ Y$ y/ i0 s7 e/ E- _3 p. m
为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:; Z( L/ m3 O) ], N
* F* q, h/ t% U- z: j9 P' bHBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor)
* o2 ^0 F6 G$ O: Z i{
! w9 S/ W9 O4 \2 @ HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);
+ A/ K; v5 o7 P- v3 J switch (nctlcolor) {7 m) n0 B* A4 f" f
case ctlcolor_edit:3 Q! A- l7 Q7 g- R$ W
break;' J, Z2 L; e5 c& ]8 L" D0 H
case ctlcolor_listbox:3 }7 m8 R2 j5 {( X: [, L! w5 {
if (listwidth > 0) {
% u+ X2 P3 ?# M9 ~ O! l' k // new width of a listbox is defined; S7 j% ^1 L _9 X" |8 P
CRect rect;
3 q0 A. L( V- M) J pwnd->GetWindowRect(&rect);/ O! |5 e* y7 B
if (rect.Width() != listwidth) {
2 `0 |1 g- L9 w4 l rect.right = rect.left + listwidth;$ M- [8 H7 M4 p
pwnd->MoveWindow(&rect);4 f' b- c x) z6 a5 I/ p. [
}
- ]2 |: A1 c1 T9 e }
) X4 g% N$ F; s. [3 Q break;
2 o4 E* e; I1 S5 v0 c7 @ }& q T* b3 J8 Q) j2 j* t0 S8 {7 x
* p: b, ~$ I! A
// todo: return a different brush if the default is not desired! m6 k+ h3 ?; B0 e
return hbr;8 T- `$ ?. ^: S
}
8 z( n' `; j+ ^. j
# [: M; ?% [: W4 d1 O! d9 T
+ f$ \$ J; }3 g# O5 k 这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。
+ T, @3 ^' q* b) ]) |9 c9 P4 x% m# Q& y* ]/ p+ X3 v4 H
上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:3 s. G. }) ?# \; @" s2 t. w+ y
0 e' Y5 M+ z) g& n6 Q) tCComboBox::SetDroppedWidth(int width); 8 y& D7 O7 Y1 i$ Y
/ i% K9 a. D, p0 P- }# i$ a7 M1 I' [ 通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值:
: y1 F& h! n+ r+ m# g1 Q' X% F" Q( p- n; e( A
1.你所设置的值(就是通过上面的函数所设置的值)
& j! i1 i3 G5 a& a& j2 `" U9 n7 r% P e0 T% n6 X/ t
2.列表框的值 |
|