L p trình C trên Win ậ
ÖÙng duïng Single Document:
Ví duï taïo moät öùng duïng teân vidu1 kieåu single document
baèng trình AppWizard. Trình AppWizard seõ taïo ra caùc lôùp ñoái
töôïng daãn xuaát töø caùc lôùp ñoái töôïng cô sôû Application
classes, Document classes, ViewClasses vaø Frames classes
Ghi chuù
Lôùp daãn xuaát Teân taäp tin Cvd1App Vd1.cpp
Cvd1Doc Vidu1Doc.cpp
Cvd1View Vidu1View.cpp
CmainFrame MainFrm.cpp
Ví duï: Lôùp cô sôû CWinApp CDocument CView CFrameWnd CMDIChildWnd CchildFrame ChildFrm.cpp
Taäp tin RESOURCE.H Taäp tin naøy chöùa toaøn boä nhöõng leänh #define duøng
ñònh nghóa chæ danh ID nhöõng taøi nguyeân nhö laø:
DD_ABOUTBOX: Ñoái vôùi taøi nguyeân laø moät hoäp hoäi thoaïi about box IDR_MAINFRAME: Ñoái vôùi vieäc chia seû söû duïng bôûi nhieàu
loaïi taøi nguyeân.
IDR_VIDU1TYPE : Ñoái vôùi taøi nguyeân laø bieåu töôïng taøi
lieäu
Coøn caùc haèng _APS_3D_xxxx vaø _APS_NEXT_xxxx khaùc khoâng tröïc tieáp ñöôïc söû duïng bôûi caùc taäp tin taøi nguyeân khaùc. Taäp tin naøy seõ ñöôïc söû duïng bôûi taäp tin Vidu1.RC.
10 0 12 8 12 9
Noäi dung taäp tin RESOURCE.RC // { { N O _ DEPENDENCIES } } // Micr o s o f t Vis u al C+ + g e n e r a t e d inclu d e file . // Us e d by VIDU1. RC #d e f i n e IDD_ABOUTBOX #d e f i n e IDR_MAINFRAME #d e f i n e IDR_VIDU1TY PE // Nex t d e f a u l t val u e s for ne w obj e c t s #if d e f APSTUDIO_INVOKED #ifn d e f APSTUDIO_READONLY_SY MB OL S #d e f i n e _APS_3D_CONTR OL S #d e f i n e _APS_NEXT_RESOURCE_VALUE #d e f i n e _APS_NEXT_CONTR OL_VALUE 1 13 0 10 0 0
Trang 1
L p trình C trên Win ậ
101 32771
#define _APS_NEXT_SYMED_VALUE #define _APS_NEXT_COMMAND_VALUE #endif #endif
Taäp tin Vidu1.H Taäp tin tieâu ñeà Vidu1.H chöùa caùc khai baùo lieân quan ñeán lôùp Cvidu1App laø lôùp öùng duïng Cvidu1. Cvidu1App laø theå hieän (instance) chöông trình öùng duïng Vidu1. Lôùp naøy ñöôïc daãn xuaát töø lôùp CwinApp
Class Cvidu1App : public CwinApp { CwinAppp ( Class Windows Application) theo sô ñoà döùôi ñaây:
CObject
CCmdTarget
CWinThread
CWinApp
laø haäu dueä cuûa lôùp CCmdTarget lo vieäc quaûn lyù nhöõng coâng vieäc ñöôïc ñoøi hoûi ñeå khôûi ñoäng öùng duïng cuõng nhö ñeå cho chaïy vaø keát thuùc öùng duïng MFC. Nhö sô ñoà treân CWinApp ñöôïc daãn xuaát töø moät chuoãi lôùp CWinThread, CcmdTarget vaø CObject. Trong ví duï Cvidu1App laø giao dieän vôùi Windows. Khi moät tình huoáng xaûy ra trong Windows thì thoâng ñieäp seõ gôûi ñeán chöông trình Cvidu1App ñeå cho noù bieát ñöôïc caùi gì xaûy ra. Ví duï neáu moät phím ñöôïc nhaán, thì thoâng ñieäp WM_KEYDOWN seõ ñöôïc phaùt ra vaø chuyeån cho Cvidu1App vaø ñeán phieân chöông trình seõ khôûi ñoäng haøm giaûi quyeát vaán ñeà naøy laø OnKeyDown().
// Vidu 1 . h : mai n he a d e r file for th e VIDU1 ap p li c a t i o n #if! d e fi n e d ( A F X_VIDU 1_H__B6 8 2 FE 1 1_E 5 4 B_ 4 D 8 0 _ A 4 9 B_ 3 C 3 AEAE1FF8 5__INCLUDED_) #d e f i n e A F X_VIDU1_H__B6 8 2 FE 1 1_E 5 4 B_ 4 D 8 0 _ A 4 9 B _ 3 C 3 A EAE1FF8 5__INCLUDED_ #if _MSC_VER > 10 0 0 #pr a g m a onc e #e n d i f // _MSC_VER > 10 0 0 #ifn d e f __AFXWIN_H__ #e r r o r inclu d e 'st d a f x . h ' b e f o r e inclu d i n g thi s file
for PCH #e n d i f #incl u d e "re s o u r c e . h " // mai n s y m b o l s /////////////////////////////////////////////////////////////////////////////
Trang 2
L p trình C trên Win ậ
// CVidu1App: // See Vidu1.cpp for the implementation of this class // class CVidu1App : public CWinApp { public: CVidu1App(); // Overrides
// ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CVidu1App) public: virtual BOOL InitInstance(); //}}AFX_VIRTUAL // Implementation
//{{AFX_MSG(CVidu1App) afx_msg void OnAppAbout(); // NOTE - the ClassWizard will add and remove member functions here. // DO NOT EDIT what you see in these blocks of generated code !
//}}AFX_MSG DECLARE_MESSAGE_MAP()
//
}; ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif ! defined(AFX_VIDU1_H__B682FE11_E54B_4D80_A49B_3C3AEAE1FF85__ INCLUDED_) Trong lôùp ñoái töôïng coù khai baùo caùc haøm constructor CVidu1App(), haøm thaønh vieân bò phuû quyeát InitInstance() vaø OnAppAbout(). Vieäc ñònh nghóa ñöôïc thöïc hieän trong taäp tin Vidu1.cpp.
AppWizard cho haøm OnAppAbout() naèm giöõa caëp chuù
giaûi ñaëc bieät:
// { { A F X_M S G ( C v i d u 1 A p p ) Afx_ m s g voi d OnA p p A b o u t ( ) ; // } } A F X_M S G
Duøng ñeå keát sinh ra baûng ñaùp öùng thoâng ñieäp. AFX_MSG duøng ñeå ñaùnh daáu khôûi ñaàu vaø keát thuùc nhöõng muïc vaøo lieân quan ñeán message map. Muïc vaøo naøy bao giôø cuõng baét ñaàu bôûi afx_msg void theo sau laø teân haøm giaûi quyeát thoâng ñieäp bao giôø cuõng baét ñaàu bôûi On.
Trang 3
L p trình C trên Win ậ
Caëp chuù giaûi {{AFX_MSG … }}AFX_MSG seõ töông öùng vôùi caëp chuù giaûi {{AFX_MSG_MAP …. }} AFX_MSG_MAP trong taäp tin Vidu1.cpp
Haøm chuù giaûi maø ClassWizard söû duïng ñeå phuû quyeát haøm virtual nhö InitIntance() seõ söû duïng macro AFX_VIRTUAL nhö sau:
// { { A F X_VIRTUAL(CVi d u 1 A p p ) pu b li c : vir t u a l BOOL InitIn s t a n c e ( ) ; // } } A F X_VIRTUAL
AFX_VIRTUAL duøng ñaùnh daáu khôûi ñaàu vaø keát thuùc nhöõng khai baùo cuûa caùc haøm virtual maø ClassWizard seõ phuû quyeát trong taäp tin .H cuûa lôùp.
Cuoái cuøng taäp tin khai baùo lôùp naøy laø doøng macro DECLARE_MESSAGE_MAP() baùo cho bieát laø treân taäp tin .CPP seõ coù phaàn ñònh nghóa moät “baûn ñoà thoâng ñieäp” (message map) lieân quan ñeán caùc haøm giaûi quyeát thoâng ñieäp baét ñaàu bôûi macro BEGIN_MESSAGE_MAP vaø keát thuùc bôûi macro END_MESSAGE_MAP nhö sau:
BEGIN_MESSAGE_MAP(CVidu1App, CWinApp) //{{AFX_MSG_MAP(CVidu1App) ON_COMMAND(ID_APP_ABOUT, OnAppAbout) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code! //}}AFX_MSG_MAP // Standard file based document commands ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew) ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen) // Standard print setup command ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup) END_MESSAGE_MAP()
Taäp tin STDAFX.H Taäp tin STDAFX.H chuû yeáu include 3 taäp tin AFXWIN.H , AFXEXT.H vaø AFXDISP.H . Caùc leänh naøy baûo ñaûm laø öùng duïng coù theå duøng nhöõng lôùp trong caùc taùc vuï chuaån vaø nôùi roäng cuõng nhö lôùp lieân quan ñeán ActiveX Control (OLE).
Trang 4
L p trình C trên Win ậ
#if!
defined(AFX_STDAFX_H__0CF6915F_3416_4CE6_AE4D_815051CD1243__INCL UDED_)
#defineAFX_STDAFX_H__0CF6915F_3416_4CE6_AE4D_815051CD1243__I NCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#define VC_EXTRALEAN
#include
#include
Taäp tin MainFrm.H Taäp tin naøy chöùa caùc khai baùo lieân quan ñeán lôùp khung cöûa soå chính (main frame) cuûa öùng duïng, CmainFrame. Lôùp naøy laø haäu dueä cuûa lôùp CframeWnd. Lôùp CmainFrame naøy xem nhö laø theå hieän cöûa soå cuûa öùng duïng ñoái theá giôùi beân ngoaøi. #if!
d e fi n e d ( A F X_MAINFRM_H__D2F0 1 5 2 D_ 9 3 B 3 _ 4 3 2 9 _ 9 7 B 6 _ 5 D CE D9B 3 9 D 0 0 __INCLUDED_) #d e f i n e
AFX_MAINFRM_H__D2F0 1 5 2 D_ 9 3 B 3 _ 4 3 2 9 _ 9 7 B 6 _ 5 D CED 9 B 3 9 D 0 0__INCLUDED_
#if _MSC_VER > 10 0 0 #pr a g m a onc e #e n d i f // _MSC_VER > 10 0 0 cla s s CMainFr a m e : pu b li c CFra m e W n d {
pr o t e c t e d : // cr e a t e fro m s e ri ali z a t i o n onl y CMainFr a m e ( ) ; DECLARE_DYNCREATE(CMai nFr a m e )
// At tr i b u t e s pu b li c : // Op e r a t i o n s pu b li c : // Ov e r r i d e s
// Clas s W i z a r d g e n e r a t e d vir t u a l func t i o n ov e r r i d e s // { { A F X_VIRTUAL(CM ai nFr a m e )
Trang 5
L p trình C trên Win ậ
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
//}}AFX_VIRTUAL
// Implementation public: virtual ~CMainFrame(); #ifdef _DEBUG
virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const;
#endif protected: // control bar embedded members CStatusBar m_wndStatusBar; CToolBar m_wndToolBar; // Generated message map functions protected:
//{{AFX_MSG(CMainFrame) afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
// NOTE - the ClassWizard will add and remove member functions here. // DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG DECLARE_MESSAGE_MAP() };
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif!
defined(AFX_MAINFRM_H__D2F0152D_93B3_4329_97B6_5DCED9B39D00__IN CLUDED_)
Lôùp CmainFrame ñöôïc daãn xuaát töø lôùp cô sôû CframeWnd, vì ñaây laø öùng duïng SDI chæ laøm vieäc vôùi moät taøi lieäu trong moät luùc. Phaàn khai baùo goàm:
- Haøm khôûi taïo protected CMainFrame() haø haøm huyû
~CMainFrame().
- Haøm thaønh vieân CObject::AssertValid() duønh kieåm tra hôïp leä ñoái töôïng vaøo luùc chaïy baèng caùch kieåm tra tình traïng noäi taïi. Trong phieân baûn Debug (khai baùo
Trang 6
L p trình C trên Win ậ
bôûi _DEBUG) haøm naøy giaû ñònh (assert) vaø do ñoù coù theå cho chaám döùt chöông trình vôùi moät thoâng baùo cho bieát soá thöù töï doøng leänh vaø teân taäp tin neáu giaû ñònh naøy khoâng truùng.
- Haøm thaønh vieân CObject::Dump() duøng tuoân xoå
(dump) noäi dung ñoái töôïng khi gôõ roái.
- Bieán thaønh vieân m_wndStatusbar thuoäc kieåu Cstatusbar
duøng chöùa tình traïng cuûa thanh tình traïng.
- Bieán thaønh vieân m_wndToolBar thuoäc kieåu CToolBar
duøng chöùa tình traïng cuûa thanh coâng cuï.
Ngoaøi ra lôùp coøn khai baùo moät message map (thoâng qua macro DECLARE_MESSAGE_MAP ôû cuoái phaàn khai baùo lôùp), cuõng nhö nhöõng chuù giaûi {{AFX_MSG … }}AFX_MSG duøng laøm choã daønh tröôùc ñeå cheøn caùc haøm thaønh vieân giaûi quyeát caùc thoâng ñieäp maø coù theå veà sau seõ theâm vaøo söû duïng ñeán trình ClassWizard.
Ngoaøi ra lôùp naøy coøn trieäu goïi: - haøm afx_msg void OnCreate() ñeå taïo moät cöûa soå cho pheùp öùng duïng giaûi quyeát caùc thoâng ñieäp Windows. Caùc haøm naøy baét ñaàu bôûi afx_msg cho bieát laø haøm giaûi quyeát caùc thoâng ñieäp Windows ñaõ coù saün . Ví duï haøm afx_msg void OnCreate() seõ giaûi quyeát thoâng ñieäp Windows WM_CREATE taïo moät cöûa soå.
- Haøm virtual BOOL PreCreateWindow() ñeå laøm vieäc gì ñoù, tröôùc khi taïo moät cöûa soå Windows ñöôïc gaén cho ñoái töôïng CWnd. Coù theå override haøm naøy ñeå thay ñoåi caáu truùc CREATESTRUCT tröôùc khi cöûa soå taïo ra.
Cuoái cuøng trong phaàn khai baùo lôùp laø macro :
DECLARE_DYNCREATE(CMainFrame)
Cho pheùp caùc ñoái töôïng thuoäc lôùp ñöôïc daãn xuaát töø lôùp CObject coù theå ñöôïc taïo ñoäng (dynamic) vaøo luùc chaïy chöông trình. Caùc lôùp document, view vaø frame ñeàu chòu hoã trôï vieäc taïo ñoäng caùc ñoái töôïng, neân caùc lôùp CVidu1Doc vaø CVidu1View ñeàu coù macro DECLARE_DYNCREATE() naøy nhö :
- DECLARE_DYNCREATE(CVidu1Doc) treân taäp tin Vidu1Doc.h - DECLARE_DYNCREATE(CVidu1View) treân taäp tin
Vidu1View.h
Nhöõng haøm naøo naèm giöõa caëp chæ thò #ifdef _DEBUG …. #endif nhö laø
Trang 7
L p trình C trên Win ậ
#if d e f _DEBUG vir t u a l voi d As s e r t V a l i d ( ) con s t ; vir t u a l voi d Du m p ( C D u m p C o n t e x t & dc ) con s t ; #e n d i f
Cho bieát laø caùc haøm naøy chæ hoaït ñoäng khi chöông trình ñöôïc bieân dòch theo phieân baûn debug duøng gôõ roái chöông trình. Nhöng khi bieân dòch theo phieân baûn Release (chöông trình ñaõ gôõ roái xong) ñeå phaân phoái cho ngöôøi söû duïng thì caùc haøm naøy seõ khoâng naèm trong thaønh phaàn chöông trình object.
Taäp tin Vidu1View.H
Lôùp CVidu1View ñöôïc daãn xuaát töø lôùp cô sôû Cview. View ñöôïc xem nhö laø phaàn keát xuaát cuûa chöông trình ra giaáy hoaëc leân maøn hình.
#if!
d e fi n e d ( A F X_VIDU1 VIEW_H__D4 6 C A 8EC_ 3 1 3 1 _ 4 5 4 A _ A 6 0 8 _ 9 C D 31 4 4 E 2 B 5 4 __INCLUDED_) #d e f i n e A F X_VIDU1 VIEW_H__D4 6 C A 8EC_ 3 1 3 1 _ 4 5 4 A _ A 6 0 8 _
9CD 3 1 4 4 E 2 B 5 4 __INCLUDED_
#if _MSC_VER > 10 0 0 #pr a g m a onc e #e n d i f // _MSC_VER > 10 0 0 cla s s CVid u 1 V i e w : pu b li c CVie w { pr o t e c t e d : // cr e a t e fro m s e ri ali z a t i o n onl y
CVid u 1 V i e w ( ) ; DECLARE_DYNCREATE(CVi d u 1 V i e w )
// At tr i b u t e s pu b li c : CVid u 1 D o c * Ge t D o c u m e n t ( ) ;
// Op e r a t i o n s pu b li c : // Ov e r r i d e s
// Clas s W i z a r d g e n e r a t e d vir t u a l func t i o n ov e r r i d e s // { { A F X_VIRTUAL(CVi d u 1 V i e w ) pu b li c :
Trang 8
L p trình C trên Win ậ
virtual void OnDraw(CDC* pDC); // overridden to draw this view
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected: virtual BOOL OnPreparePrinting(CPrintInfo* pInfo); virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
//}}AFX_VIRTUAL
// Implementation public: virtual ~CVidu1View(); #ifdef _DEBUG
virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const;
#endif protected: // Generated message map functions protected: //{{AFX_MSG(CVidu1View) // NOTE - the ClassWizard will add and remove member functions here. // DO NOT EDIT what you see in these blocks of generated code !
//}}AFX_MSG DECLARE_MESSAGE_MAP()
}; #ifndef _DEBUG // debug version in Vidu1View.cpp inline CVidu1Doc* CVidu1View::GetDocument() { return (CVidu1Doc*)m_pDocument; } #endif //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif //
! defined(AFX_VIDU1VIEW_H__D46CA8EC_3131_454A_A608_9CD3144E2B54__IN CLUDED_)
Töông töï nhö caùc taäp tin tieâu ñeà khaùc, taäp tin tieâu ñeà CVidu1View. H coù caùc haøm khôûi taïo CVidu1View(), haøm huyû
Trang 9
L p trình C trên Win ậ
~CVidu1View(), haøm kieåm tra hôïp leä AssertValid() vaø haøm tuoân xoå gôõ roái chöông trình Dump().
Vì lôùp View phaûi ñoïc taøi lieäu naøo ñoù ñeå cho hieån thò (hoaëc in ) döõ kieän, neân trong lôùp phaûi khai baùo haøm CView::GetDocument() nhö sau:
Public:
CVidu1Doc* GetDocument();
Haøm naøy laáy con troû chæ vaøo ñoái töôïng taøi lieäu CVidu1Doc (lôùp naøy ñöôïc daãn xuaát töø CDocument) ñöôïc gaén lieàn vôùi view. Khi coù con troû roài thì lôùp naøy môùi coù theå truy xuaát caùc haøm thaønh vieân cuûa lôùp taøi lieäu CVidu1Doc.
Vì laø view neân lôùp naøy phaûi khai baùo haøm veõ hình aûnh taøi lieäu, ñoù laø haøm virtual OnDraw(). Ngoaøi ra trong ví duï Vidu1 coù trình ñôn File-Print, vaø File- Print Preview neân lôùp naøy cuõng phaûi khai baùo luoân haøm virtual in aán nhö sau:
vir t u a l BOOL OnPr e p a r e P r i n t i n g ( C P r i n tI n f o * pInf o ); voi d OnB e g i n P r i n t i n g ( C D C* pDC, vir t u a l CPrin tI nf o*
pInf o ); vir t u a l voi d OnEn d P r i n t i n g ( C D C* pDC, CPrin tI nf o* pInf o );
Taát caû caùc haøm treân ñeàu söû duïng ñeán moät ñoái töôïng CDC (thuoäc giao dieän ñoà hoïa GDI) ñöôïc chæ veà con troû pDC. Khi toâ, veõ caàn ñeán caùc buùt veõ (pen) hoaëc coï veõ (brush) vaø ñaây laø nhöõng taøi nguyeân GDI.
Taát caû caùc haøm virtual treân ñeàu naèm trong caùc chuù giaûi {{AFX_VIRTUAL … }}AFX_VIRTUAL maø ClassWizard seõ keát sinh ra.
Ngoaøi ra lôùp CVidu1View cuõng khai baùo message map (do macro DECLARE_MESSAGE_MAP ) vaø chöùa choã saün cho ClassWizard theâm baát cöù haøm thaønh vieân giaûi quyeát caùc thoâng ñieäp, thoâng qua caùc haønh chuù giaûi {{AFX_MSG … }} AFX_MSG. Trong ví duï hieän chöa coù haøm giaûi quyeát naøo caû.
Cuoái cuøng laø haøm inline caøi ñaët haøm GetDocument () bao boïc bôûi chæ thò trình bieân dòch #ifndef … #endif , vaø chæ hieän höõu trong phieân baûn debug
#ifn d e f _DEBUG // d e b u g v e r s i o n in Vid u 1 V i e w . c p p
inlin e CVid u 1 D o c * CVid u 1 V i e w : : G e t D o c u m e n t ( ) { re t u r n (CVid u 1 D o c * ) m _ p D o c u m e n t ; } #e n d i f
Trang 10
L p trình C trên Win ậ
Taäp tin Vidu1Doc.H Taäp tin naøy chöùa khai baùo lieân quan ñeán taøi lieäu, taäp
tin naøy khai baùo lôùp CVidu1Doc thuoäc lôùp cô sôû Cdocument
// Vidu1Doc.h : interface of the CVidu1Doc class #if!
defined(AFX_VIDU1DOC_H__D00A42EA_1136_4442_9C89_003869BBC74B__IN CLUDED_) #defineAFX_VIDU1DOC_H__D00A42EA_1136_4442_9C89_003869BBC74B __INCLUDED_
#if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 class CVidu1Doc : public CDocument { protected: // create from serialization only
CVidu1Doc(); DECLARE_DYNCREATE(CVidu1Doc)
// Attributes public: // Operations public: // Overrides
// ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CVidu1Doc) public: virtual BOOL OnNewDocument(); virtual void Serialize(CArchive& ar); //}}AFX_VIRTUAL
// Implementation public: virtual ~CVidu1Doc(); #ifdef _DEBUG
virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const;
#endif protected: // Generated message map functions protected: //{{AFX_MSG(CVidu1Doc) // NOTE - the ClassWizard will add and remove member functions here.
Trang 11
L p trình C trên Win ậ
// DO NOT EDIT what you see in these blocks of generated code !
//}}AFX_MSG DECLARE_MESSAGE_MAP()
}; ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !
defined(AFX_VIDU1DOC_H__D00A42EA_1136_4442_9C89_003869BBC74B__IN CLUDED_)
Ngoaøi caùc haøm khôûi gaùn, haøm huyû, haøm kieåm tra hôïp leä, haøm tuoân xoå noäi dung taøi lieäu khi gôõ roái chöông trình. Trong phaàn khai baùo haøm virtual coù hai haøm lieân quan ñeán taøi lieäu:
- Haøm virtual BOOL OnNewDocument() nhö laø thaønh phaàn cuûa leänh File/ New ñeå môû taøi lieäu. Neáu laø taøi lieäu SDI khi ra leänh File/New thì haøm naøy khôûi gaùn laïi taøi lieäu hieän höõu thay vì taïo moät taøi lieäu môùi. Neáu öùng duïng laø MDI thì leänh treân seõ söû duïng haøm naøy ñeå taïo moät taøi lieäu môùi.
- Haøm virtual void Serialize(Carchive &ar) duøng ñeå vieát hoaëc ñoïc ñoái töôïng taøi lieäu leân moät ñoái töôïng Carchive hoaëc töø ñoái töôïng Carchive. Ñoái töôïng Carchive nhö laø moät doøng döõ lieäu nhò phaân. Haøm naøy mang tính chaát saûn sinh haøng loaït ñoái töôïng do ñoù coù chöõ Serial.
Lôùp Document cho pheùp caát tröõ döõ lieäu hoaëc ñoïc xuoáng döõ lieäu töø moät taäp tin goïi laø taøi lieäu, cho pheùp Windows khai thaùc nhieàu taøi lieäu cuøng moät luùc. Lôùp Document hôïp taùc chaët cheõ vôùi lôùp view.
Taäp tin Vidu1.RC Taäp tin naøy chöùa caùc taøi nguyeân lieân quan ñeán menu,
phím noùng, hoäp hoäi thoaïi,…
//Microsoft Developer Studio generated resource script. #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS
Trang 12
L p trình C trên Win ậ
// Generated from the TEXTINCLUDE 2 resource. #include "afxres.h" #undef APSTUDIO_READONLY_SYMBOLS // English (U.S.) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) #endif //_WIN32 #ifdef APSTUDIO_INVOKED // TEXTINCLUDE 1 TEXTINCLUDE DISCARDABLE BEGIN "resource.h\0" END
2 TEXTINCLUDE DISCARDABLE BEGIN "#include ""afxres.h""\r\n" "\0" END
"#include ""res\\Vidu1.rc2"" // non-Microsoft Visual C++ edited 3 TEXTINCLUDE DISCARDABLE BEGIN "#define _AFX_NO_SPLITTER_RESOURCES\r\n" "#define _AFX_NO_OLE_RESOURCES\r\n" "#define _AFX_NO_TRACKER_RESOURCES\r\n" "#define _AFX_NO_PROPERTY_RESOURCES\r\n" "\r\n" "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n" "#ifdef _WIN32\r\n" "LANGUAGE 9, 1\r\n" "#pragma code_page(1252)\r\n" "#endif //_WIN32\r\n" resources\r\n"
"#include ""afxres.rc"" // Standard components\r\n" "#include ""afxprint.rc"" // printing/print preview resources\r\n" "#endif\r\n" "\0" END
#endif // APSTUDIO_INVOKED
Trang 13
L p trình C trên Win ậ
// Icon // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. IDR_MAINFRAME ICON DISCARDABLE "res\\Vidu1.ico" IDR_VIDU1TYPE ICON DISCARDABLE "res\\Vidu1Doc.ico" // Bitmap IDR_MAINFRAME BITMAP MOVEABLE PURE "res\\Toolbar.bmp"
// Toolbar IDR_MAINFRAME TOOLBAR DISCARDABLE 16, 15 BEGIN BUTTON ID_FILE_NEW BUTTON ID_FILE_OPEN BUTTON ID_FILE_SAVE SEPARATOR BUTTON ID_EDIT_CUT BUTTON ID_EDIT_COPY BUTTON ID_EDIT_PASTE SEPARATOR BUTTON ID_FILE_PRINT SEPARATOR BUTTON ID_APP_ABOUT END // Menu IDR_MAINFRAME MENU PRELOAD DISCARDABLE BEGIN POPUP "&File" BEGIN MENUITEM "&New\tCtrl+N", ID_FILE_NEW MENUITEM "&Open...\tCtrl+O", ID_FILE_OPEN MENUITEM "&Save\tCtrl+S", ID_FILE_SAVE MENUITEM "Save &As...", ID_FILE_SAVE_AS MENUITEM SEPARATOR MENUITEM "&Print...\tCtrl+P", ID_FILE_PRINT MENUITEM "Print Pre&view", ID_FILE_PRINT_PREVIEW MENUITEM "P&rint Setup...", ID_FILE_PRINT_SETUP MENUITEM SEPARATOR MENUITEM "Recent File", ID_FILE_MRU_FILE1, GRAYED
MENUITEM SEPARATOR MENUITEM "E&xit", ID_APP_EXIT END POPUP "&Edit"
Trang 14
L p trình C trên Win ậ
BEGIN MENUITEM "&Undo\tCtrl+Z", ID_EDIT_UNDO MENUITEM SEPARATOR MENUITEM "Cu&t\tCtrl+X", ID_EDIT_CUT MENUITEM "&Copy\tCtrl+C", ID_EDIT_COPY MENUITEM "&Paste\tCtrl+V", ID_EDIT_PASTE END POPUP "&View" BEGIN MENUITEM "&Toolbar", ID_VIEW_TOOLBAR MENUITEM "&Status Bar", ID_VIEW_STATUS_BAR END POPUP "&Help" BEGIN MENUITEM "&About Vidu1...", ID_APP_ABOUT END END // Accelerator IDR_MAINFRAME ACCELERATORS PRELOAD MOVEABLE PURE BEGIN "N", ID_FILE_NEW, VIRTKEY, CONTROL "O", ID_FILE_OPEN, VIRTKEY, CONTROL "S", ID_FILE_SAVE, VIRTKEY, CONTROL "P", ID_FILE_PRINT, VIRTKEY, CONTROL "Z", ID_EDIT_UNDO, VIRTKEY, CONTROL "X", ID_EDIT_CUT, VIRTKEY, CONTROL "C", ID_EDIT_COPY, VIRTKEY, CONTROL "V", ID_EDIT_PASTE, VIRTKEY, CONTROL VK_BACK, ID_EDIT_UNDO, VIRTKEY, ALT VK_DELETE, ID_EDIT_CUT, VIRTKEY, SHIFT VK_INSERT, ID_EDIT_COPY, VIRTKEY, CONTROL VK_INSERT, ID_EDIT_PASTE, VIRTKEY, SHIFT VK_F6, ID_NEXT_PANE, VIRTKEY VK_F6, ID_PREV_PANE, VIRTKEY, SHIFT END // Dialog IDD_ABOUTBOX DIALOG DISCARDABLE 0, 0, 235, 55 STYLE DS_MODALFRAME WS_POPUP | | WS_CAPTION | WS_SYSMENU
CAPTION "About Vidu1" FONT 8, "MS Sans Serif" BEGIN ICON IDR_MAINFRAME,IDC_STATIC,11,17,20,20
Trang 15
L p trình C trên Win ậ
"Vidu1 Version LTEXT 1.0",IDC_STATIC,40,10,119,8,SS_NOPREFIX
LTEXT "Copyright (C) 2004",IDC_STATIC,40,25,119,8 DEFPUSHBUTTON "OK",IDOK,178,7,50,14,WS_GROUP END #ifndef _MAC // Version VS_VERSION_INFO VERSIONINFO FILEVERSION 1,0,0,1 PRODUCTVERSION 1,0,0,1 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS 0x4L FILETYPE 0x1L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904B0" BEGIN VALUE "CompanyName", "\0" VALUE "FileDescription", "Vidu1 MFC Application\0" VALUE "FileVersion", "1, 0, 0, 1\0" VALUE "InternalName", "Vidu1\0" VALUE "LegalCopyright", "Copyright (C) 2004\0" VALUE "LegalTrademarks", "\0" VALUE "OriginalFilename", "Vidu1.EXE\0" VALUE "ProductName", "Vidu1 Application\0" VALUE "ProductVersion", "1, 0, 0, 1\0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1200 END END #endif // !_MAC // DESIGNINFO ifdef APSTUDIO_INVOKED
Trang 16
L p trình C trên Win ậ
GUIDELINES DESIGNINFO DISCARDABLE BEGIN IDD_ABOUTBOX, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 228 TOPMARGIN, 7 BOTTOMMARGIN, 48 END END #endif // APSTUDIO_INVOKED // String Table STRINGTABLE PRELOAD DISCARDABLE BEGIN IDR_MAINFRAME "Vidu1\n\nVidu1\n\n\nVidu1.Document\nVidu1
Document" END STRINGTABLE PRELOAD DISCARDABLE BEGIN AFX_IDS_APP_TITLE "Vidu1" AFX_IDS_IDLEMESSAGE "Ready" END
STRINGTABLE DISCARDABLE BEGIN ID_INDICATOR_EXT "EXT" ID_INDICATOR_CAPS "CAP" ID_INDICATOR_NUM "NUM" ID_INDICATOR_SCRL "SCRL" ID_INDICATOR_OVR "OVR" ID_INDICATOR_REC "REC" END
STRINGTABLE DISCARDABLE BEGIN ID_FILE_NEW "Create a new document\nNew" ID_FILE_OPEN "Open an existing document\nOpen" ID_FILE_CLOSE "Close the active document\nClose" ID_FILE_SAVE "Save the active document\nSave" ID_FILE_SAVE_AS "Save the active document with a new name\nSave As" ID_FILE_PAGE_SETUP "Change the printing options\nPage Setup"
Trang 17
L p trình C trên Win ậ
ID_FILE_PRINT_SETUP "Change the printer and printing options\nPrint Setup"
ID_FILE_PRINT "Print the active document\nPrint" ID_FILE_PRINT_PREVIEW "Display full pages\nPrint Preview" END
STRINGTABLE DISCARDABLE BEGIN ID_APP_ABOUT "Display program information, version number and copyright\nAbout" ID_APP_EXIT "Quit the application; prompts to save
documents\nExit" END
STRINGTABLE DISCARDABLE BEGIN ID_FILE_MRU_FILE1 "Open this document" ID_FILE_MRU_FILE2 "Open this document" ID_FILE_MRU_FILE3 "Open this document" ID_FILE_MRU_FILE4 "Open this document" ID_FILE_MRU_FILE5 "Open this document" ID_FILE_MRU_FILE6 "Open this document" ID_FILE_MRU_FILE7 "Open this document" ID_FILE_MRU_FILE8 "Open this document" ID_FILE_MRU_FILE9 "Open this document" ID_FILE_MRU_FILE10 "Open this document" ID_FILE_MRU_FILE11 "Open this document" ID_FILE_MRU_FILE12 "Open this document" ID_FILE_MRU_FILE13 "Open this document" ID_FILE_MRU_FILE14 "Open this document" ID_FILE_MRU_FILE15 "Open this document" ID_FILE_MRU_FILE16 "Open this document" END
STRINGTABLE DISCARDABLE BEGIN ID_NEXT_PANE "Switch to the next window pane\nNext Pane" ID_PREV_PANE "Switch back to the previous window pane\nPrevious Pane" END
STRINGTABLE DISCARDABLE BEGIN
Trang 18
L p trình C trên Win ậ
ID_WINDOW_SPLIT "Split the active window into panes\nSplit" END
STRINGTABLE DISCARDABLE BEGIN ID_EDIT_CLEAR "Erase the selection\nErase" ID_EDIT_CLEAR_ALL "Erase everything\nErase All" ID_EDIT_COPY "Copy the selection and put it on the Clipboard\nCopy" ID_EDIT_CUT "Cut the selection and put it on the Clipboard\nCut"
ID_EDIT_FIND "Find the specified text\nFind" ID_EDIT_PASTE "Insert Clipboard contents\nPaste" ID_EDIT_REPEAT "Repeat the last action\nRepeat" ID_EDIT_REPLACE "Replace specific text with different text\nReplace"
ID_EDIT_SELECT_ALL "Select the entire document\nSelect All" ID_EDIT_UNDO "Undo the last action\nUndo" ID_EDIT_REDO "Redo the previously undone action\nRedo" END
STRINGTABLE DISCARDABLE BEGIN ID_VIEW_TOOLBAR "Show or hide the toolbar\nToggle ToolBar" ID_VIEW_STATUS_BAR "Show or hide the status bar\nToggle
StatusBar" END
STRINGTABLE DISCARDABLE BEGIN AFX_IDS_SCSIZE "Change the window size" AFX_IDS_SCMOVE "Change the window position" AFX_IDS_SCMINIMIZE "Reduce the window to an icon" AFX_IDS_SCMAXIMIZE "Enlarge the window to full size" AFX_IDS_SCNEXTWINDOW "Switch to the next document window" AFX_IDS_SCPREVWINDOW "Switch to the previous document window" AFX_IDS_SCCLOSE "Close the active window and prompts to save the documents"
END STRINGTABLE DISCARDABLE BEGIN AFX_IDS_SCRESTORE "Restore the window to normal size"
Trang 19
L p trình C trên Win ậ
AFX_IDS_SCTASKLIST "Activate Task List" END
STRINGTABLE DISCARDABLE BEGIN AFX_IDS_PREVIEW_CLOSE "Close print preview mode\nCancel Preview" END
#endif // English (U.S.) resources #ifndef APSTUDIO_INVOKED // Generated from the TEXTINCLUDE 3 resource. #define _AFX_NO_SPLITTER_RESOURCES #define _AFX_NO_OLE_RESOURCES #define _AFX_NO_TRACKER_RESOURCES #define _AFX_NO_PROPERTY_RESOURCES #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 LANGUAGE 9, 1 #pragma code_page(1252) #endif //_WIN32 #include "res\Vidu1.rc2" // non-Microsoft Visual C++ edited resources #include "afxres.rc" // Standard components #include "afxprint.rc" // printing/print preview resources #endif #endif // not APSTUDIO_INVOKED
Taäp tin Vidu1.CPP Taäp tin naøy ñònh nghóa caùc haøm ñaõ khai baùo trong lôùp
CVidu1App, laø lôùp chöông trình chính.
// Vidu1.cpp : Defines the class behaviors for the application. #include "stdafx.h" #include "Vidu1.h"
#include "MainFrm.h" #include "Vidu1Doc.h" #include "Vidu1View.h"
#ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif
Trang 20
L p trình C trên Win ậ
// CVidu1App BEGIN_MESSAGE_MAP(CVidu1App, CWinApp)
//{{AFX_MSG_MAP(CVidu1App) ON_COMMAND(ID_APP_ABOUT, OnAppAbout) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP // Standard file based document commands ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew) ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen) // Standard print setup command ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
END_MESSAGE_MAP() // CVidu1App construction CVidu1App::CVidu1App() {
// TODO: add construction code here, // Place all significant initialization in InitInstance
} // The one and only CVidu1App object CVidu1App theApp; // CVidu1App initialization BOOL CVidu1App::InitInstance() { AfxEnableControlContainer();
// Standard initialization // If you are not using these features and wish to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you do not need.
#ifdef _AFXDLL Enable3dControls(); // Call this when using MFC in a shared DLL #else Enable3dControlsStatic();// Call this when linking to MFC statically #endif
// Change the registry key under which our settings are stored. // TODO: You should modify this string to be something appropriate
Trang 21
L p trình C trên Win ậ
// such as the name of your company or organization. SetRegistryKey(_T("Local AppWizard-Generated Applications"));
LoadStdProfileSettings(); // Load standard INI file options (including MRU)
// Register the application's document templates. Document templates // serve as the connection between documents, frame windows and views.
CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME, RUNTIME_CLASS(CVidu1Doc), RUNTIME_CLASS(CMainFrame), // main SDI frame window RUNTIME_CLASS(CVidu1View));
AddDocTemplate(pDocTemplate); // Parse command line for standard shell commands, DDE, file open CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); // Dispatch commands specified on the command line if (!ProcessShellCommand(cmdInfo)) return FALSE; // The one and only window has been initialized, so show and update it.
m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow(); //m_pMainWnd-> ShowWindow(SW_SHOWMAXIMIZED); //m_pMainWnd->UpdateWindow(); return TRUE;
} // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data
//{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected:
Trang 22
L p trình C trên Win ậ
DoDataExchange(CDataExchange* pDX);
void virtual //}}AFX_VIRTUAL // Implementation protected: //{{AFX_MSG(CAboutDlg) // No message handlers
//}}AFX_MSG DECLARE_MESSAGE_MAP()
}; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) {
//{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT
} void CAboutDlg::DoDataExchange(CDataExchange* pDX) {
CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP
} BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // No message handlers //}}AFX_MSG_MAP
END_MESSAGE_MAP() // App command to run the dialog void CVidu1App::OnAppAbout() {
CAboutDlg aboutDlg; aboutDlg.DoModal();
} // CVidu1App message handlers Phaàn chöùa message map cuûa lôùp CVidu1App keát noái caùc
haøm thaønh vieân nhö sau vaø thoâng ñieäp Windows:
BEGIN_MESSAGE_MAP(CVidu1App, CWinApp) //{{AFX_MSG_MAP(CVidu1App) ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
//}}AFX_MSG_MAP // Standard file based document commands ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew) ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen) // Standard print setup command
Trang 23
L p trình C trên Win ậ
ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
END_MESSAGE_MAP() - Keát noái thoâng ñieäp ID_APP_ABOUT vôùi haøm thaønh vieân OnAppAbout(). Message map naøy laøm cho chöông trình coù khaû naêng ñaùp öùng leänh About treân trình ñôn Help.
- Keát noái thoâng ñieäp ID_FILE_VIEW vôùi haøm thaønh vieân CwinApp::OnFileNew() cho pheùp chöông trình ñaùp öùng leänh trình ñôn File/ New vaø döïa treân haøm thaønh vieân OnFileNew() cuûa lôùp cha meï CwinApp vaø thoâng ñieäp ID_FILE_OPEN cuõng töông töï vôùi haøm thaønh vieân CwinApp::OnFileOpen().
- Haøm khôûi döïng CVidu1App::CVidu1App(): haøm naøy khoâng coù leänh. Ngöôøi laäp trình coù theå thöïc hieän khôûi gaùn moät giaù trò naøo ñoù.
- Taïo moät ñoái töôïng cuûa lôùp CVidu1App duy nhaát theo
leänh sau:
CVidu1App theApp;
- Haøm thaønh vieân InitInstance(): haøm naøy khôûi gaùn nhöõng theå hieän cuûa lôùp CVidu1App baèng caùch thöïc hieän nhöõng coâng vieäc sau:
o Goïi haøm thaønh vieân AfxEnableControlContainer() cho pheùp hoã trôï vieäc chöùa caùc ñoái töôïng OLE o Naïp nhöõng muïc choïn töø taäp tin .INI chuaån söû
duïng haøm SetRegistrykey()
o Naïp danh saùch caùc taäp tin ñöôïc söû duïng gaàn
ñaây nhaát bôûi haøm LoadStdProfileSetting()
o Cho ñaêng kyù öùng duïng, khung cöûa soå vaø lôùp view trong document template cuûa öùng duïng thoâng qua template CsingleDocTemplate vaø söû duïng taùc töû new vaø haøm AddDocTemplate()
o Cung caáp ñoaïn maõ toái thieåu ñeå xöû lyù caùc ñoái muïc phaùt ñi töø doøng leänh vaø cho thi haønh doøng leänh bôûi haøm ProcessShellCommand() döïa treân nhöõng thoâng soá chuyeån qua.
o Hieän leân cöûa soå vaø toâ veõ cöûa soå theo ñuùng thöïc traïng thoâng qua haøm ShowWindow() vaø UpdateWindow()
- Haøm thaønh vieân OnAppAbout():
Trang 24
L p trình C trên Win ậ
void CVidu1App::OnAppAbout() {
CAboutDlg aboutDlg; aboutDlg.DoModal();
}
Leänh thöù nhaát khai baùo theå hieän aboutDlg thuoäc lôùp hoäp hoäi thoaïi CaboutDlg, coøn leänh thöù hai chuyeån thoâng ñieäp C++ DoModal() cho ñoái töôïng aboutDlg ñeå cho hieän leân hoäp hoäi thoaïi modal about.
Taäp tin Vidu1.cpp coøn thieát laäp lôùp khung ñoái thoaïi CaboutDlg maø hoäp thoaïi About seõ duøng ñeán. Lôùp dialog khai baùo kieåu döõ lieäu emun söû duïng ñeán haøng chuù giaûi // {{AFX_DATA ….//}}AFX_DATA vôùi moät vò trí duy nhaát IDD ñöôïc gaùn bôûi IDD_ABOUTBOX. Lôùp naøy cuõng khai baùo moät haøm khôûi taïo vaø haøm virtual DaDataExchange().
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
Goïi haøm khôûi döïng cuûa lôùp cha meï Cdialog vaø trao cho lôùp naøy trò enum IDD ñeå goïi taøi nguyeân cuûa hoäp thoaïi IDD_ABOUTBOX. Ñoaïn maõ cuûa haøm khôûi döïng chöùa nhöõng haøng chuù giaûi /{{AFX_DATA_INIT … //}}AFX_DATA_INIT daønh choã saün ñeå theâm ñoaïn maõ khôûi gaùn cho hoäp thoaïi. Coøn haøm DoDataExchange() thoâng qua ñoaïn maõ sau:
void CAboutDlg::DoDataExchange(CDataExchange* pDX) {
CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP }
// Cuõng daønh choã saün thoâng qua haøng chuù giaûi {{AFX_DATA_MAP …. //}}AFX_DATA_MAP ñeå daønh bieán trao ñoåi döõ lieäu.
Cuoái cuøng taäp tin cuõng ñònh nghóa message map ñoái vôùi lôùp dialog. Map naøy hieän roãng, duøng daønh choã saün coù theå ñöa vaøo nhöõng muïc vaøo message map.
Taäp tin STDAFX.CPP
Taäp tin naøy chæ coù leänh STDAFX.h
Taäp tin MainFrm.cpp
Taäp tin naøy chöùa caùc leänh thieát laäp khung cöûa soå chính cuûa öùng duïng cuûa lôùp CMainFrame. Taäp tin cho thaáy phaàn message map chæ goàm moät muïc vaøo laø
Trang 25
L p trình C trên Win ậ
thoâng ñieäp: ON_WM_CREATE öùng vôùi haøm OnCreate() treân taäp tin tieâu ñeà MAINFRM.H Vì trong öùng duïng Vidu1 duøng ñeán thanh tình traïng neân coù moät baûn daõy kieåu int mang teân indicator[] duøng tröõ caùc maõ ID cuûa caùc nuùt chæ baùo nhö CAPS LOCK, NUM LOCK,…
#include "stdafx.h" #include "Vidu1.h" #include "MainFrm.h"
#ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif // CMainFrame IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd) BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame) ON_WM_CREATE() ON_WM_CLOSE() ON_COMMAND(ID_APP_ABOUT, OnAppAbout) //}}AFX_MSG_MAP END_MESSAGE_MAP()
static UINT indicators[] = {
ID_SEPARATOR, // status line indicator ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL,
}; // CMainFrame construction/destruction CMainFrame::CMainFrame() { // TODO: add member initialization code here
} CMainFrame::~CMainFrame() { } int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
Trang 26
L p trình C trên Win ậ
{ if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) {
TRACE0("Failed to create toolbar\n"); return -1; // fail to create
} if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) {
TRACE0("Failed to create status bar\n"); return -1; // fail to create
} // TODO: Delete these three lines if you don't want the toolbar to // be dockable m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar); return 0;
} BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE;
// TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs int xSize= ::GetSystemMetrics(SM_CXSCREEN); int ySize= ::GetSystemMetrics(SM_CYSCREEN); cs.cx=xSize *9/10; cs.cy=ySize *9/10; cs.x=(xSize - cs.cx )/2; cs.y=(ySize - cs.cy )/2; cs.style &= ~FWS_ADDTOTITLE; cs.style &= ~(WS_MAXIMIZEBOX | WS_MINIMIZEBOX); cs.style &= ~WS_THICKFRAME; return TRUE; }
Trang 27
L p trình C trên Win ậ
// CMainFrame diagnostics #ifdef _DEBUG void CMainFrame::AssertValid() const { CFrameWnd::AssertValid();
} void CMainFrame::Dump(CDumpContext& dc) const { CFrameWnd::Dump(dc);
} #endif //_DEBUG // CMainFrame message handlers void CMainFrame::OnClose() {
// TODO: Add your message handler code here and/or call default if(AfxMessageBox("Thoat chuong khong trinh ", MB_YESNO)==IDYES) CFrameWnd::OnClose();
} void CMainFrame::OnAppAbout() { // TODO: Add your command handler code here }
Phaàn thieát ñaët naøy cuõng bao goàm caùc haøm khôûi döïng, haøm huyû, dummy . Ngöôøi laäp trình coù theå theo vaøo caùc ñoaïn maõ neáu caàn thieát.
Haøm OnCreate() seõ taïo khung cöûa soå lôùp CMainFrame taïo vaø naïp thanh coâng cuï( döïa treân bieán m_wndToolBar) vaø ñaët ñeå caùc chæ baùo cuûa thanh tình traïng (döïa vaøo bieán m_wndStatusBar) cuõng nhö cho neo thanh coâng cuï vaøo nôi chæ ñònh treân cöûa soå. Haøm OnCreate() naøy gôûi ñi nhöõng thoâng ñieäp cho ñoái töôïng m_wndToolBar:
- Gôûi ñi thoâng ñieäp Create() ñeå taïo thanh coâng cuï - Gôûi ñi thoâng ñieäp LoadToolBar() naïp thanh coâng cuï
Baát cöù thoâng ñieäp treân traû veà 0 thì haøm thoaùt ra traû veà trò -1 vaø goïi haøm TRACE0 gôûi ñi caûnh baùo “Failed to create toolbar\n” cho bieát laø taïo thanh coâng cuï baát thaønh. Baèng 0 thì haøm OnCreate() tieáp tuïc gôûi thoâng ñieäp C++ sau ñaây cho ñoái töôïng m_wndStatusBar:
- Gôûi ñi thoâng ñieäp Create() ñeå taïo thanh tình traïng - Gôûi ñi thoâng ñieäp SetIndicators() cho ñaët ñeå caùc nuùt
chæ baùo.
Trang 28
L p trình C trên Win ậ
Neáu moät trong hai thoâng ñieäp treân traû veà 0 thì haøm
seõ thoaùt ñi, traû veà trò -1. Baèng khoâng haøm seõ traû veà 0
Cuoái cuøng caùc haøm PreCreateWindow(), AssertValid() vaø Dump() cuõng ñöôïc thieát ñaët söû duïng ñeán phieân baûn cuûa caùc haøm naøy treân lôùp cöûa soå cha meï laø CFrameWnd.
nhöõng haøng chuù giaûi
Taäp tin Vidu1View.CPP Taäp tin naøy thieát laäp lôùp CVidu1View. Baét ñaàu laø macro IMPLEMENT_DYNCREATE(CVidu1View, CView) cho bieát ñoái töôïng cuûa lôùp seõ ñöôïc taïo ñoäng. Phaàn message map ñöôïc giöõ choã bôûi //{{AFX_MSG_MAP … //}}AFX_MSG_MAP hieän ñeå troáng chöa coù muïc naøo. Tuy nhieân phaàn naøy coù chöùa moät table response map nhö sau:
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
goàm nhöõng muïc vaøo lieân quan ñeán leänh print vaø print preview treân trình ñôn File. Caùc muïc vaøo naøy aùnh xaï caùc thoâng ñieäp ID_FILE_PRINT vaø ID_FILE_PRINT_PREVIEW vôùi caùc haøm Cview::OnFilePrint() vaø Cview::OnFilePrintPreview() thuoäc lôùp cô sôû Cview.
Ngoaøi caùc haøm khôûi döïng, haøm huyû, haøm PreCreateWindow() vaø OnDraw() , thì coù theâm 3 haøm thaønh vieân môùi lo vieäc in aán:
- Haøm thaønh vieân OnPreparePrinting() chæ coù moät leänh duy nhaát laø traû veà trò Bool cuûa haøm ñöôïc keá thöøa laø DoPreparePrinting()
- Haøm thaønh vieân OnBeginPrinting() khoâng coù leänh, cung caáp choã saün ñeå theâm ñoaïn maõ caàn thieát ñeå khôûi gaùn boå sung gì ñoù tröôùc khi in.
- Haøm thaønh vieân OnEndPrinting() cuõng khoâng coù leänh nhöng cung caáp choã saün ñeå theâm ñoaïn maõ rieâng lo vieäc doïn deïp boå sung sau cuøng khi in xong.
#include "stdafx.h" #include "Vidu1.h" #include "Vidu1Doc.h" #include "Vidu1View.h"
Trang 29
L p trình C trên Win ậ
#ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif // CVidu1View IMPLEMENT_DYNCREATE(CVidu1View, CView) BEGIN_MESSAGE_MAP(CVidu1View, CView) //{{AFX_MSG_MAP(CVidu1View) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP // Standard printing commands ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW,
CView::OnFilePrintPreview) END_MESSAGE_MAP() // CVidu1View construction/destruction CVidu1View::CVidu1View() { } CVidu1View::~CVidu1View() { } BOOL CVidu1View::PreCreateWindow(CREATESTRUCT& cs) {
// TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs return CView::PreCreateWindow(cs);
} // CVidu1View drawing void CVidu1View::OnDraw(CDC* pDC) {
CVidu1Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here
} // CVidu1View printing BOOL CVidu1View::OnPreparePrinting(CPrintInfo* pInfo) {
Trang 30
L p trình C trên Win ậ
// default preparation return DoPreparePrinting(pInfo);
} void CVidu1View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add extra initialization before printing
} void CVidu1View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add cleanup after printing
} // CVidu1View diagnostics #ifdef _DEBUG void CVidu1View::AssertValid() const { CView::AssertValid(); }
void CVidu1View::Dump(CDumpContext& dc) const { CView::Dump(dc); }
CVidu1Doc* CVidu1View::GetDocument() // non-debug version is inline { ASSERT(m_pDocument- >IsKindOf(RUNTIME_CLASS(CVidu1Doc))); return (CVidu1Doc*)m_pDocument;
} #endif //_DEBUG
Cuoái cuøng laø haøm kieåm tra hôïp leä AssertValid() vaø Dump (). Ñeå keát thuùc haøm GetDocument() ñöôïc trieäu goïi ñeå coù moät con troû chæ veà taøi lieäu cuûa View ñeå coù theå truy xuaát caùc haøm thaønh vieân cuûa taøi lieäu cuõng nhö macro ASSERT kieåm tra xem coù ñuùng ñoái töôïng taøi lieäu khoâng.
Taäp tin Vidu1Doc.Cpp
Noäi dung taäp tin naøy gioáng taäp tin Vidu1View.cpp nhöng
chæ khaùc hai haøm thaønh vieân:
- OnNewDocument() haøm trieäu goïi haøm OnNewDocument() cuûa lôùp cha meï Cdocument taïo moät taøi lieäu môùi, vaø
Trang 31
L p trình C trên Win ậ
traû veà moät trò Bool. Ngoaøi ra haøm naøy chöøa choã ñeå theâm caùc ñoaïn maõ.
- Serialize() : haøm naøy coù saün nhaùnh IF … ELSE coù theå hoaëc tröõ ñoái töôïng hoaëc ñoäc ñoái töôïng, söû duïng caùc taùc töû >> hoaëc <<. Ñoái töôïng caát tröõ hoaëc naïp thuoäc loaïi persistent.
IV. Trình ClassWizard:
Sau khi söû duïng trình AppWizard ñeå taïo ra moät öùng duïng vôùi caùc thaønh phaàn cô baûn, thì ClassWizard laø moät coâng cuï tìm hoaëc quaûn lyù moät vaøi loaïi ñoái töôïng, ñaëc bieät loaïi lôùp ñoái töôïng thuoäc muïc tieâu cuûa caùc leänh (command target) maø MFC goïi laø lôùp CcmdTarget.
Ñeå söû duïng ClassWizard thöïc hieän choïn menu
View/ClassWizard
Menu cuûa ClassWizard bao goàm 5 tab cho chöùc naêng ñaëc
bieät cuûa ClassWizard:
Trang 32
L p trình C trên Win ậ
- Tab Message maps: Trình nhöõng muïc choïn cho pheùp ñònh nghóa cuõng nhö thay ñoåi nhöõng haøm giaûi quyeát caùc thoâng ñieäp Windows maø öùng duïng seõ nhaän ñöôïc.
- Tab Member Variables : Coù theå taïo ra nhöõng bieán thaønh vieân thuoäc lôùp duøng laøm vieäc vôùi caùc oâ ñieàu khieån treân hoäp hoäi thoaïi, nghóa laø nhöõng lôùp ñoái töôïng gaén lieàn vôùi moät dialog.
- Tab Automation: cung caáp nhöõng löïa choïn lieân quan
ñeán nhöõng OLE .
- Tab ActiveX Event: ñaây laø nôi theâm tình huoáng (event)
cho moät ActiveX control.
- Tab Class Info: Cho xem laïi toång quaùt nhöõng ñaëc tính
chung cuûa lôùp ñoái töôïng.
- Nuùt Add Class : Cho pheùp taïo nhanh vaø deã daøng moät
lôùp ñoái töôïng môùi cho döï aùn.