|
|
在ComboBox中改变列表框的宽度
8 |' e0 f; K/ e/ O5 U5 {$ Z: v+ P( {; r8 m2 f8 W |) C
2002-03-07· ·贾旭滨(译) ··
/ e9 H# d" w) D; ^6 C/ [" ]) L H4 [- Q# y+ L( x
9 i5 t8 f! P- `& m6 b6 z- n
我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。 & C: i: d) y- U( G( T
为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:! t. _! U5 N; [" n+ d
* T3 K7 r/ Y7 e0 x6 S- O& ]HBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor) 2 Z* c8 x9 k4 Y# ?( Y6 q
{, W# f8 Z9 F+ b' d& \# y0 K% c
HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);1 Y* D8 E6 ~7 r# C
switch (nctlcolor) {
9 _ {; X1 Q1 ~+ r3 t! u case ctlcolor_edit:
& y& E1 u d" \+ \ break;8 o8 D3 A! p/ t
case ctlcolor_listbox:0 @% C* D0 S1 C
if (listwidth > 0) {
4 H" P% R3 Z: U // new width of a listbox is defined+ I7 K" M( O( z/ b+ S' {9 _" I! o% w
CRect rect;
; T! @ o& D4 Y3 a( ? pwnd->GetWindowRect(&rect);4 i, S" |6 S: T/ e/ n
if (rect.Width() != listwidth) {
0 U$ z* z! [" H# m: D rect.right = rect.left + listwidth;
0 N8 b7 z' w6 R5 r; V8 O# g pwnd->MoveWindow(&rect);' Q; n; K% O' y5 G
}% }$ w- _6 f. D/ s) F5 Y
}
' K% z# q. q. L9 N3 E0 v6 z7 m break;: H6 {9 t7 S4 z! j: H2 K
}! ^3 l9 [7 `: L2 M' C
1 o, S& ^6 { k' Q( K // todo: return a different brush if the default is not desired9 c& N. W: j2 E6 ?
return hbr;
, z1 f7 z& x2 f9 ^ P" m; C( j}
4 s7 h( h% y- h
* U$ c5 ~; M, a; E7 ^0 _9 L: u" E# E0 ^, P: f
这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。
( u. \6 s" q6 P; K5 F
# _3 E- s6 v( P$ y P. } 上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:8 A/ C# t% ^7 q
0 }+ O3 H! R7 R' H9 R; N/ pCComboBox::SetDroppedWidth(int width);
& `' B* n7 L2 F: ?6 `) [) e7 i/ ?$ t8 D, \0 Z8 D# l$ k
通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值:
+ {3 I' ]% o: T; T2 Y5 f$ m; [2 U' W
1.你所设置的值(就是通过上面的函数所设置的值)9 n- h3 _& u) ^8 h1 }2 Z
6 A5 M# K) I$ }; M3 `& h, W2 ]
2.列表框的值 |
|