|
|
在ComboBox中改变列表框的宽度 6 n/ {1 E E0 c1 P4 K: ?; T! f
# @: s, V/ N8 H& o2 Z, T
2002-03-07· ·贾旭滨(译) ·· * R5 I* n" r% m
1 |6 s2 i/ S0 y, \
+ E) V6 E; w8 V6 x 我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。 ( F: l4 V8 |. m
为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:& H0 x$ I1 C: I( Q- G8 i' e+ V9 o
, j( b( V8 ]: V, H8 D4 M7 A! g# ]HBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor)
1 @- m# M4 L- I i' ?{
5 w$ h) C5 E9 U, T6 @ HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);
* L3 n6 z8 h+ o2 C, H switch (nctlcolor) {( r v3 U$ J( F9 H
case ctlcolor_edit:- F3 Y; Q# F; \9 r9 G. E' e- `# g
break;
8 v5 F, V/ t) X" G case ctlcolor_listbox:
* K1 Y6 R# r2 g& E4 p% b8 T8 x- w if (listwidth > 0) { 3 Z) V3 G; F p( a( s4 s
// new width of a listbox is defined7 \+ F. k" g7 T* Y6 X$ O, L
CRect rect;1 B& w& i& [, o2 t6 {
pwnd->GetWindowRect(&rect);/ g! D3 P' E6 r1 R
if (rect.Width() != listwidth) {
. ]6 o: G" |/ q) A$ B3 s& e' | rect.right = rect.left + listwidth;
; m3 z' b' q4 T; @9 }/ d8 z6 a pwnd->MoveWindow(&rect);+ g/ @3 g0 U5 W" C" Z
}7 u* \( N- I. ?; K
}
5 C# o9 b7 N7 A. U8 k4 l$ s break;
; z; A0 \- K$ `- v }, s; o! r7 l1 v1 b
Y! s1 w. ^+ I) f // todo: return a different brush if the default is not desired
5 ?# }# I, ?& f6 S& H# \& w return hbr;
3 e* D! ?) e! d+ w( Z7 V" k0 ?}
( w# w I9 P r2 G- I, z
/ X( q/ m6 g% Z! t& A
1 U4 \0 Y+ a# `2 S- p 这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。
9 \2 k% {# e4 j6 ^
5 R6 k+ _( l9 y% d! d! ~8 o 上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:
$ q! Z$ { C) m# V9 m6 U- p5 B& ?
( T5 G( a z3 d; k# j( ?CComboBox::SetDroppedWidth(int width); ' N0 A L3 Q2 L8 O ?+ T9 @
4 A7 f" B; [7 v }4 H+ m 通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值:
# B* r9 |. p+ z6 b0 P8 K/ H8 k3 \1 Z
+ w3 p- _6 Q" s, d" T5 R 1.你所设置的值(就是通过上面的函数所设置的值)5 l# U% l) b+ T8 T0 Y# h
3 U" ^: ?, N% s! [( n
2.列表框的值 |
|