|
在ComboBox中改变列表框的宽度 8 I0 {7 ?" f! x" t8 J! ?
7 m7 [3 X5 {. T6 N( n
2002-03-07· ·贾旭滨(译) ··
+ h: G7 H! h o y8 E0 k
1 K8 f6 r! g% o0 ]4 \# ]
! u5 ~; Z* Y/ b5 @) z 我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。 T- @) b9 ]6 M' Z: v& u
为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:
& X( S$ h" c% _) t2 R/ r# K& P& Q, X) Q) n ] k( S
HBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor) 8 a$ u6 c0 R" T
{8 W! ]7 @/ m7 F% s$ \
HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);
0 A) g7 |4 W2 u% s switch (nctlcolor) {
/ o/ r, u% L' k* k* ~7 ] case ctlcolor_edit:
0 E: j- A/ S7 x! t# E' `6 | break;
8 G$ o% J7 I; [$ c3 ~6 i9 O" g& ` case ctlcolor_listbox:
* b/ \. n7 A6 Y; ^% M2 x3 k7 \& R3 Y8 ] if (listwidth > 0) { : |4 L }1 Q0 G7 e
// new width of a listbox is defined
- I7 {; t& E: T- D1 w8 R/ `6 M) v CRect rect;
, p3 q3 n" \+ w* K pwnd->GetWindowRect(&rect);7 |! X' t$ P0 w% X
if (rect.Width() != listwidth) {
+ U- {8 j% w0 {% K4 D% z% r9 U rect.right = rect.left + listwidth;
" V1 o! D+ r5 z' y0 G" B% v* r6 l pwnd->MoveWindow(&rect);
/ c7 M: p/ J" [+ ?) l5 B }$ H+ O0 |, W2 ~8 M
}% U9 p2 a2 F, N3 F. L/ X) i- D
break;
! J2 }* d5 Y- k }; f# a G6 b/ K! O
* i4 F+ H! D5 Y( P* O! t6 ~& j // todo: return a different brush if the default is not desired
1 G1 J5 C9 \. l5 r5 n+ n% x9 s return hbr;
# k* r" u8 v/ h}
1 L& L% w+ A1 C6 }6 C' Z$ k2 v5 O4 E& _8 q
6 Q5 q) H! H% x* R- B, Y
这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。
k. k" O2 l1 ]
/ {4 @9 n Y. y) |0 r8 u" N( @" C 上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:! ^' G: T( v* M& i g" v- Z8 M
5 `# q/ P. A, J' W9 [& K# o
CComboBox::SetDroppedWidth(int width); : r f b4 k% d& A Z" z3 E/ O* E9 X
' [+ ?8 _; y) M* c4 G% s7 _) W1 j
通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值:
( h: B5 X6 N, m, H
& P" i# K) v0 q9 n$ i7 G 1.你所设置的值(就是通过上面的函数所设置的值)
: L; S2 F' P: g' M$ n; v
6 P6 ]7 j! E+ P- Q5 s: N+ D% y 2.列表框的值 |
|