|
|
在ComboBox中改变列表框的宽度 r* f$ c% P9 D5 `& O
* w" c2 _/ J3 i8 [+ [: @5 e$ O
2002-03-07· ·贾旭滨(译) ··
7 N. ]9 O3 s3 d" d% b- ?. f2 _7 c: [6 \) L* {
6 I6 C6 U, X' T; } 我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。 , x8 l/ p3 } }5 n; V- L
为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:
+ {- S; a) b+ ?, e4 r1 u0 |" A
4 v( ^" E, b+ z' l0 u G1 iHBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor) 5 \. H% H/ _( m. S0 X. o1 o- @3 Z0 q
{* K" V% C/ i" c$ S" t
HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);( Z; P( R* g& A8 P9 w6 X
switch (nctlcolor) {0 [. v6 {9 d- J9 q6 o7 R4 T
case ctlcolor_edit:
7 D8 Q' c/ I& I6 I break;
4 `! `" C' q" v1 K d8 p case ctlcolor_listbox:+ _6 h4 Y5 V" V2 Y4 Q
if (listwidth > 0) {
$ V* @& I* o9 f q) J4 n8 f v1 @ // new width of a listbox is defined* C# T$ w# Q' V1 n2 {
CRect rect;4 Z- |' e7 k7 ^# B3 j: m
pwnd->GetWindowRect(&rect);: O2 o3 i/ k, z* K2 R3 h; f
if (rect.Width() != listwidth) {8 w. l6 [7 [: r0 d1 T# {6 W
rect.right = rect.left + listwidth;
- P7 \9 \6 Q9 \3 z- Q pwnd->MoveWindow(&rect);% h% M- r$ l$ W4 v$ Y
}
$ X' L' S; |- E3 K; N, ^$ f$ ? }0 }+ B# n0 _5 C
break;
( X& z# \3 M0 D0 D& }) ~ }* Z; p# l0 C6 A# _4 d- {/ p
# H$ G% n! E5 X* W, P" d0 t [
// todo: return a different brush if the default is not desired
6 @9 s( \% _2 l2 v9 Q return hbr;3 ]4 ~% @+ o+ i; Q6 c
}" d+ T5 j/ Z5 V
; ~) m! R$ G& j0 j
6 C( b" V R9 J) J5 J9 [
这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。
) f8 ]" f" C9 }/ o. U' e' g6 k# G' t
上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:
% r/ k- N5 e- z0 {3 C& T! n9 I, j8 V' X6 ?9 g9 ?
CComboBox::SetDroppedWidth(int width);
7 X# M5 g/ ?" w: m& U
9 H" Z6 ~- ?' k4 b/ u 通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值:
& I3 f: i: S9 r9 I9 D& f
" c; H- k3 K, L: u5 r% O 1.你所设置的值(就是通过上面的函数所设置的值)
$ Q' b5 {% J/ t: m. c2 J$ S6 t5 H+ }. `% X) c7 D6 J% x* |
2.列表框的值 |
|