|
在ComboBox中改变列表框的宽度 $ H/ d4 L+ P) j0 f- O s
5 {" {/ z3 e/ X- L t! Q2002-03-07· ·贾旭滨(译) ·· & `. g4 r: U. C9 H" X) v
$ Q$ {5 I2 d7 C: x6 g ~" H/ @2 o* Q1 v- v% _* G. y0 l
我们经常会使用到组合框,而组合框是是有2种功能的--下拉和列表。一般情况下,列表框的宽度和选择框是一样宽的,但是我们有些时候确实很需要把列表框的宽度变大,一便让我们能更好的看我们要选的东西。
$ d9 |# x+ }! t7 S0 [4 `* t 为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_CTLCOLOR的消息句柄,或者使用CComboBox的继承类,而且在其中添加下面的代码:/ \! A. n' V+ h
( o% o) n: Y7 x- d, w0 Q2 u# L9 YHBrush tvisualcombo::onctlcolor(CDC* pdc, CWND* pwnd, UINT nctlcolor)
; h2 Z7 T! w2 m$ ~7 R* c. E{
- u' @5 e/ h; p9 ]3 ^ HBrush hbr = ccombobox::onctlcolor(pdc, pwnd, nctlcolor);
2 a; X! d o( a+ p switch (nctlcolor) {, ?4 L5 |% O" L- T0 h
case ctlcolor_edit:! X0 h F2 T0 K3 R. t* ?
break;/ V7 p0 e0 ~* r6 g. k m0 V
case ctlcolor_listbox:
" ^8 @$ d7 u6 T, Y if (listwidth > 0) { 1 I7 o% u, [4 V; {
// new width of a listbox is defined: q, t$ R( P4 r7 j. F
CRect rect;
9 H7 [9 x& S: }! l( z4 V; N pwnd->GetWindowRect(&rect);
- k+ F# ?4 G- ]5 s if (rect.Width() != listwidth) {; y" `$ |1 @1 y% K& M- L# ^
rect.right = rect.left + listwidth;( |+ N) X' I7 ]4 Y
pwnd->MoveWindow(&rect);. `, L5 ?. I& J$ {
}4 g: Z2 W- `! }% W( I. m% E
}3 J- b7 b; l4 Z; I7 }& ]7 h
break;; o1 b$ g2 O Q; A3 y/ \6 R
}
% J7 w2 y4 T: [* w( V) C( m5 X' V1 p" W& A. P
// todo: return a different brush if the default is not desired
v) X* Q8 @1 @9 ^: V- z' \ return hbr;& A/ h Y: l a6 J/ f; D7 G6 m- p
}
$ c- U- s; g, E7 }) d% \2 X1 G$ U
# Y- y% f# C. x0 u( o, n
3 s2 W% M5 Q- e$ _' a- _ 这样之后还没有完全好,你还得刷新一下列表框,那样才能随时根据列表框中的文本的长度,而改变列表框的宽度,要想这样的话,你还得这样,你必须扫描列表框中的条目,还得计算其中文本的长度(通过pdc),这样你如果再刷新列表框的话,才能一条目中比较长的来显示。2 Y& f( J9 ^) t+ |
' N6 n% C' ~3 f: K7 l 上面的方法是通过WM_CTLCOLOR消息来实现的,后来才知道在MFC的CComboBox类中有一个函数也可以实现同样的功能,就是:
o. X! R5 D! ?4 I* E7 ?, p5 M' ~1 u" a+ ^) i
CComboBox::SetDroppedWidth(int width); 8 k% H) |2 S! F0 T: ~5 t& F
8 M$ r, u! O8 S' j 通过这个函数,你可以把宽度设成你自己喜欢的值,而它的实际的宽度是下面2个值中的最大值: " }. ^3 m+ n( b$ x: G: S
6 L3 j& _( f* g1 e 1.你所设置的值(就是通过上面的函数所设置的值)' D P% M5 s( D# w1 _# z i$ Q5 e1 [* f
" e4 s: M) P- H6 `% e% ~
2.列表框的值 |
|