$ Z. N9 A E' s( j2 C6 E AfxGetMainWnd() ->ShowWindow(SW_SHOWMAXMIZED)* ?; r+ Y, g' R& n, V
//使程序最大化. ! I( v5 x% C0 S, g8 [1 L! n/ m( M- G8 O: U. s
(2) 确定应用程序的路径5 R$ `8 u3 J& t
2 t, o8 M% Q$ s! W D' _" D' r6 o$ a7 H1 `7 s) g5 K
$ t0 k8 d7 {4 {1 S) Q
" E% e0 ] M: \ `" q0 c* a8 W( H Use GetModuleFileName 获得应用程序的路径,然后去掉可执行文件名。6 b) F6 C7 g/ `" f; v* e- Y( H
Example: # c1 H& f* Y, @ TCHAR # {7 n& b( v& ^2 R- y3 X exeFullPath[MAX_PATH] // MAX_PATH在API中定义了吧,好象是# h' O8 c! u+ b. `" K
128, n, f$ P; ~# }6 C# ~; x
GetModuleFileName(NULL,exeFullPath,MAX_PATH)$ Q+ r/ X! e, i$ `- @4 z# z$ E r
' |6 z* Z& u- D5 S (7) 如何改变窗口的缺省风格?2 J4 ~& r5 @) k4 |5 V
重载 CWnd:: PreCreateWindow 并修改CREATESTRUCT结构来指定窗口风格和其他创建信息. $ }# P/ E2 d8 Y( m ' V1 O. b f; R7 d) N3 g; J5 c7 Q' j) U" V4 g" l; i' T9 u7 p. h
4 B9 t$ R$ W6 G1 k- c " O+ ? N# z& T9 e! y Example: Delete "Max" Button and Set Original 3 @# ?( C0 e& v( [ Window's Position and Size% N' h: M2 e! O& U. f( u
% B. H% m- v# ]- n7 m BOOL CMainFrame:: PreCreateWindow; P, \; I0 w/ R* ^6 n
(CREATESTRUCT &cs)! O# T1 k% }) A0 c7 v
{: E2 v6 n* w% P, U6 J$ P8 V# o1 a
cs.style &=~WS_MAXINIZEMOX 0 l- I" ?, ^ e @3 H$ p* l' l4 P 9 w* d2 o" a' h1 `6 R O cs.x=cs.y=0 4 O$ S9 o. b1 | cs.cx=GetSystemMetrics(SM_CXSCREEN/2) / C& A. w& V: `5 g# h cs.cy=GetSystemMetrics(SM_CYSCREEN/2) & K3 J4 F3 s( ^$ D% o# c1 \8 d' `! ?$ m$ {: c
return CMDIFramewnd :reCreateWindow(cs) 0 U, G! E/ u8 G) y6 f } 3 ~& c$ `9 S0 G7 f 4 T2 D2 s$ N. s4 u% K8 I9 Y$ {(8) 如何将窗口居中显示? 8 \8 r* ?7 u8 N, E' G/ [( _3 [& a4 |0 `; j
: I2 G! _; Y$ I9 u- v" c7 E7 Q2 b7 J 5 F7 R* S& F4 B- a( Y' Q7 P( m( Q3 ]) B* u# |/ N3 q1 v
Call Function CWnd::$ Z1 k& M/ {) ]
Center Windows 9 K7 f$ ~- y7 p+ X( W2 l! A# L. n! T$ T- ^0 I& x1 E
Example(1): 1 X# T, H9 H: v4 s: d1 {, e% @ Center Window( ) //Relative to it's parent. J+ v3 \5 x& p* Z! E# P
// Relative! E- ^4 F7 y- O+ s: h
to Screen. o, v# y) r/ C
Example(2): - i' v6 N# `/ U8 Q% c Center Window(CWnd:: GetDesktopWindow( )) ; E: Z9 U# B" z; {! ? //Relative to* O, o; K/ }, t
Application's MainWindow" V$ i$ Z7 l& q( G% E+ E
AfxGetMainWnd( ) ->) P. O' i! G4 J
Center Window( ). t- W$ w) E- i( c+ V
. H6 f1 m. T! t8 a0 _7 H* O
(9) 如何让窗口和 MDI窗口一启动就最大化和最小化?, P0 J& g# u. i' j8 S
先说窗口。9 r& l: o3 O9 L8 l/ m/ ^: A
在 InitStance 函数中设定 m_nCmdShow的取值. , n; ?4 u" V$ z9 X$ C/ |# q 3 m# E+ ?2 ?- e' x* M( z$ I+ k& X3 F! \7 T
9 O$ n) I% i3 Q; D- `) {1 }
5 F% o% U; a# V! A: z) G P m_nCmdShow=SW_SHOWMAXMIZED //最大化 " x$ Q. A* I/ ?# e- u" _: m6 _7 _ m_nCmdShow=SW_SHOWMINMIZED //最小化4 }3 N2 _, f1 Z3 l# W6 W
m_nCmdShow=SW_SHOWNORMAL //正常方式 ( l5 M D1 @" | ^9 j8 [1 Z 5 g0 w: G! ?( ]. k) c; p( I MDI窗口:& b, m* }- `6 b) _. ]& }, o
如果是创建新的应用程序,可以用MFC AppWizard 的Advanced 按钮并在MDI子窗口风格组中检测最大化或最小化还可以重载 MDI Window 的PreCreateWindow函数,设置WS_MAXMIZE or WS_MINMIZE 9 H$ @7 u) O, F: H) E1 `! n# ~, t
如果从 CMDIChildWnd派生,调用 OnInitialUpdate函数中的 CWnd::Show Window来指定 MDI Child Window的风格。8 {7 F. ]5 w9 G
9 e! C0 w. c1 M+ r. U (10) 如何限制窗口的大小? ) |' n% g# G6 i. S+ T( ]' ? 也就是 FixedDialog形式。 Windows发送 WM_GETMAXMININFO消息来跟踪, 响应它,在 OnGetMAXMININFO 中写代码: ! h/ h- l* f# D9 ^/ I5 |9 N7 s9 e \" M8 a l. |
(11) 如何使窗口不可见? 3 l' r8 I/ @4 g0 i5 R) ^- Y0 F6 E 很简单,用SW_HIDE 隐藏窗口,可以结合 FindWindow,ShowWindow控制. $ L9 ~. c7 Z, |7 H2 x" h8 F6 A5 L# m( m
(12) 如何创建一个字回绕的CEditView " j- z2 w5 I7 K4 V 重载CWnd : : PreCreateWindow和修改CREATESTRUCT结构,关闭CEditView对象的ES_AUTOHSCROLL和WS_HSCROLL风格位, 由于CEditView : : PreCreateWindow显示设置cs. style,调用基类函数后要修改cs . style。5 @' w6 c% s1 H& f9 \$ }
- q& @1 E5 C3 o8 d 1 e! g7 q1 Z( m) p) X : L2 A, r3 j$ D+ M$ F9 a; Q! v 0 o/ V" g9 U h5 H( Y# {- |! M BOOL CSampleEDitView : : PreCreateWindow (CREATESTRUCT&cs) n: ~; A! @+ V* N ` {) I+ r$ h& J" J, }2 h. l) Z3 j
//First call basse class function .: |7 C" X; Q" K5 |+ l7 _% Z9 ?
BOOL bResutl =CEditView : : PreCreateWindow (cs) 7 S, p# Y# D; g F) z s }- B* l) u3 y* v/ i9 \- Z4 H
// Now specify the new window style .0 N& t5 j# |4 Z- I# p# j8 T
cs.style &= ~ (ES_AUTOHSCROLL |WS_HSCROLL) # o8 v0 K& Z& f return bResult 7 U' b) c2 P% I! k } & \) U+ b. u2 B# O7 T: I# ?) [ 5 {. }; B5 C$ C, l4 r* {1 u (13) 如何使程序保持极小状态?0 P# G# Z# ]5 t' T
这么办: 在恢复程序窗体大小时,Windows会发送WM_QUERY-OPEN消息,用 ClassWizard设置成员函数6 W! h1 g; p" w+ T0 G: M" l! }( w( k
C3 X8 c. T3 M. k, W0 M% `' Q8 G. P5 S# `
7 t2 V0 {; K( O9 u9 C1 h# X5 G
) i' _+ O9 k# s6 {8 A4 m- D: [ OnQueryOpen() ,add following code: 4 E, a6 z" g+ e" P3 J* ^ ; y( ?, W, y0 a+ |$ F Bool CMainFrame:: OnQueryOpen( )/ V3 R4 E9 V$ Q6 E
{( | c! {) D; i p6 ~, d
Return false 2 f* ?* x0 E8 P u5 P( k( x& P7 y } 8 R% I3 x, U+ K, u % z2 X" x8 E" e( e1 @: z (14) 移动窗口 5 _% D5 e8 J( f) e. `# {. A1 j 调用CWnd : : SetWindowPos并指定SWP_NOSIZE标志。目的位置与父窗口有关(顶层窗口与屏幕有关)。调用CWnd : : MoveWindow时必须要指定窗口的大小。 $ H* s& p- z! C5 p/ ]$ Z) \) g8 j7 `6 o/ x" c; N! M
5 T0 F2 P8 m# u4 q 9 v; s5 k) D3 z$ h/ l* ~2 G/ }! U0 e2 S6 C
//Move window to positoin 100 , 100 of its parent window . 0 Q% j( t1 j/ `% u SetWindowPos (NULL, 100 , 100 , 0 , 0 , SWP_NOSIZE |SWP_NOAORDER) 5 q ^( e$ O* f0 g7 k8 A$ h7 o' ^5 v/ a
(15) 通用控件的显示窗口 9 ]0 i: d5 b( _3 _ MFC提供了几个CView派生的视窗类, 封装了通用控件的功能,但仍然使用工作框文档显示窗口体系结构:CEditView封装了编辑控件,CTreeView保持了树列表控件,CListView封装了列表显示窗口控件,CRichEditView可以处理多种编辑控件。 4 Y3 o1 T% f; I p) f$ A8 {, {: L- A
(16) 重置窗口的大小; t( K$ k+ e# K+ N8 c j8 W6 {
调用CWnd: : SetWindowPos并指定SWP_NOMOVE标志, 也可调用CWnd : : MoveWindow 但必须指定窗口的位置。9 y$ X; t0 C/ ~1 i0 g3 Y0 U& q; @
" {& c% Y l1 G/ ]% W
4 _: ]% X4 X# ?& V
2 s+ a' `" Y6 c* I6 b
4 J0 j3 K! O2 G1 C" [( o
// Get the size of the window .1 _: ^: f$ o6 s5 ]& `
Crect reWindow6 P& ]& J; o5 y, Z- z3 Q4 F% X
GetWindowRect (reWindow )! K2 F& w/ X. N x$ I
; {2 u( t6 v: B# n8 r //Make the window twice as wide and twice as tall .3 x6 Q( M: |8 D5 }7 k
SetWindowPos (NULL , 0 , 0 , reWindow . Width ( ) *2, ! M& }6 Q- ]& a7 E3 G" R1 z, y& j $ x3 Q" j& K- s z reWindow . Height () * 2, : S4 J" O7 b F/ I3 [1 z! F SWP_NOMOVE |SWP_NOZORDER ) % {( K9 q2 z% I - t0 m% }& P; u `# }$ W (17) 如何单击除了窗口标题栏以外的区域使窗口移动- `" S9 U! I' z% P) b" P
当窗口需要确定鼠标位置时Windows向窗口发送WM_NCHITTEST信息,可以处理该信息使Windows认为鼠标在窗口标题上。对于对话框和基于对话的应用程序,可以使用ClassWizard处理该信息并调用基类函数, 如果函数返回HTCLIENT 则表明鼠标在客房区域,返回HTCAPTION表明鼠标在Windows的标题栏中。. `1 w& D( T* C& j9 i. Y8 y: w6 e' D
, e& g- V- f$ J, T# j
# X5 w1 R+ \$ y" I/ A5 k5 \6 I8 I) d: a, J$ p& v* J7 P1 L
* Q1 G Y E/ m! I+ R. H UINT CSampleDialog : : OnNcHitTest (Cpoint point ) * @! R0 a$ ]# F6 N { / L }, E) w( O7 G/ O+ @8 Z4 ?9 j( l UINT nHitTest =Cdialog: : OnNcHitTest (point )' G, J. H8 r C+ ]. a
return (nHitTest = =HTCLIENT)? HTCAPTION : nHitTest + D/ n( v7 |* \( s } * L1 }. f2 {+ H* ~0 ^% _% _2 e, N4 ]+ j0 x9 R4 n5 E
上述技术有两点不利之处,4 D9 H. ~7 n; @, y' [
其一是在窗口的客户区域双击时,窗口将极大;1 ?; H2 n5 w2 c1 }3 P
其二, 它不适合包含几个视窗的主框窗口。 1 \4 e- P( I" C. H/ @ 还有一种方法,当用户按下鼠标左键使主框窗口认为鼠标在其窗口标题上,使用ClassWizard在视窗中处理WM_LBUTTODOWN信息并向主框窗口发送一个WM_NCLBUTTONDOWN信息和一个单击测试HTCAPTION。 , D+ c" J P/ t8 X7 x `5 ?1 k. p5 N0 |6 b
. r/ E1 V; a0 e. H# n
8 Y+ ^* J( c* {2 f- d 8 z3 r8 v& z: `. g void CSampleView : : OnLButtonDown (UINT nFlags , Cpoint point 5 Q6 G9 A& q& O/ t )9 I* H+ p# e0 b+ K5 ?" ?1 c
{( c0 P% b" R( O& m0 E$ i( N
CView : : OnLButtonDow (nFlags , pont ) 3 p. ]4 Y, g' e: Y! P& D9 M$ p1 W; B# p! N' h) j8 s% j$ R! c
//Fool frame window into thinking somene clicked: m, H! h/ E/ G: N4 T" ^- p
on ' Z7 j3 t6 U8 L2 y8 W% ~2 k its caption bar . ! k) h: ?3 ~8 S0 x$ s+ q GetParentFrame ( ) —> PostMessage ( ! u6 m; ~% E- w, A( s9 D _6 w WM_NCLBUTTONDOWN , # N$ w" @" N5 E. h/ ]* T HTCAPTION , MAKELPARAM (poitn .x , point .y) )9 A! ?0 I% Y1 I* H/ q
3 Z" v: R) C0 U- a7 }. F } $ ]. K/ h2 m4 @- O# P) {* P + ~! e0 m; k j& [! }- f1 E, T: l, ^3 L$ T+ L7 Z9 V
该技术也适用于对话框和基于对的应用程序,只是不必调用 / M* x9 a( L- a5 \1 J( N X- V) s: O8 d7 }2 b
1 U" s) j8 X* O. @
8 g7 U$ Y! ?- `
7 a2 R; e2 x/ {0 k' D6 s i CWnd: :GetParentFrame 。+ C! i K, v+ Z* L k
void CSampleDialog : : OnLbuttonDown (UINT nFlags, Cpoint point )# p: ^- q6 m5 W# w
{ ' ? R4 m, X* P/ }; f9 X Cdialog : : OnLButtonDow (nFlags, goint ) & t1 F6 r; `/ [/ W0 h //Fool dialog into thinking simeone clicked on its; j6 J. s# y; y: ~7 N* A% q+ _
caption bar .# S6 ?: b: K$ P0 G6 S
PostMessage (WM_NCLBUTTONDOWN , HTCAPTION , MAKELPARM (point.x , g' ~" ^1 N8 ?2 D7 ^ , point. y / J: c% u& A5 ?( G' ? ) ) ' h$ @0 [" Y) w7 }/ H: U3 T- T' x }1 _9 A. ?- x6 d& m! ~
9 e# r% p C( B3 }* u
(18) 如何改变视窗的背景颜色# x8 U+ e& e: g( R9 C& {. E
Windows向窗口发送一个WM_ERASEBKGND消息通知该窗口擦除背景,可以使用ClassWizard重载该消息的缺省处理程序来擦除背景(实际是画),并返回TRUE以防止Windows擦除窗口。( p3 M( l- w; M! J7 F0 y8 X) T
( x- @% o: l) l ~ 3 m/ ^& k w- y0 C( b5 C1 A( |8 u5 J' l, @) a
! c* }% p& C! S9 c4 y9 S
//Paint area that needs to be erased./ G8 [2 ~4 Y* k- V: \6 O: J
BOOL CSampleView : : OnEraseBkgnd (CDC* pDC): B. Z5 H- m D/ _) T
{! f$ F7 z+ a( P! C: H$ T
// Create a pruple brush.) U1 P% L4 A' O2 c6 M, e3 V
CBrush Brush (RGB (128 , 0 , 128) )( M9 d H n$ i5 @ @
* z2 J6 |3 q _ d: I, f
// Select the brush into the device context .: Y+ c6 Y9 ?* w& \& y. ~* f
CBrush* pOldBrush = pDC—>SelcetObject (&brush)$ i; w3 z7 e: D1 S; |
5 }, {5 q$ R0 |( e% E* G1 T // Get the area that needs to be erased .7 l0 f" B& D+ d& R3 m- ^
CRect reClip( M6 L- \5 C. N3 m; | i u6 B# V1 z ^
pDC—>GetCilpBox (&rcClip)7 I: L1 I: W" I4 D6 t" b
//Paint the area.7 X7 h+ s& A% ^9 T8 O
pDC—> PatBlt (rcClip.left , rcClip.top , rcClip.Width ( ) , rcClip.Height( ) , PATCOPY ) + F9 @+ {: {5 v z# g" ]# |( n3 {" J, _
//Unselect brush out of device context .% n6 E# Z* k6 B" u ?4 Q" Z
pDC—>SelectObject (pOldBrush ) % ^3 B. q' [ m U ' [3 e. J1 V6 [. o% V( F5 { // Return nonzero to half fruther processing . 4 A0 `" }; i! @, M return TRUE 2 U$ F' y. g) j/ G: d1 ` } 0 Q) ]# o* p5 H0 k; |' P9 [+ S( L. V
19) 如何改变窗口标题7 z9 v/ E' K& x% e6 C& s0 _
调用CWnd : : SetWindowText可以改变任何窗口(包括控件)的标题。; f) j# ]9 [# Y3 K% }
: S! g' V/ J2 K$ | # c) D! p! G4 Y6 x 3 E, l# ^. \0 u ; r0 n0 T" r8 P: ~) q //Set title for application's main frame window .3 b) M7 v/ ~9 e" p8 z
AfxGetMainWnd ( ) —> SetWindowText (_T("Application title") ) $ m: M/ m: Z. r, }! N( X; t; \. y ( ]7 g% t0 w6 z- v, y" W9 p% ?3 H //Set title for View's MDI child frame window . ) m! G) i5 Z& k- C; J. I _2 n GetParentFrame ( ) —> SetWindowText ("_T ("MDI Child Frame new title")( A J* S) ]7 M5 m" U/ w
)+ I& m0 X( n7 C
# c" a( T5 N; G* j
//Set title for dialog's push button control.- V9 j6 z3 l+ _5 `
GetDigitem (IDC_BUTTON) —> SetWindowText (_T ("Button new title ") ) 6 m$ W8 X8 b* y P3 s1 J; l6 f: e( H. g; ]* G5 c, K
* A7 ^' l* C1 g: z2 _+ b& M7 A `5 r
如果需要经常修改窗口的标题(注:控件也是窗口),应该考虑使用半文档化的函数AfxSetWindowText。该函数在AFXPRIV.H中说明,在WINUTIL.CPP中实现,在联机帮助中找不到它,它在AFXPRIV.H中半文档化, 在以后发行的MFC中将文档化。, e$ w: r3 `3 Y3 {
AfxSetWindowText的实现如下:: `) R# ?4 ?- y3 ~3 A( q5 D' g3 M