4 c6 U% @% ~# M; n9 {4 _6 P+ G) E7 M/ _$ r9 l
, N# J; S) z) S3 S5 u
9 l) h3 c$ l1 l
AfxGetMainWnd() ->ShowWindow(SW_SHOWMAXMIZED): e p* [. w( |( h, }
//使程序最大化.: E* {8 u a1 \1 h3 g8 r1 X7 q
/ E$ u" r3 T( c. W0 e (2) 确定应用程序的路径 $ _8 b6 c$ G: U' v $ l3 `: c& m9 s8 ~: `9 o! C & ?: p3 u; h+ R9 H$ H! t 5 b5 v) T O/ P) C' T: k& A% A2 P/ e8 f3 |) Z! M* @# [
Use GetModuleFileName 获得应用程序的路径,然后去掉可执行文件名。! j; g/ F. w, H, N
Example: ! r6 ^4 f X" v5 t0 M TCHAR3 E; M9 l8 x% ~* {
exeFullPath[MAX_PATH] // MAX_PATH在API中定义了吧,好象是 4 [- O+ V9 [4 v" |) ` 1283 p: k; G7 M# W2 w, C' F8 a3 k
GetModuleFileName(NULL,exeFullPath,MAX_PATH) 8 o# Z. H. x1 S4 K# i" x# y) V# k5 P8 h. Q/ G
(3) 如何在程序中获得其他程序的 图标? . k) T P3 q/ m4 P( p 两种方法:( B9 ~$ x* N$ t% u: h* b0 J* L
(1) SDK函数 SHGetFileInfo 或使用 ExtractIcon获得图标资源的 handle,( H7 W( p1 b/ O" e& @: R4 E" ~
(2) SDK函数 SHGetFileInfo 获得有关文件的很多信息,如大小图标,属性, 类型等. / V3 c7 F! V! B/ ? I Example(1): ( F% t' I) E+ w$ u" V2 P! u) X: D 在程序窗口左上角显示 NotePad图标. 1 W) R) o' J4 p- Q1 E: A! M 6 F5 I; h x* M+ H+ I: r0 ~ s2 p& Y5 Q! g k* P/ h' e5 n
8 @/ R9 ^6 H' g ! [1 @8 Q" v ?- }) a void CSampleView: - n: F1 A# }- D5 J. X2 q& f4 t* e OnDraw(CDC * pDC)" ]0 I* s; H, _
{ 5 V/ ~8 H" r( p+ `% ] if( :: SHGetFileInfo(_T("c://pwin95//notepad.exe"),0,' n R" s# i1 {' {: G. b8 j5 w- p# N! J
&stFileInfo,sizeof(stFileInfo),SHGFI_ICON)) % `+ |0 c" Q7 m5 o { 4 s1 m! ]0 [- a) }# ?: F pDC ->DrawIcon(10,10,stFileInfo.hIcon) 9 L$ d( e3 Y+ x; T }* O2 `$ J! e: m9 w6 p, u3 b6 j9 `: F
}' h+ V' @. ]. s* \* s( `% }
Example(2):同样功能,Use ExtractIcon Function / ^ u6 G5 p3 |7 E7 N void CSampleView:: OnDraw(CDC *pDC)6 I( r5 A9 w/ Z, t5 {# A
{5 M; W6 g: v" h. |' \
HICON hIcon=:: ExtractIcon(AfxGetInstanceHandle(),_T ) E( X9 b: B1 K4 P# z ("NotePad.exe"),0)) k# b! x2 O4 v* K) l0 }* j! A0 L
if (hIcon &&hIcon!=(HICON)-1)3 c w* |& \( U( c0 n
pDC->DrawIcon(10,10,hIcon)7 A% z. R5 z5 x N8 E" x8 U
} 5 ]' L( W9 N1 O: ~7 f1 p% x! T3 H2 Z! P N# }+ z# K
, R% u; @7 w* v7 [ 说明: 获得notepad.exe的路径正规上来说用GetWindowsDirectory函数得到, 如果是调用 win95下的画笔,应该用访问注册表的方法获得其路径,要作成一个比较考究的程序,考虑应该全面点.( p3 w" z' |- L! Y0 _" C n
3 h. `- F$ U+ ~, Z1 A (4) 获得各种目录信息 ! X& |! n: e, c$ d2 r0 J' M Windows目录: Use "GetWindowsDirectory"* {, o) Y0 Q+ W/ Y; q
Windows下的system目录: Use "GetSystemDirectory"5 x j9 W# Z) p E: Y3 ?$ d
temp目录: Use "GetTempPath" b% z/ ] K i4 F 当前目录: Use "GetCurrentDirectory" - W$ j8 q) K& z1 x; X1 |1 Z; i* m) w p3 C* i& D* Y f7 A
请注意前两个函数的第一个参数为目录变量名,后一个为缓冲区后两个相反.; E3 h/ [: E+ P, C
( j& d$ H9 C# m. B
(5) 如何自定义消息 & s1 W. G f2 Z, G, E% |/ ^& x0 ^ 1) 手工定义消息,可以这么写 : U, b7 x9 B, }, W+ p. R( \ 7 c) H: P+ Q3 [; }# h' ]- ] 1 `; f6 ?) U, v7 A6 \# c9 I8 I) C5 [8 J1 C
% r1 y& ~" \7 M- i- r
#define WM_MY_MESSAGE(WM_USER+100), ( T4 S2 h8 j6 z3 o* }, c+ t' g2 ` P# j
* x s/ t5 r+ V. U
MS 推荐的至少是 WM_USER+100# g% i4 g7 c ~! Y0 q; U
0 v) t& I q7 h$ ?$ |; Q, ?8 R) ^7 w9 i (2)写消息处理函数,用 1 c* V* b7 e& p. E0 U 3 u7 I" S' \! z [. n3 W2 d" V1 }( K6 I3 z
" e, k& b2 K& W [! h
# A/ C# a# [" [
WPARAM,LPARAM返回LRESULT. $ F* g8 Q3 {4 Y) B! j LRESULT CMainFrame::OnMyMessage(WPARAM wparam,LPARAM lParam) U: ^0 G' m0 \% o
9 i# Z1 X' m' W1 O, O& Q5 j
{ ) _4 n6 \4 a5 d( h, V9 c' F temp目录: Use "GetTempPath"* p3 ~2 p3 T6 y, U2 C* }
//加入你的处理函数 irectory" # J7 k3 T2 h7 ]1 |0 F/ o }$ |+ Q- C& A( K, D2 X
4 r' t& K& t0 _! R+ L" N1 x
(6) 如何改变窗口的图标? 8 T) w9 ? ?6 E' V+ E 向窗口发送 WM_SECTION消息。 P+ V4 W3 {! F& x
" ]! V% F, {( f" X; c8 e. `4 p; i% g6 g
/ O% x. _* S" I e: o7 S0 B ( x' S2 l- X# F8 N0 P3 w Example:" [& d5 B7 n) |- I% P( Z; Z
HICON hIcon=AfxGetApp() ->LoadIcon(IDI_ICON) 8 L9 S3 Z; N# r4 ~0 ^% R ASSERT(hIcon), w U0 X x0 L2 j( n/ F
AfxGetMainWnd() ->SendMessage(WM_SECTION,TRUE,(LPARAM)hIcon) * Z: i$ X, U4 K+ T : _5 q, v6 A2 L3 L. @% s/ ]" s (7) 如何改变窗口的缺省风格? 3 B& ^% g2 W1 i0 ~* P* T. ]5 w 重载 CWnd:: PreCreateWindow 并修改CREATESTRUCT结构来指定窗口风格和其他创建信息. ' P* V: V' O+ R" o3 t( E7 l * }: ^8 Z5 {* v/ F, W3 x' ] " i) H- w8 \. Q: C' B- S6 `* J2 u2 }0 r# g8 Z
. e- c* N& i' |2 r4 F Example: Delete "Max" Button and Set Original# w/ s) Q- v# L: h: B+ M( J
Window's Position and Size 9 P7 k# O" w, s( b+ R u9 Z6 p$ n) R* O* {' _& s) i
BOOL CMainFrame:: PreCreateWindow* o8 L( T( E. ]3 Q
(CREATESTRUCT &cs) % e% k7 `7 \1 ]8 x8 C { $ T" |7 S* O1 n- I% c0 E cs.style &=~WS_MAXINIZEMOX6 v2 {' u3 p" g+ a
7 o4 w: f5 N; M% j2 j
cs.x=cs.y=00 s2 j0 o y6 x3 S, H# K
cs.cx=GetSystemMetrics(SM_CXSCREEN/2) % v! g2 z3 S; p7 E cs.cy=GetSystemMetrics(SM_CYSCREEN/2)3 |5 B& ^; S! L P
1 B" Y3 [7 g! P% u: T return CMDIFramewnd :reCreateWindow(cs) 5 q( C9 j8 e, x }- k6 p2 _6 T* R
: D% I8 U5 C8 R) U( u
(8) 如何将窗口居中显示? : h$ y8 F; `9 y1 L 0 _7 N: |5 ]5 n3 ~ n4 a ) U: t3 t* p' j, d$ h2 {5 R& w& o, H0 H* Z. {
! k$ b6 F8 Z3 `3 W
Call Function CWnd::/ e6 X* a5 \+ {0 {
Center Windows4 J4 V2 a0 D" y: D% N7 T
) d6 A0 T3 a7 i Example(1): 3 f' _, u+ K% y2 O h1 W- G Center Window( ) //Relative to it's parent1 K# P# h! d1 i, s Q2 o% V8 D. `
// Relative % g3 }6 m- Y& K: [5 }9 Z to Screen - y. H) R; I. t. l4 t Example(2):1 t9 Z5 i- t. f" u, E; `% ?2 U/ ~* n
Center Window(CWnd:: GetDesktopWindow( ))2 s g0 Y9 p: a. T
//Relative to 5 _+ Q$ X& i6 }+ T6 B Application's MainWindow 7 k6 p' X4 W# i) v( M6 c' G AfxGetMainWnd( ) -> 8 m$ U: L& ^* x! f2 k Center Window( ) ; J# j% Z! [4 @ ~; C! w) J- w, P4 A: y( n8 g) x( w
(9) 如何让窗口和 MDI窗口一启动就最大化和最小化? * @9 q C8 L3 @) \$ ?% Q* @ 先说窗口。. x; n' s& G8 s" F/ n
在 InitStance 函数中设定 m_nCmdShow的取值. 1 B4 E. P' G* K+ S4 Y; A. ]" t4 D0 i$ u3 K5 {4 I9 a+ E: Z3 K
) @4 s# {' V; h( c: x
$ c/ u4 K8 j4 L5 h) ~+ L " X8 h/ K! C9 H. i$ Z; m }. D2 N) m m_nCmdShow=SW_SHOWMAXMIZED //最大化 1 Q' `0 N" K9 E( @ m_nCmdShow=SW_SHOWMINMIZED //最小化 ; |" I8 o: q4 F L1 g8 s m_nCmdShow=SW_SHOWNORMAL //正常方式 ; Z. G9 C8 V- T) e% d9 W' V' ^: G" v3 F- j9 Q' M9 o
MDI窗口:& s6 a! h2 O8 k
如果是创建新的应用程序,可以用MFC AppWizard 的Advanced 按钮并在MDI子窗口风格组中检测最大化或最小化还可以重载 MDI Window 的PreCreateWindow函数,设置WS_MAXMIZE or WS_MINMIZE & J" C& {5 h) Q. K! A0 L9 t% c4 k+ o, {* u) {8 b
如果从 CMDIChildWnd派生,调用 OnInitialUpdate函数中的 CWnd::Show Window来指定 MDI Child Window的风格。 % p: O. w6 g) Y" H# j ' b p/ T- e0 L (10) 如何限制窗口的大小? & K3 f7 B1 L2 V4 ~+ @, i 也就是 FixedDialog形式。 Windows发送 WM_GETMAXMININFO消息来跟踪, 响应它,在 OnGetMAXMININFO 中写代码:1 Y# \7 S$ I+ D8 ~ E
P4 V0 t% g; Z! i- F: O$ ` F6 L+ Y
(11) 如何使窗口不可见?* a* }$ i- V; [" F) j0 o- _
很简单,用SW_HIDE 隐藏窗口,可以结合 FindWindow,ShowWindow控制. . x+ t8 _ m. y9 N" k: g* R3 g# J3 l9 d) c
(12) 如何创建一个字回绕的CEditView # \+ A. `4 D. t" u" T. p+ N 重载CWnd : : PreCreateWindow和修改CREATESTRUCT结构,关闭CEditView对象的ES_AUTOHSCROLL和WS_HSCROLL风格位, 由于CEditView : : PreCreateWindow显示设置cs. style,调用基类函数后要修改cs . style。 / ~# h7 r/ h; T9 p/ k4 Q5 w ! M' D. P# H0 ?" c + X4 \5 ]' ?8 r" o' I) ?+ {! b # E9 H3 K3 v( @( A $ k" I) d: V! r* X* s BOOL CSampleEDitView : : PreCreateWindow (CREATESTRUCT&cs); `5 \+ I6 d6 y7 ^, O7 X" M& H, ]
{ ; e! t2 }$ v8 t) K* e6 h0 } //First call basse class function . s' D! l& I3 O( c W) y
BOOL bResutl =CEditView : : PreCreateWindow (cs) ' Q F! H( B( r9 ? ]+ q3 U' C: I 1 e- p: ` D6 g$ \6 { // Now specify the new window style . 6 y: ~, @( S4 p' F) e. c9 { cs.style &= ~ (ES_AUTOHSCROLL |WS_HSCROLL) ' d* _' Y# E ]2 D6 g8 ^ return bResult 6 e4 R" H, s5 |* m- [* V } 5 p7 D1 R2 z: [5 @: j4 X s3 v" R- [' Z% c: S7 x1 V- d
(13) 如何使程序保持极小状态? 6 j% s) b% X9 s ^$ h1 Y 这么办: 在恢复程序窗体大小时,Windows会发送WM_QUERY-OPEN消息,用 ClassWizard设置成员函数/ Q- W5 B# s; q. a6 E
* |& ?! S# v1 `7 ?: g% Q, h //Get pointer to status bar . $ z+ j& b# K0 K7 @4 O% s1 D CStatusBar * pStatusBar = (CStatusBar *) AfxGetMainWnd ( )$ m: V( g+ p1 G! [; g V* L
—> GetDescendantWindow(AFX_IDW_STUTUS_BAR)4 I8 n+ m+ K5 g1 s
9 i1 S# M4 a/ ~
//Get pointer to toolbar . , O# K9 T" y3 @" C CToolBar * pToolBar = (CToolBar * ) AfxGetMainWnd ( ) - k6 n; _* i4 [8 [3 V5 V; D —> GetDescendantWindow(AFX_IDW_TOOLBAR) & W4 [8 M( u7 }0 P# | 4 l' L! L. W5 O! C# C' m% u6 q (23) 如何使能和禁止工具条的工具提示 9 Q6 A1 o# `6 ~1 k: X 如果设置了CBRS_TOOLTIPS风格位,工具条将显示工具提示,要使能或者禁止工具提示,需要设置或者清除该风格位。下例通过调用CControlBar : : GetBarStyle和CControlBar : : SetBarStyle建立一个完成此功能的成员函数:1 [5 |6 H5 z2 H* u2 y
5 u! p+ O7 e! @4 E# N
3 j- K5 z }- n" [6 Y h3 E; n
) q% C/ T% P' Y7 F6 D7 ]- O6 t2 _+ _
void CMainFrame : : EnableToolTips ( BOOL bDisplayTips ) 6 H4 n1 N7 d% o1 c { # P0 d3 @; R$ V" _ ASSERT_VALID (m_wndToolBar) 6 U, k" G- l8 G; }8 q4 ^% I8 z0 Z0 k- i6 B! T: E
DWORD dwStyle = m _wndToolBar.GetBarStyle ( ) 4 _& R% p. G7 R d0 R# D3 [ ) `! k% F, d: n if (bDisplayTips) dwStyle |=CBRS_TOOLTIPS w" `# w' u* [& e! ~1 w
' r( r+ U' a6 F* H else$ E c! F4 Q/ N8 C0 |" D; [
dwStyle & = ~CBRS_TOOLTIPS9 L. x6 C4 N. X/ r4 o" f1 m
* X2 H3 D7 o6 }- u m_wndToolBar.SetBarStyle (dwStyle )/ D$ h3 T' ^1 Q# _1 k9 J. f" f" f
}2 e3 J7 ^ s9 E9 D6 A# `9 Y
6 ?3 I$ u7 }) I* @0 e& a% W
(24) 如何创建一个不规则形状的窗口% O# u; L8 a: ?0 u, P2 e
可以使用新的SDK函数SetWindowRgn。该函数将绘画和鼠标消息限定在窗口的一个指定的区域,实际上使窗口成为指定的不规则形状。 使用AppWizard创建一个基于对的应用程序并使用资源编辑器从主对话资源中删除所在的缺省控件、标题以及边界。5 z# w6 [$ r; i! Q# a M$ C
给对话类增加一个CRgn数据成员,以后要使用该数据成员建立窗口区域。. k4 }" D3 k& O+ Q; ~* E- k
# m& q3 A( K+ g& z" s+ O
5 _3 H4 ^6 m) e% n [ 7 b- q' a$ j0 v+ F/ s9 i" j* N / G$ C0 V* T; E Class CRoundDlg : public CDialog% u. c. S2 f7 U, N4 U( }
{! Z, F" O3 ?/ F: F" b" f
… ( u5 f( R+ U1 a/ A8 m8 M private :' G+ e( [" }8 y# w; R- ]: o
Crgn m_rgn : // window region 3 G2 L* N) M7 V- E3 J& X9 I … + t+ C9 P: \, H) e6 E. e: A6 Y }8 e- R9 m$ k7 }) @* c5 |* Q- C
修改OnInitDialog函数建立一个椭圆区域并调用SetWindowRgn将该区域分配给窗口: 0 d; w" m% r5 T7 W0 v BOOL CRoundDlg : : OnInitDialog ( ): X% B; [# X- ?7 ?9 \% m3 [. F
{1 f. ^! e# P/ P) q# B
CDialog : : OnInitDialog ( ) + u, d9 E" `$ E- K$ Q) H : g; {$ n [- b$ G5 i$ s( O# W //Get size of dialog . 7 H7 i9 d# `( Q6 p3 \% P0 z CRect rcDialog- y' i+ {5 Z. Y5 G
GetClientRect (rcDialog ) 6 [& x) t- E. X$ n+ I / ~: v& m8 B0 s# z; Y1 k- |+ n5 k // Create region and assign to window ., c5 D4 Y4 g5 g) o$ [4 A9 t
m_rgn . CreateEllipticRgn (0 , 0 , rcDialog.Width( ) , rcDialog.Height ( ) ) i( ]. Z/ |/ w" N SetWindowRgn (GetSafeHwnd ( ) , (HRGN) m_ rgn ,TRUE )+ Z- n7 N' j) |6 m- ~
% }$ Q4 B2 k; o' g return TRUE 1 Y3 S. F+ D# j/ t- k5 X: \ } & @7 V$ @- n# p 6 n8 @, `/ K8 X/ }6 a! n 通过建立区域和调用SetWindowRgn,已经建立一个不规则形状的窗口,下面的例子程序是修改OnPaint函数使窗口形状看起来象一个球形体。( h8 D0 g, w8 o) J! P4 Y8 M7 B$ m
0 N3 c' o. F7 l/ _4 O) V ( Q8 _, |+ d+ k. J ^7 H' j% b6 v# `7 z' Z- ]4 Z( y2 M2 z# s, ~7 A) y
voik CRoundDlg : : OnPaint ( ) 8 t" Y3 @) k; C7 z: | { + v5 q: i$ Y3 {& x* R CPaintDC de (this) // device context for painting1 z8 l# }* y `; D5 R9 g
. + Y6 @3 D3 Y" I6 F0 t9 H g. g //draw ellipse with out any border * ~" x5 L6 r+ Q- P dc. SelecStockObject (NULL_PEN)1 m' O3 y# j) Z% |% N& D; q
//get the RGB colour components of the sphere color ' r4 M1 Y6 F- p; u& E2 ?4 I) J4 k& C COLORREF color= RGB( 0 , 0 , 255) # i* d2 N" A; }! V, P5 W5 g BYTE byRed =GetRValue (color) - X( [4 z8 Z d$ e. x BYTE byGreen = GetGValue (color)7 B! Q9 m" J1 M0 Y' _
BYTE byBlue = GetBValue (color) 3 m! H3 h, j4 B! e' l1 p% g; Q% s5 `; j, Z( ]2 [; h4 M
// get the size of the view window' M; E7 S* X4 s* V* K" V
Crect rect $ L* h' P+ A0 k$ `( z& D GetClientRect (rect)! o; G. w3 y, J7 K
6 z* \$ X7 |, D7 u' @+ j3 x // get minimun number of units( t [! W9 Y5 @7 U' p/ Y8 t
int nUnits =min (rect.right , rect.bottom ) 1 Y! h O& c) G% }* P. m3 c, `( r: E# k/ m! B1 Q
//calculate he horiaontal and vertical step size + W' p# n, n+ P" w4 `3 z float fltStepHorz = (float) rect.right /nUnits5 t. o- h L- g1 n) n$ m
float fltStepVert = (float) rect.bottom /nUnits; Q" W G7 _" P- `8 h
! H2 a/ s4 y4 |6 G. N
5 G" z4 |# x# f3 c$ N- a$ ? int nEllipse = nUnits/3 // calculate how many to . F! v; u9 z6 T! `5 r0 n4 s draw ! `4 @, C3 y# m' M: Q7 Q& |# Y: B int nIndex, G( x+ \, w; v g
// current ellipse that is being draw* C, `, f9 F: H5 `& z% M2 {
O8 m- Z6 o/ t
CBrush brush s3 n. g1 O& a/ Q
// bursh used for ellipse fill color! }9 W, l+ U, Y# r/ u$ H
CBrush *pBrushOld // previous$ z) ~( V% k: t. a) G" C
brush that was selected into dc( ?& J1 L; ^; O! |! m2 S! P3 I. {
//draw ellipse , gradually moving towards upper-right % S, c j$ J- t! i/ J- d9 o corner% n; |# S/ `: W" {" }1 `' J
for (nIndex = 0 nIndes < + nEllipse nIndes++)% K1 r: n1 _3 ?3 v0 h/ w2 a+ u
{4 ~6 H& L5 l4 \: _. \. g/ ^
//creat solid brush' w4 i3 y4 m: Q+ [2 Z. E
brush . CreatSolidBrush (RGB ( ( (nIndex*byRed ) /nEllipse ). ) Q! J+ M, ?4 y& Y, v/ }& z ( ( nIndex * byGreen ) /nEllipse ), ( (nIndex * byBlue)( ]9 }% H' o! ]( O& d
/nEllipse ) ) ) 9 [' o5 P, `: m2 z E% O; Y: R0 J |7 }5 G n/ @
//select brush into dc 8 j9 T/ I. K3 J7 j! P; H( Z! c pBrushOld= dc .SelectObject (&brhsh) 6 `& C$ ]* F8 k: A/ {5 ], b H! R! Y6 ] @
//draw ellipse4 C: i- X3 }) l2 u/ ?; I
dc .Ellipse ( (int) fltStepHorz * 2, (int) fltStepVert * nIndex , ( y; O `3 Q; J6 z* t1 {& w' |# \ rect. right -( (int) fltStepHorz * nIndex )+ 1,% U3 U3 d5 H0 c
rect . bottom -( (int) fltStepVert * (nIndex *2) ) +1) & Z8 l- T" q$ L9 W a; @' |! U/ D5 z- t( }( R
//delete the brush 3 j5 j) H& W2 |* y) N: G brush.DelecteObject ( )8 ~5 r; ?* B% a' j
} 1 R4 O# q$ Y+ h! `' N4 R }: G; {/ e# E5 o7 Z; l1 ^
# U0 P7 z( P1 Y& {$ ?: m/ N
最后,处理WM_NCHITTEST消息,使当击打窗口的任何位置时能移动窗口。 ! I' {& {3 d$ w2 M( m* n: O5 W 2 r; W' T; D$ Q" U9 |' q. c5 d8 f# Y
; U" y, w0 v/ V0 t
9 _' \- J1 c+ d8 O" g UINT CRoundDlg : : OnNchitTest (Cpoint point ) ) | a8 {; O, T/ ] {# @. ]" Y" c! a9 E
//Let user move window by clickign anywhere on thewindow . * M. }% @+ X5 b5 N" C& M UINT nHitTest = CDialog : : OnNcHitTest (point)9 K* p" t$ O" F, Z7 B6 `0 d' I
rerurn (nHitTest = = HTCLIENT)? HTCAPTION: nHitTest ( b% G, ?, ~% x7 D+ Z8 o8 m. W' W( U5 F$ I" C
} : o5 V" K2 \- G/ T4 M5 \3 z& o5 }! ?: J; A( K& J8 Q
(25) 如何获取应用程序的 实例句柄?% \, a! }, Z5 t2 `- p) x: H9 X! r6 ^
应用程序的实例句柄保存在CWinApp m_hInstance 中,可以这么调用AfxGetInstancdHandle获得句柄.* R/ o! [: f) L0 f
' F/ G/ A6 X, `3 l0 i
' x9 ^8 D! c& X Example:& Z3 T6 b$ y7 D, Z
void ToggleTopMost(, z' m. i: X7 ~7 _( S0 D
CWnd *pWnd). }8 S2 \+ n( N6 F2 W& Y
{: M, F3 r. q7 L* H
ASSERT_VALID(pWnd): n2 Y, N. ^3 b
) R( N7 t: q d pWnd ->SetWindowPos(pWnd-> GetStyle( ) &WS_EX_TOPMOST)? " Q. e+ I2 j. Q' a( X& I' Q9 g$ d- Z4 A% W- n
&wndNoTopMOST: &wndTopMost,0,0,0,0,SSP_NOSIZE|WSP_NOMOVE) ; Q: |0 X) {! j5 V! G2 b$ u0 y } $ _! A% C% A1 K& n2 X p* t5 e& R
(35) 如何在对话框中显示一个位图$ |: b1 x' O, K7 B7 X6 U" h' `
这要归功于Win 32先进的静态控件和Microsoft的资源编辑器,在对话框中显示位图是很容易的, 只需将图形控件拖到对话中并选择适当属性即可,用户也可以显示图标、位图以及增强型元文件。) `" l& [1 @- q1 L8 i B* A