|
|
在ComboBox中改变列表框的宽度 k# D* V4 ]( f6 Y" k2 J$ X
# h: `5 x- G+ l( `2 P: ~7 m& d2002-03-07· ·贾旭滨(译) ·· 2 B* U' M- ?# z5 Q: W7 c0 T. K) W
! g1 J0 W8 I$ V- l4 ~" P: w
2 E" {2 Y+ m: w6 {5 f+ M/ C 我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。 - L% h1 N' j9 @0 ^# ?! ~/ J3 O
为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:
- J8 I' j) h0 M. ^7 K
' G$ A2 [+ S! _& @; E2 AHBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor) 2 ]2 ?( m+ A* o) ^' I' |
{
6 U2 X; I& }, {% k" ` HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);
; U' a8 x. d: G switch (nctlcolor) {
G1 G e1 D; X2 a3 q1 i: v case ctlcolor_edit:
{3 e' k: k' s4 b+ F# S' k2 o/ O break;$ t5 N7 G6 b: v$ Y1 X, O$ D
case ctlcolor_listbox:
3 Y( o/ w; e6 }9 N7 q6 Q if (listwidth > 0) {
+ Z/ p' Y4 P0 E9 p9 \4 C // new width of a listbox is defined- i4 o6 U" H8 q
CRect rect; v! l T( d& Q+ ^" D' r, @
pwnd->GetWindowRect(&rect);
1 }* A& z/ r: b2 i8 c5 W2 x+ r if (rect.Width() != listwidth) {% |5 |. S. [( ~! c- i
rect.right = rect.left + listwidth;
3 x. T0 b) [% f# D% P pwnd->MoveWindow(&rect);
4 z' W3 P" Y4 e' I& |( X }
1 F2 f5 f' h) E. R! r }$ _. |3 ?/ i. X9 v4 C
break;
/ o& N; _' m& e' a }
v" A8 D6 s! T" y8 }! u, ?
6 I1 ~- P; y& `% _* `% }7 e // todo: return a different brush if the default is not desired
0 {0 e" L' Z$ D* G$ s return hbr;
9 O2 F4 \+ ]9 l4 V* y}
$ R; J) S% {5 ?# q8 ?
5 n$ v4 [9 G9 I' e' l. C7 E( e$ ]. b8 r; o
这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。
4 d4 c, a4 u( Z1 c4 V
7 |1 [) F! L7 l; j- ~9 k 上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:
2 d' {4 c# c: r
1 }9 r' Q5 |4 N. D( K3 VCComboBox::SetDroppedWidth(int width); + x' T/ @4 D5 q5 ?( y* Z
" a; a' |* f' V/ n. w: E3 z( J 通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值:
2 I9 ]) u1 u* m! c ]7 \( ?9 l- G9 C% @ q; G5 K0 B
1.你所设置的值(就是通过上面的函数所设置的值)
/ a# ~% f$ e1 d- n7 V8 q1 ^$ m% q R! G" s
2.列表框的值 |
|