Trỡnh AppWizard seừ táo ra caực lụựp ủoỏi tửụùng daĩn xuaỏt tửứ caựclụựp ủoỏi tửụùng cụ sụỷ Application classes, Document classes, ViewClasses vaứFrames classes Vớ dú: Lụựp cụ sụỷ Lụựp d
Trang 1L p trình C trên ậ
Win
Trang 2Ùng dúng Single Document:
Vớ dú táo moọt ửựng dúng tẽn vidu1 kieồu single document baống trỡnh
AppWizard Trỡnh AppWizard seừ táo ra caực lụựp ủoỏi tửụùng daĩn xuaỏt tửứ caựclụựp ủoỏi tửụùng cụ sụỷ Application classes, Document classes, ViewClasses vaứFrames classes
Vớ dú:
Lụựp cụ sụỷ Lụựp daĩn xuaỏt Tẽn taọp tin Ghi chuự
CWinApp Cvd1App Vd1.cpp
CDocument Cvd1Doc Vidu1Doc.cpp
CView Cvd1View Vidu1View.cpp
CFrameWnd CmainFrame MainFrm.cpp
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 nguyẽn nhử laứ:
DD_ABOUTBOX: ẹoỏi vụựi taứi nguyẽn laứ moọt hoọp hoọi thoái about boxIDR_MAINFRAME: ẹoỏi vụựi vieọc chia seỷ sửỷ dúng bụỷi nhiều loái taứinguyẽn
IDR_VIDU1TYPE : ẹoỏi vụựi taứi nguyẽ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 khõng trửùc
tieỏp ủửụùc sửỷ dúng bụỷi caực taọp tin taứi nguyẽn khaực Taọp tin naứy seừ ủửụùcsửỷ dúng bụỷi taọp tin Vidu1.RC
Noọi dung taọp tin RESOURCE.RC
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
Trang 3 Taọp tin Vidu1.H
Taọp tin tiẽu ủề Vidu1.H chửựa caực khai baựo liẽn quan ủeỏn lụựpCvidu1App laứ lụựp ửựng dúng Cvidu1 Cvidu1App laứ theồ hieọn (instance) chửụngtrỡnh ửựng dú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ụ ủồ dửựụi ủãy:
CObject
CCmdTarget
CWinThread
CWinApplaứ haọu dueọ cuỷa lụựp CCmdTarget lo vieọc quaỷn lyự nhửừng cõng vieọcủửụùc ủoứi hoỷi ủeồ khụỷi ủoọng ửựng dúng cuừng nhử ủeồ cho cháy vaứ keỏtthuực ửựng dúng MFC Nhử sụ ủồ trẽn CWinApp ủửụùc daĩn xuaỏt tửứ moọtchuoĩi lụựp CWinThread, CcmdTarget vaứ CObject Trong vớ dú Cvidu1App laứgiao dieọn vụựi Windows Khi moọt tỡnh huoỏng xaỷy ra trong Windows thỡ thõ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ớ dú neỏu moọt phớm ủửụùc nhaỏn, thỡ thõng ủieọp WM_KEYDOWN seừủửụùc phaựt ra vaứ chuyeồn cho Cvidu1App vaứ ủeỏn phiẽn chửụng trỡnh seừ khụỷiủoọng haứm giaỷi quyeỏt vaỏn ủề naứy laứ OnKeyDown()
// Vidu1.h : main header file for the VIDU1 application
#if!
defined(AFX_VIDU1_H B682FE11_E54B_4D80_A49B_3C3AEAE1FF85_ _INCLUDED_)
#defineAFX_VIDU1_H B682FE11_E54B_4D80_A49B_3C3AEAE1FF85 INCLUDED_
#if _MSC_VER > 1000
#pragma once
Trang 4#endif // _MSC_VER > 1000
#ifndef AFXWIN_H
#error include 'stdafx.h' before including this file for PCH
#endif #include "resource.h" // main symbols
/////////////////////////////////////////////////////////////////////////////
// CVidu1App:
// See Vidu1.cpp for the implementation of this class
// class CVidu1App : public CWinApp
//{{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() };
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 ủũnhnghú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:
Trang 5Múc vaứo naứy bao giụứ cuừng baột ủầu bụỷi afx_msg void theo sau laứ tẽn haứmgiaỷi quyeỏt thõng ủieọp bao giụứ cuừng baột ủầu bụỷi On.
Caởp chuự giaỷi {{AFX_MSG … }}AFX_MSG seừ tửụng ửựng vụựi caởpchuự giaỷi {{AFX_MSG_MAP … }} AFX_MSG_MAP trong taọp tin Vidu1.cpp
Haứm chuự giaỷi maứ ClassWizard sửỷ dúng ủeồ phuỷ quyeỏt haứm virtualnhử InitIntance() seừ sửỷ dúng macro AFX_VIRTUAL nhử sau:
//{{AFX_VIRTUAL(CVidu1App) public:
virtual BOOL InitInstance();
//}}AFX_VIRTUAL
AFX_VIRTUAL duứng ủaựnh daỏu khụỷi ủầu vaứ keỏt thuực nhửừng khaibaựo cuỷa caực haứm virtual maứ ClassWizard seừ phuỷ quyeỏt trong taọp tin H cuỷalụự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ứ trẽn taọp tin CPP seừ coự phần
ủũnh nghúa moọt “baỷn ủồ thõng ủieọp” (message map) liẽn quan ủeỏn caực haứmgiaỷi quyeỏt thõng ủieọp baột ủầu bụỷi macro BEGIN_MESSAGE_MAP vaứ keỏtthuực bụỷi macro END_MESSAGE_MAP nhử sau:
Taọp tin STDAFX.H
Taọp tin STDAFX.H chuỷ yeỏu include 3 taọp tin AFXWIN.H , AFXEXT.Hvaứ AFXDISP.H Caực leọnh naứy baỷo ủaỷm laứ ửựng dúng coự theồ duứngnhửừng lụựp trong caực taực vú chuaồn vaứ nụựi roọng cuừng nhử lụựp liẽn quanủeỏn ActiveX Control (OLE)
#if!
defined(AFX_STDAFX_H 0CF6915F_3416_4CE6_AE4D_815051CD1243 INC LUDED_)
Trang 6#defineAFX_STDAFX_H 0CF6915F_3416_4CE6_AE4D_815051CD1243_ _INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#define VC_EXTRALEAN
#include <afxwin.h> // MFC core and standard components
#include <afxext.h> // MFC extensions
#include <afxdisp.h> // MFC Automation classes
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ỷalụự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!
defined(AFX_MAINFRM_H D2F0152D_93B3_4329_97B6_5DCED9B39D00 I NCLUDED_)
#define
AFX_MAINFRM_H D2F0152D_93B3_4329_97B6_5DCED9B39D00 INCLUD ED_
Trang 7virtual void Dump(CDumpContext& dc) const;
// 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() };
Lụựp CmainFrame ủửụùc daĩn xuaỏt tửứ lụựp cụ sụỷ CframeWnd, vỡ ủãy laứửựng dúng SDI chổ laứm vieọc vụựi moọt taứi lieọu trong moọt luực Phần khaibaựo gồm:
- Haứm khụỷi táo protected CMainFrame() haứ haứm huyỷ ~CMainFrame()
- Haứm thaứnh viẽn CObject::AssertValid() duứnh kieồm tra hụùp leọ ủoỏitửụùng vaứo luực cháy baống caựch kieồm tra tỡnh tráng noọi tái Trongphiẽn baỷn Debug (khai baựo 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 thõng baựocho bieỏt soỏ thửự tửù doứng leọnh vaứ tẽn taọp tin neỏu giaỷ ủũnh naứykhõng truựng
- Haứm thaứnh viẽn CObject::Dump() duứng tuõn xoồ (dump) noọi dungủoỏi tửụùng khi gụừ roỏi
- Bieỏn thaứnh viẽn m_wndStatusbar thuoọc kieồu Cstatusbar duứng chửựatỡnh tráng cuỷa thanh tỡnh tráng
- Bieỏn thaứnh viẽn m_wndToolBar thuoọc kieồu CToolBar duứng chửựatỡnh tráng cuỷa thanh cõng cú
Trang 8Ngoaứi ra lụựp coứn khai baựo moọt message map (thõng qua macroDECLARE_MESSAGE_MAP ụỷ cuoỏi phần khai baựo lụựp), cuừng nhử nhửừngchuự giaỷi {{AFX_MSG … }}AFX_MSG duứng laứm choĩ daứnh trửụực ủeồ cheứncaực haứm thaứnh viẽn giaỷi quyeỏt caực thõng ủieọp maứ coự theồ về sau seừthẽm vaứo sửỷ dúng ủeỏn trỡnh ClassWizard.
Ngoaứi ra lụựp naứy coứn trieọu gói:
- haứm afx_msg void OnCreate() ủeồ táo moọt cửỷa soồ cho pheựp ửựngdúng giaỷi quyeỏt caực thõng ủieọp Windows Caực haứm naứy baột ủầubụỷi afx_msg cho bieỏt laứ haứm giaỷi quyeỏt caực thõng ủieọp Windowsủaừ coự saỹn Vớ dú haứm afx_msg void OnCreate() seừ giaỷi quyeỏtthõng ủieọp Windows WM_CREATE táo moọt cửỷa soồ
- Haứm virtual BOOL PreCreateWindow() ủeồ laứm vieọc gỡ ủoự, trửụực khitá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 khicửỷa soồ táo ra
Cuoỏi cuứng trong phầ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 CObjectcoự theồ ủửụùc táo ủoọng (dynamic) vaứo luực cháy chửụng trỡnh Caực lụựpdocument, view vaứ frame ủều chũu hoĩ trụù vieọc táo ủoọng caực ủoỏi tửụùng,nẽn caực lụựp CVidu1Doc vaứ CVidu1View ủều coự macroDECLARE_DYNCREATE() naứy nhử :
- DECLARE_DYNCREATE(CVidu1Doc) trẽn taọp tin Vidu1Doc.h
- DECLARE_DYNCREATE(CVidu1View) trẽ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ứ
#ifdef _DEBUG virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
Cho bieỏt laứ caực haứm naứy chổ hoát ủoọng khi chửụng trỡnh ủửụùc biẽndũch theo phiẽn baỷn debug duứng gụừ roỏi chửụng trỡnh Nhửng khi biẽn dũch theophiẽn baỷn Release (chửụng trỡnh ủaừ gụừ roỏi xong) ủeồ phãn phoỏi cho ngửụứisửỷ dúng thỡ caực haứm naứy seừ khõng naốm trong thaứnh phần chửụng trỡnhobject
Taọp tin Vidu1View.H
Trang 9Lụựp CVidu1View ủửụùc daón xuaỏt tửứ lụựp cụ sụỷ Cview View ủửụùc xemnhử 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!
defined(AFX_VIDU1VIEW_H D46CA8EC_3131_454A_A608_9CD3144E2B54 I NCLUDED_)
#defineAFX_VIDU1VIEW_H D46CA8EC_3131_454A_A608_9CD3144E2B 54 INCLUDED_
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;
Trang 10// 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()
Tửụng tửù nhử caực taọp tin tiẽu ủề khaực, taọp tin tiẽu ủề CVidu1View Hcoự caực haứm khụỷi táo CVidu1View(), haứm huyỷ ~CVidu1View(), haứm kieồmtra hụùp leọ AssertValid() vaứ haứm tuõn xoồ gụừ roỏi chửụng trỡnh Dump()
Vỡ lụựp View phaỷi ủóc taứi lieọu naứo ủoự ủeồ cho hieồn thũ (hoaởc in ) dửừkieọn, nẽ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ụựpnaứy ủửụùc daĩn xuaỏt tửứ CDocument) ủửụùc gaộn liền vụựi view Khi coự con troỷrồi thỡ lụựp naứy mụựi coự theồ truy xuaỏt caực haứm thaứnh viẽn cuỷa lụựp taứilieọu CVidu1Doc
Vỡ laứ view nẽ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ớ dú Vidu1 coự trỡnh ủụn File-Print, vaứ File- Print Preview nẽn lụựp naứy cuừng phaỷi khai baựo luõn haứmvirtual in aỏn nhử sau:
virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
Taỏt caỷ caực haứm trẽn ủều sửỷ dúng ủeỏn moọt ủoỏi tửụùng CDC (thuoọcgiao dieọn ủồ hóa GDI) ủửụùc chổ về con troỷ pDC Khi tõ, veừ cần ủeỏn caựcbuựt veừ (pen) hoaởc có veừ (brush) vaứ ủãy laứ nhửừng taứi nguyẽn GDI
Trang 11Taỏt caỷ caực haứm virtual trẽn ủề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 macroDECLARE_MESSAGE_MAP ) vaứ chửựa choĩ saỹn cho ClassWizard thẽm baỏtcửự haứm thaứnh viẽn giaỷi quyeỏt caực thõng ủieọp, thõng qua caực haứnh chuựgiaỷi {{AFX_MSG … }} AFX_MSG Trong vớ dú hieọn chửa coự haứm giaỷiquyeỏt naứo caỷ
Cuoỏi cuứng laứ haứm inline caứi ủaởt haứm GetDocument () bao bóc bụỷichổ thũ trỡnh biẽn dũch #ifndef … #endif , vaứ chổ hieọn hửừu trong phiẽn baỷndebug
#ifndef _DEBUG // debug version in Vidu1View.cpp
inline CVidu1Doc* CVidu1View::GetDocument() { return (CVidu1Doc*)m_pDocument; }
#endif
Taọp tin Vidu1Doc.H
Taọp tin naứy chửựa khai baựo liẽn quan ủeỏn taứi lieọu, taọp tin naứy khaibaự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 I NCLUDED_)
#defineAFX_VIDU1DOC_H D00A42EA_1136_4442_9C89_003869BBC74 B INCLUDED_
Trang 12virtual void Serialize(CArchive& ar);
//}}AFX_VIRTUAL // Implementation
public:
virtual ~CVidu1Doc();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
Ngoaứi caực haứm khụỷi gaựn, haứm huyỷ, haứm kieồm tra hụùp leọ, haứmtuõn xoồ noọi dung taứi lieọu khi gụừ roỏi chửụng trỡnh Trong phần khai baựohaứm virtual coự hai haứm liẽn quan ủeỏn taứi lieọu:
- Haứm virtual BOOL OnNewDocument() nhử laứ thaứnh phần cuỷa leọnhFile/ New ủeồ mụỷ taứi lieọu Neỏu laứ taứi lieọu SDI khi ra leọnh File/Newthỡ haứm naứy khụỷi gaựn lái taứi lieọu hieọn hửừu thay vỡ táo moọt taứilieọu mụựi Neỏu ửựng dúng laứ MDI thỡ leọnh trẽn seừ sửỷ dúng haứmnaứy ủeồ táo moọt taứi lieọu mụựi
- Haứm virtual void Serialize(Carchive &ar) duứng ủeồ vieỏt hoaởc ủóc ủoỏitửụùng taứi lieọu lẽn moọt ủoỏi tửụùng Carchive hoaởc tửứ ủoỏi tửụùngCarchive ẹoỏi tửụùng Carchive nhử laứ moọt doứng dửừ lieọu nhũ phãn.Haứm naứy mang tớnh chaỏt saỷn sinh haứng loát ủoỏi tửụùng do ủoự coựchửừ Serial
Trang 13Lụựp Document cho pheựp caỏt trửừ dửừ lieọu hoaởc ủóc xuoỏng dửừ lieọutửứ moọt taọp tin gói laứ taứi lieọu, cho pheựp Windows khai thaực nhiều taứilieọ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 nguyẽn liẽn quan ủeỏn menu, phớm noựng,hoọp hoọi thoái,…
//Microsoft Developer Studio generated resource script.
// English (U.S.) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
"#ifdef _WIN32\r\n"
"LANGUAGE 9, 1\r\n"
Trang 14"#pragma code_page(1252)\r\n"
"#endif //_WIN32\r\n"
"#include ""res\\Vidu1.rc2"" // non-Microsoft Visual C++ edited 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
// 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
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
Trang 15MENUITEM 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 "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
"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
Trang 16VK_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"
VALUE "InternalName", "Vidu1\0"
VALUE "LegalCopyright", "Copyright (C) 2004\0"
VALUE "LegalTrademarks", "\0"
VALUE "OriginalFilename", "Vidu1.EXE\0"
VALUE "ProductName", "Vidu1 Application\0"