|
|
在ComboBox中改变列表框的宽度 + R, }" t" a6 t0 N, u D
% E2 S0 ]3 d) M u1 ~2002-03-07· ·贾旭滨(译) ·· 9 \) B+ P2 g: C9 X4 m# C/ l Y
5 r+ E3 r$ x& [# o; e
2 y1 o+ ~+ M, s2 n, M7 }, C& ^ 我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。 3 n5 i6 m5 _: l7 [
为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:- _) e. x0 j+ x% Z" O0 {
. `7 f. S% |4 Q: y# | kHBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor)
q$ M% M1 t2 t: U{" t/ M: m% t& s$ p
HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);
' X1 R5 G5 e' j switch (nctlcolor) {
2 Y2 S: G4 O$ P5 z# I6 g case ctlcolor_edit:2 i8 K) o2 [5 [) q: E: U
break;
) |% A; o- L0 i' G) f+ I case ctlcolor_listbox:3 i0 `6 p0 P. O( t0 ]* W* `
if (listwidth > 0) {
. g9 v N) G; N8 \ // new width of a listbox is defined
; Q( c7 X0 f* q6 f CRect rect;5 U: O M5 J0 B1 m+ U
pwnd->GetWindowRect(&rect);
& [2 A5 i E% C# }% j6 X3 S if (rect.Width() != listwidth) {
/ [% R9 [$ Z/ ]) T rect.right = rect.left + listwidth;* N$ Z/ c, _6 i& ^
pwnd->MoveWindow(&rect);2 s. m- b6 S" ^3 c0 O
}
( l; J3 l6 U; I7 K0 ~' y0 j }
3 n6 M$ f" x2 m+ h) C- N% D break;9 \' ~5 z* A4 ?
}- @, M7 ?: }; i# k4 |, K
8 x; R/ x, k' K1 L7 q // todo: return a different brush if the default is not desired4 u* s, J1 p/ @ [
return hbr;
- B. A: T" E& M, U}
' ?# ]6 G6 m* @$ j% j2 j; n
$ h# F0 L+ b/ |' N$ w: Z" Z1 ^
# ^" t5 _- V. p* J( b6 ? 这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。
u# j1 G3 F2 P7 o) }( K
! ~# r& F9 w3 b 上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:
* V% L( a6 W% T8 m* }8 e& I+ v& f/ w X
CComboBox::SetDroppedWidth(int width);
) s! l* W7 o& ^+ P5 ^* d; Q3 B( T1 V. `0 ]0 s& G8 i. r" l
通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值:
9 d" b% L5 j! C# i# K( y! c" @$ X) W% L& [2 b
1.你所设置的值(就是通过上面的函数所设置的值)4 G+ ?* p1 P5 m# F! G4 ]
0 V% b3 {0 N+ G# Y' G2 x# ] e
2.列表框的值 |
|