(1) 如何通过代码获得应用程序主窗口的 指针?5 @" q8 b) x* T# i7 M4 p
主窗口的 指针保存在CWinThread::m_pMainWnd中,调用AfxGetMainWnd实现。 ( S0 c3 c4 @( o/ a - O# |" a Y9 L. L' g! K# P( w, M; B[被屏蔽广告]; e' H$ z" ]! _4 Y% O r
# j- i( v3 S5 ~/ Z. Z u! l
8 M' G, C. } x9 q1 P4 @: L5 k$ z! Z: P# _ O5 M7 |
% j! ~$ K3 @' H AfxGetMainWnd() ->ShowWindow(SW_SHOWMAXMIZED) . A) s8 x/ S9 I. S% l //使程序最大化. 1 z# u# }2 F8 {8 T2 H u) U0 ? N: x0 B8 g6 I; b- ]8 j
(2) 确定应用程序的路径 * a5 r1 f: S, C* ]& i) { ~) s$ P5 m$ I; d
7 {8 Z2 {7 E# Q' H8 W7 T% X
( z7 }* M; d2 v5 T+ }. {+ Z4 W' t4 `
Use GetModuleFileName 获得应用程序的路径,然后去掉可执行文件名。 ) b7 h9 j8 O: V4 B Example:8 c3 e9 R' y) f$ S- W/ j- v, j
TCHAR 5 u7 t: r% g8 d# v9 s* g; G9 m exeFullPath[MAX_PATH] // MAX_PATH在API中定义了吧,好象是, |$ g4 E7 q/ O; E; J
128" O( W- @" N U4 K3 F1 \
GetModuleFileName(NULL,exeFullPath,MAX_PATH) 9 u0 \! s& V7 r4 q$ f0 Q& `8 ]/ W U, t+ [, Q
(3) 如何在程序中获得其他程序的 图标?$ @$ [! u4 l5 l6 z4 t I" H
两种方法:/ a6 S+ C4 A& ~ [! g3 q( A
(1) SDK函数 SHGetFileInfo 或使用 ExtractIcon获得图标资源的 handle,. ^# m! G; E8 w1 x
(2) SDK函数 SHGetFileInfo 获得有关文件的很多信息,如大小图标,属性, 类型等." y4 `1 u+ u5 o: A& ?/ M& V# c
Example(1):8 t5 ~! o& S, m7 D
在程序窗口左上角显示 NotePad图标." u- y. H: x5 Z) ^
" l* A. r3 U* V7 o2 Q
8 L6 Z9 s$ \) W& V& i3 Z) V) a' q* D
. W% f6 Z' |( c! w9 d% ~- l void CSampleView: 9 l5 L6 M. Z/ i3 ?/ r6 b OnDraw(CDC * pDC) S$ ~& A" Q# X) {7 m( q4 H
{ 0 f4 B8 |) I" |9 w1 O if( :: SHGetFileInfo(_T("c://pwin95//notepad.exe"),0,3 E0 S% x$ u$ N8 g4 A
&stFileInfo,sizeof(stFileInfo),SHGFI_ICON))( `6 \4 c( c5 @; O$ \9 V
{ / ?" c0 b" C8 W pDC ->DrawIcon(10,10,stFileInfo.hIcon)! e0 l; L! b( @7 L. B# N
}/ l9 }( [" m+ W4 C' k( M2 i4 f
} ) e# C) z& T% o& n- P Example(2):同样功能,Use ExtractIcon Function 3 S! @$ o v- K# C- l9 g' O void CSampleView:: OnDraw(CDC *pDC)) ]; P( C( u) B' _* h
{ * h0 [! X- Q! V8 M HICON hIcon=:: ExtractIcon(AfxGetInstanceHandle(),_T - [% y. s& ]) g+ b0 W8 S" w' _ ("NotePad.exe"),0)* u% Q4 {4 R9 _. d% `- o5 \; { }
if (hIcon &&hIcon!=(HICON)-1) 7 V: G8 Y+ y, w+ R0 [2 ]* @ pDC->DrawIcon(10,10,hIcon)% }% o8 v6 ]+ a) F& o
} , c( ]! m9 }% Y: l2 P# s2 d . B! A, y2 L; L" n+ b- u; O& y ! N" w6 T f; r) B6 I& C 说明: 获得notepad.exe的路径正规上来说用GetWindowsDirectory函数得到, 如果是调用 win95下的画笔,应该用访问注册表的方法获得其路径,要作成一个比较考究的程序,考虑应该全面点. % V+ b" F0 V ?4 W $ }) l4 a. ^ [% { (4) 获得各种目录信息 9 S5 M' k& u8 j. f* {% M Windows目录: Use "GetWindowsDirectory" ( k# J, \5 @2 u6 G$ J3 i Windows下的system目录: Use "GetSystemDirectory", P: h3 R. {4 Q7 Z6 U. \1 D
temp目录: Use "GetTempPath"9 R, V# E9 ]. [ y* w
当前目录: Use "GetCurrentDirectory"& o/ K0 m, I2 o- P$ n z! \( M
5 D7 e1 p4 e: r1 |: I- p! I( K
请注意前两个函数的第一个参数为目录变量名,后一个为缓冲区后两个相反. & ?; K9 X' K5 y% N( t4 Y2 J$ I& s( @5 r7 p3 O& y& v
(5) 如何自定义消息! `( S7 e& S( P# S8 l: {
1) 手工定义消息,可以这么写5 }' Z( t" ` R2 t/ _
# H- O9 ^. v" Z' L) r' T7 C( E' Q# F( S( y' R
b1 |7 u3 o2 ?, j+ Y + w. S" g% J0 s( q #define WM_MY_MESSAGE(WM_USER+100), 7 f2 w- j! }5 s# k. ~. R * v1 Z$ {0 L ` U! E& P; {4 I4 k& E" S& }# j- u+ Y" t
MS 推荐的至少是 WM_USER+100" | B2 K8 U% R. F( S
- ~+ l, }, K; u2 Q8 W (2)写消息处理函数,用# e5 B. z; S+ X& M A7 ~3 U
& m( k( [( Z, t/ F2 ^1 k
5 _- |! d: W" A& h" N) @2 K8 {/ Z5 Q2 m
. ?0 w1 Z; ^' p' w& M& O , N8 k2 i6 T8 ^) X2 Z- z9 n( F, i WPARAM,LPARAM返回LRESULT.! x' ~6 U' P* y% @
LRESULT CMainFrame::OnMyMessage(WPARAM wparam,LPARAM lParam)/ m8 r' v" f3 R# T3 T
* K1 m E9 R( R8 f0 z* @' _
{. m) y, O, D% h
temp目录: Use "GetTempPath" # p$ H9 Q2 |7 a4 k; ], e* ?$ M3 J //加入你的处理函数 irectory"! ?5 E& H9 a9 `" j
}# G/ A# e, ]4 Z4 ?/ Z2 N8 d! F
% v; d* j! h9 v9 k& ]
(6) 如何改变窗口的图标?$ u1 z. A* B+ L$ r
向窗口发送 WM_SECTION消息。* v B( ]% J- Q9 O0 f) O# i
! N/ W. e' L8 l7 C
! a) l7 d% a) r) F6 X y# d $ G$ V6 a4 ]7 v7 q; k Example: Delete "Max" Button and Set Original( u6 \- @8 F3 i, k
Window's Position and Size& t/ e: T& u9 H0 o+ [: o/ ~
. e, W( T$ w5 M/ ]( J* k, d BOOL CMainFrame:: PreCreateWindow! U: @ z: l t! X6 p* ^+ @' w
(CREATESTRUCT &cs)3 g& F" M7 ^ K. Q6 W
{ 2 k1 S& Q# A% L, M8 @ cs.style &=~WS_MAXINIZEMOX4 L0 q- |% S Y3 U/ I) i: }: X( L0 o
; W0 S( o; y& R. }" X- U1 p1 V
cs.x=cs.y=0 ! D+ }: o' ?8 S/ B/ `/ _ cs.cx=GetSystemMetrics(SM_CXSCREEN/2) 9 a0 X6 N% S+ u' ]9 F& ` cs.cy=GetSystemMetrics(SM_CYSCREEN/2): E; E& ]: H( I! D. J) k* G$ i
$ \6 v: [1 y8 o7 t* [ [
return CMDIFramewnd :reCreateWindow(cs) 2 `' I0 z, s8 j: L }# \" ]" B" a6 g1 |( N
0 E! [# w! j* p
(8) 如何将窗口居中显示?/ g& Q1 D) E* A: t* s
& Z) m9 s) \* ^" N0 ?# y. j/ U# f! p! @
& B: w( b( o5 F6 r ] * J% X- i# s3 ~5 u, p( X$ a Call Function CWnd::% l+ B# f5 d* v: Q0 `; e* R
Center Windows+ G+ |# c6 W/ T# G* E. |! w
: r* A/ e$ \$ @. \+ H2 N6 l Example(1): , e' H5 x) c1 i7 d7 w Center Window( ) //Relative to it's parent * _! ?$ ^! ~' [: O6 j // Relative3 |5 m! L2 S3 B" U2 p' O
to Screen % s: r# c9 _; S Example(2): 6 @" R4 d0 ?3 M$ i4 ?) {! M Center Window(CWnd:: GetDesktopWindow( )) 1 | W+ g+ y! m# x7 b4 w: { //Relative to 4 q8 d, t$ ~; |5 H$ Y4 r Application's MainWindow " S2 c* x% A, M/ Z AfxGetMainWnd( ) ->5 [$ a! r1 E0 ]* u5 H2 `3 Q( |0 B. K# a
Center Window( )# |4 b/ w- H0 P
2 X* P: R% n4 ]' _. {+ Q# ~: c (9) 如何让窗口和 MDI窗口一启动就最大化和最小化? 9 j, U$ Q. ?5 f 先说窗口。, ?2 l) k' }9 f! Q# d1 |5 q% a6 h
在 InitStance 函数中设定 m_nCmdShow的取值. : H1 M9 L: ]6 v; M. U) R/ S: K4 h( E2 @" p( R$ W9 p
1 `8 ~4 r5 n; V+ C( l 4 s8 ^- y$ ]% |* M) c6 z' C m$ d- M# d6 V( @3 c
m_nCmdShow=SW_SHOWMAXMIZED //最大化 % W8 i* h3 T+ Z5 M+ e# h m_nCmdShow=SW_SHOWMINMIZED //最小化 @' d5 Q, f3 p* S m_nCmdShow=SW_SHOWNORMAL //正常方式+ V c, G/ E! X; @, X+ Y
: U# |* u3 o8 X$ i8 E( a D
MDI窗口: ' e( M1 s; u# W7 B7 q$ l9 D; ~ 如果是创建新的应用程序,可以用MFC AppWizard 的Advanced 按钮并在MDI子窗口风格组中检测最大化或最小化还可以重载 MDI Window 的PreCreateWindow函数,设置WS_MAXMIZE or WS_MINMIZE + L6 s+ x/ h; B2 s( y( j8 j) z( O $ C# E2 ~/ u" V% Q3 F( c# E, C9 C" q 如果从 CMDIChildWnd派生,调用 OnInitialUpdate函数中的 CWnd::Show Window来指定 MDI Child Window的风格。 + i- m0 P- w2 n* b# Y - t+ r m2 b" e: K (10) 如何限制窗口的大小? # A4 V$ u2 g* L# l& m' P; M 也就是 FixedDialog形式。 Windows发送 WM_GETMAXMININFO消息来跟踪, 响应它,在 OnGetMAXMININFO 中写代码:4 d. y: _& _; L$ S8 R+ ^( I
$ o5 i/ a' G) ]7 l- x3 g
(11) 如何使窗口不可见?$ O- M" E, w* O8 o* @ g! z
很简单,用SW_HIDE 隐藏窗口,可以结合 FindWindow,ShowWindow控制. % W+ C; h# S/ N4 q ^6 Y# ~: a P; S' k' p- O
(12) 如何创建一个字回绕的CEditView # w1 o; c% s! c P 重载CWnd : : PreCreateWindow和修改CREATESTRUCT结构,关闭CEditView对象的ES_AUTOHSCROLL和WS_HSCROLL风格位, 由于CEditView : : PreCreateWindow显示设置cs. style,调用基类函数后要修改cs . style。 ( c0 n1 e9 f" G- {: T. h# u3 M) v M+ c3 s8 Z5 k
1 ?. S1 A5 a( _4 e, \& o! p7 m: ?8 l+ a& h: J& z$ g* J
* G8 O8 U0 A6 M) L1 R, f$ K' S
BOOL CSampleEDitView : : PreCreateWindow (CREATESTRUCT&cs)# l" v# a" q. a; _; n
{" e9 j7 J1 P) Y+ s( c
//First call basse class function .+ g2 Y* E( W: o6 V4 [* z" T ?
BOOL bResutl =CEditView : : PreCreateWindow (cs)9 o, S6 ~0 M8 y& N& P5 t
* U$ x0 y2 @/ Y) X/ }# I
// Now specify the new window style ., d5 F' o3 R9 m0 T9 k3 _
cs.style &= ~ (ES_AUTOHSCROLL |WS_HSCROLL) ) r1 z7 P. d' h7 O return bResult P9 {: L) y% `& Z& Y
}3 J3 Q1 _, _* E3 c; d
. W( l( x4 u& f) m2 O: v/ W- j0 {
(13) 如何使程序保持极小状态? & P2 L5 W; S9 h. M2 M% Z" o; Y; F 这么办: 在恢复程序窗体大小时,Windows会发送WM_QUERY-OPEN消息,用 ClassWizard设置成员函数 , L2 [# W& `! m) X; l- I$ p6 i7 v* ]4 |5 a
: L `* S Q( u G4 H n# i. r+ J# K
1 V' L& }4 d; C* T. n+ C Q5 H
OnQueryOpen() ,add following code: 3 ~, z, M2 A& W' T4 h% j: O! T/ `: o* h# k
Bool CMainFrame:: OnQueryOpen( )1 B8 _1 K3 V2 j$ G5 f3 n' O
{ 1 S) A/ q; ~* Z- H [ Return false/ o5 n v/ Q- u; K! g" u: j$ K* e
}. p9 e4 g) ?8 p: B! K+ D3 T
* F6 \/ r: i0 T F; U% r. {, r: E
(14) 移动窗口6 U: Z& I, h! _- j
调用CWnd : : SetWindowPos并指定SWP_NOSIZE标志。目的位置与父窗口有关(顶层窗口与屏幕有关)。调用CWnd : : MoveWindow时必须要指定窗口的大小。 3 b) {4 l/ S8 Q9 c B' _1 B. D$ r7 A. C# O0 r
! \2 v5 ~5 \4 q, p
! t, J5 v' m3 g/ N* _. e
+ `; A% _1 U$ w" J4 m6 A# z6 l1 ?' I: z% e' T/ u( L
viod CMainFrame : : OnCommmonMenuHandler ( ) # H& }) O4 c8 L3 c: F! z { . n9 x; J& F9 I+ T" e9 D8 B //Display selected menu item in debug window .! q8 I+ M/ I" G: ~2 [0 U
TRACE ("Menu item %u was selected . /n" ,$ Y4 `* E0 Z. D1 ?
% k) Y$ G- Q+ c6 j- ~% W
(22) 如何在代码中获取工具条和状态条的指针 ; g' G) H& O( |- X 缺省时, 工作框创建状态条和工具条时将它们作为主框窗口的子窗口,状态条有一个AFX_IDW_STATUS_BAR标识符,工具条有一个AFX_IDW_TOOLBAR标识符,下例说明了如何通过一起调用CWnd: : GetDescendantWindow和AfxGetMainWnd来获取这些子窗口的指针:1 m: @. w( O A
# n8 o2 y) w/ l i7 U0 C% R/ H3 Q
) n# i9 O( l9 t+ K7 |
9 t' ]8 x4 z# `; g' b0 Z1 L4 |3 c$ C% r! o6 W; ]; B5 ^& G
//Get pointer to status bar .5 t& P# |! q$ d O
CStatusBar * pStatusBar = (CStatusBar *) AfxGetMainWnd ( ) 0 H/ C) L# M( ~. ]+ M —> GetDescendantWindow(AFX_IDW_STUTUS_BAR)$ @% d% u3 M I
" @+ E( y* R2 m8 b( Z: y/ h //Get pointer to toolbar . $ H8 U: T6 l* h, \7 W% C CToolBar * pToolBar = (CToolBar * ) AfxGetMainWnd ( ) . ]8 w+ R N. e' D4 D) z0 Y' k —> GetDescendantWindow(AFX_IDW_TOOLBAR) 5 I) } N; j: K' Q; T. k9 l1 I 4 f) V& \" `: ~( J$ I (23) 如何使能和禁止工具条的工具提示2 e3 x& x" l) P$ K/ |
如果设置了CBRS_TOOLTIPS风格位,工具条将显示工具提示,要使能或者禁止工具提示,需要设置或者清除该风格位。下例通过调用CControlBar : : GetBarStyle和CControlBar : : SetBarStyle建立一个完成此功能的成员函数:7 v& |" j+ N* a+ L+ I
$ |% R* ]# |( h# b' {* @ / |; v# P T- |8 Y. T; e. j$ u$ _& r) i5 T0 G
+ }& ]# G- W) L5 b7 Z) c void CMainFrame : : EnableToolTips ( BOOL bDisplayTips ) 1 V$ A [, ?3 j# ]1 r { + }( r0 Y$ R, N; l4 _! s ASSERT_VALID (m_wndToolBar)- l$ L: w* o# z4 V' M
6 M4 w6 a6 H0 h) k% p4 s2 h! X
DWORD dwStyle = m _wndToolBar.GetBarStyle ( ) ( a+ E& B( ?! w3 |* g 3 Q) j' h2 ~9 I+ g1 O5 J$ u if (bDisplayTips) dwStyle |=CBRS_TOOLTIPS $ Y. ]1 h- r# ?5 v, n4 R1 n; ]; W U; _: O m% i9 K# d( ] a4 o3 C
else, _, Q/ e, [4 z. H+ q s
dwStyle & = ~CBRS_TOOLTIPS2 B0 I: A! ~$ i, H1 s
, Z; o) j! h$ d. h
m_wndToolBar.SetBarStyle (dwStyle )& c5 ?9 ]7 b6 g2 ?$ |$ \
}8 B0 y$ M' U; U7 u4 [' p& v* b
$ A9 W# Z$ R% f5 d5 U( i5 v(24) 如何创建一个不规则形状的窗口 6 _/ y# @" f% [7 b$ w1 B 可以使用新的SDK函数SetWindowRgn。该函数将绘画和鼠标消息限定在窗口的一个指定的区域,实际上使窗口成为指定的不规则形状。 使用AppWizard创建一个基于对的应用程序并使用资源编辑器从主对话资源中删除所在的缺省控件、标题以及边界。* A: z" J( m4 }' y6 c, g' A+ C
给对话类增加一个CRgn数据成员,以后要使用该数据成员建立窗口区域。 8 n" q& x1 E6 _) |( t0 H3 k. }0 T5 h, T3 D" k' l
+ X3 D! `! H) R* B4 Q6 K) k ; ]2 ]) q8 c6 l7 [; a$ M( O/ f. ]+ y5 G8 ~
Class CRoundDlg : public CDialog 0 A! C( b) o9 t { ; ^ k! V& o3 Z+ o- R0 X …/ ]; z5 p2 O2 u) f
private :( C% M- Y' ]0 r9 S0 Z
Crgn m_rgn : // window region7 r$ [5 W- p7 o. b0 V; m" z6 y
…, D5 e; ?9 \2 O' h4 Q
} % {7 P' i9 ?+ t, L4 r8 I) \! ^ 修改OnInitDialog函数建立一个椭圆区域并调用SetWindowRgn将该区域分配给窗口: - b& ^ [' z5 H BOOL CRoundDlg : : OnInitDialog ( ). [* q4 U. e8 N
{ $ ~ Z8 L" G+ v# s" W* q' h) u CDialog : : OnInitDialog ( ) _* {3 Z5 J# ?+ D, |4 v: I3 L. U
//Get size of dialog .) g; c, L- s3 ]) R; z4 l
CRect rcDialog - i6 ^- G8 r) ~6 J GetClientRect (rcDialog ) & ]$ t; g: ^9 u! k: M 4 A, W+ Q# L$ W // Create region and assign to window . 9 }% t" `% [7 {) a: b m_rgn . CreateEllipticRgn (0 , 0 , rcDialog.Width( ) , rcDialog.Height ( ) ) 8 y# o2 L* v: c0 ~7 F8 p SetWindowRgn (GetSafeHwnd ( ) , (HRGN) m_ rgn ,TRUE ) - Z2 P. N- Z: D( a6 f$ R# E # d& E% a! w" n1 c return TRUE8 w! T8 T, o' q: Y* M
}0 Z3 V# N- A8 I& }
% v8 s( P" t$ A) A0 B A 通过建立区域和调用SetWindowRgn,已经建立一个不规则形状的窗口,下面的例子程序是修改OnPaint函数使窗口形状看起来象一个球形体。 8 G, ?1 H1 l& ^$ [ 0 e; K$ `0 G2 N, a. G( a) t6 k. F# s" M1 j: j5 f2 p
+ ~: C5 h: g! E" p. C- X- v6 S # A* q5 G4 P. e2 d5 X voik CRoundDlg : : OnPaint ( )0 o8 C" W0 F. {1 i& V. M& K5 Q
{. Q+ q( n. p8 m( s3 G {0 d2 {3 l
CPaintDC de (this) // device context for painting6 L* q3 H8 w; _, e; s3 w
.* ]% M) t) i' L" _# `
//draw ellipse with out any border+ S4 K7 X9 b5 d
dc. SelecStockObject (NULL_PEN) 3 q) [' |6 v* ]8 R' N( Z //get the RGB colour components of the sphere color + P! m1 ^4 N. |5 | COLORREF color= RGB( 0 , 0 , 255) 9 j% u' Z2 ] S9 G BYTE byRed =GetRValue (color) * z, o% d# ~% s* j9 J9 c BYTE byGreen = GetGValue (color) : n- u5 K: ]" C( X5 p6 Z! r BYTE byBlue = GetBValue (color)9 c: ^+ Q! a! I h# _
+ i( b& ^2 v- ]1 {, B
// get the size of the view window5 }1 N6 g3 X" }" i! l" n1 n- S" T
Crect rect 3 W( L% v# D' X8 S% {( O# A: i* n GetClientRect (rect)% v$ x' m3 t, P' B
! H8 s' T: p& T& a8 g J // get minimun number of units 6 ~) `/ [( `! O( S$ q: x# L( @ int nUnits =min (rect.right , rect.bottom ) 9 D/ D5 }8 _7 n; \$ o; h2 ]: \' j5 {6 f. U
//calculate he horiaontal and vertical step size . V8 h/ _3 r. b1 T float fltStepHorz = (float) rect.right /nUnits / j9 u. i% F+ z" V) l; B6 E$ e float fltStepVert = (float) rect.bottom /nUnits ' @, ?% X7 t* }. Q: \, o2 B9 x $ s0 W. M4 X! T" ~' X# O; m7 s1 I- ~6 ?! t/ j- B
int nEllipse = nUnits/3 // calculate how many to * ~( H8 }* y( D7 ] draw7 A1 B! E8 w: G# X/ a! r4 y
int nIndex, W K5 Q, @) q% ]6 ^( W- R, a* A, q
// current ellipse that is being draw 0 t$ E! c$ `8 I. f* m* E! e# W' b6 ?3 H+ G
CBrush brush ! ^% N9 V9 B5 ~. @' N" d4 I3 K/ O( I7 o // bursh used for ellipse fill color9 W8 X7 |% @& k# {" R
CBrush *pBrushOld // previous 1 n* `4 F8 i# M brush that was selected into dc9 z+ ~. a7 L; z) G
//draw ellipse , gradually moving towards upper-right2 k! z+ Q+ w2 U
corner1 f }( i1 l C' i
for (nIndex = 0 nIndes < + nEllipse nIndes++) - J7 n$ K% [7 T+ X { # ~6 G0 @& _: S) x) W //creat solid brush ' y* @0 x4 [' ?6 e brush . CreatSolidBrush (RGB ( ( (nIndex*byRed ) /nEllipse ). / a8 s: U6 Q, V$ T3 N* u0 u! |+ f5 L ( ( nIndex * byGreen ) /nEllipse ), ( (nIndex * byBlue)1 Q8 `% J+ t* S7 A0 M
/nEllipse ) ) )4 o+ V/ Z* P$ p, w' U x* S3 Z4 o
5 }; v* {+ [& y) u! C4 {, f" b //select brush into dc 5 u3 S1 ]' m) \' \ pBrushOld= dc .SelectObject (&brhsh) ! [- [: V+ I( T3 I3 c9 R7 j1 \0 ]2 E* Z! o$ s6 r/ ~9 |# m k
//draw ellipse1 i5 h. t3 x: N: p$ {7 Z( o4 n
dc .Ellipse ( (int) fltStepHorz * 2, (int) fltStepVert * nIndex , 0 s+ k6 d U1 v; ]' @ rect. right -( (int) fltStepHorz * nIndex )+ 1,4 x" f; j/ v* {% d+ ?0 @0 n( T$ }0 ]
rect . bottom -( (int) fltStepVert * (nIndex *2) ) +1)+ X2 c0 V" x0 H- D7 Y
7 d# @1 X' j" ^. {+ c% K //delete the brush ' Z/ {( b! n; }0 g) F, X4 U brush.DelecteObject ( ) " R. ]7 H% r/ ?2 G$ a }1 D( e" c; {; I$ a. f5 C. c2 J
}) b4 u: |9 b+ u2 t0 [- _+ b
* U1 D0 S) F0 r, Y& Z. p
最后,处理WM_NCHITTEST消息,使当击打窗口的任何位置时能移动窗口。 : S k% W. V% `2 x0 C1 @; m3 }- w. Y& n
2 Q" ~4 h4 r1 n7 c7 y$ i8 I& b2 Q0 U$ h7 C8 e
: L; s/ g- g% B9 W: z UINT CRoundDlg : : OnNchitTest (Cpoint point )& ^* b+ x1 Q) L5 d+ M/ d6 w
{* r. H. G& Y: j. B$ X) [* x: n& t
//Let user move window by clickign anywhere on thewindow .! S- m$ J c2 W' ^
UINT nHitTest = CDialog : : OnNcHitTest (point)7 r+ b# b2 r7 o8 f U8 N
rerurn (nHitTest = = HTCLIENT)? HTCAPTION: nHitTest- u2 a: a0 \9 M, F) V# P% Y: ?
+ G. }) Y9 Y% v2 O8 x* X7 b
} " n% _) |" E# u/ a, f7 d2 h$ h. W/ {- K
(25) 如何获取应用程序的 实例句柄? 3 s# s" {3 b) [! U& Q6 ~7 s 应用程序的实例句柄保存在CWinApp m_hInstance 中,可以这么调用AfxGetInstancdHandle获得句柄.- H* X9 M( j0 Z' r$ x3 `# i
: n! Z8 e, p4 Z! i! c4 F1 w
' a( H& s) z. r+ E4 |0 I' f' ]7 [7 Y' D3 R% W# l
t3 l( u; k6 y/ n
Example: HANDLE hInstance=AfxGetInstanceHandle()- w. R3 a& u9 M0 m( E4 ~
. h1 d" N% n2 N8 D. _
(26) 如何编程结束应用程序? ( _+ ]: B6 k2 b' f& @8 [ 这是个很简单又是编程中经常要遇到的问题.8 X6 s; \3 z1 H4 V# H
向窗口发送 WM_CLOSE消息,调用 CWnd::OnClose成员函数.允许对用户提示是否保存修改过的数据.- F3 g6 X- h1 K' J/ J- d- k
?4 N' p+ P" U5 p+ {7 ^$ q% {$ k[被屏蔽广告]* q; s9 m$ \- [
1 {# v# v; v5 s4 U9 p! J, r
系列文章:VC实用小知识总结(一) ( L' {1 a- F! d3 q$ z: l, B* H; g9 P' p# \4 L
* L% R2 ?* j; T; C/ _. M- D! H 8 S& G* R7 Q( | P. a 9 S) A M$ U/ S% }+ a V- ^ BringWindowToTop(Handle)0 g( @2 p: J! B0 y N- |
& L' i0 `6 X8 |5 |
; I9 X$ o4 l8 x. d' y9 L
SetWindowPos函数,指定窗口的 最顶风格,用WS_EX_TOPMOST扩展窗口的风格 2 H8 I% ^% y% Z( z( `4 E W `" M9 ~( ~, N
# w+ _0 b# w4 V; w
7 h/ o2 w5 @3 T) h1 r
+ a8 g+ |4 \" `$ A- T$ Z# \
Example:1 b; N+ o% O4 \0 Z; C+ k
void ToggleTopMost(: ]4 \1 x" p8 ^' g9 E* ]6 t! W6 H8 E0 G
CWnd *pWnd) + q: H/ K1 p7 U% ?4 |8 o M {0 c9 x$ K+ K; U
ASSERT_VALID(pWnd)3 d/ S* O( S/ ^4 Q+ B5 ^* x
" G" P& q% C; \" f1 G) E
pWnd ->SetWindowPos(pWnd-> GetStyle( ) &WS_EX_TOPMOST)? 2 ]5 a2 H5 ~0 `- D9 _! N1 J+ v( a* ?! G; S M8 i
&wndNoTopMOST: &wndTopMost,0,0,0,0,SSP_NOSIZE|WSP_NOMOVE)# |8 _; @6 N0 C) _1 U8 ~( B( o |
}/ u% X8 @" F2 p( ~, t: Y3 C4 `7 A
) n6 P9 e i: f
(35) 如何在对话框中显示一个位图% C8 q% o$ R9 Z* J: T& N! @& I" ?
这要归功于Win 32先进的静态控件和Microsoft的资源编辑器,在对话框中显示位图是很容易的, 只需将图形控件拖到对话中并选择适当属性即可,用户也可以显示图标、位图以及增强型元文件。2 `) {0 m& B4 ^* z
* M+ H c$ f3 ^5 g! W8 q5 I# m; L# J0 {
(36) 如何改变对话或窗体视窗的背景颜色: ]* f$ T8 s# e: C2 y! L- `
调用CWinApp : : SetDialogBkColor可以改变所有应用程序的背景颜色。第一个参数指定了背景颜色,第二个参数指定了文本颜色。下例将应用程序对话设置为蓝色背景和黄色文本。 # p, X4 r4 |6 Z F+ {0 Q$ Q . N- ^, L7 H2 Y/ D) y! k1 f" \3 s1 @% Y& V; `* z# h% s
9 b9 k( m' q" `* o: a # R' u" t/ j. Z# s" | BOOL CSampleApp : : InitInstance ( ) i3 W. w: H4 i& e4 c" B { % a- q# a* a, b5 `3 _ …6 ]2 y' ?( S3 `* q( ~ e" h3 a5 K
6 w7 p. B- e' H9 P: S //use blue dialog with yellow text . 7 z; z5 [/ w0 u SetDialogBkColor (RGB (0, 0, 255 ), RGB ( 255 ,255 , 0 ) ) ; P& ?( X: {6 L h3 U 4 C _4 r1 c8 d/ [; o+ m A' Y7 Z …; X1 B5 g7 z+ E- w4 D5 n
}) e7 U S5 }. D
9 b, ^7 @( @- f! V 需要重画对话(或对话的子控件)时,Windows向对话发送消息WM_CTLCOLOR,通常用户可以让Windows选择绘画背景的刷子,也可重置该消息指定刷子。下例说明了创建一个红色背景对话的步骤。, i4 ]& |7 X- S2 z1 e/ M1 E8 D