mfc單文件框架剖析
阿新 • • 發佈:2019-01-29
要看具體的程式碼例項請跳轉:點選開啟連結
通過一些巨集定義實現:
IMPLEMENT_DYNCREATE
BEGIN_MESSAGE_MAP
IMPLEMENT_DYNCREATE(class_name,base_class_name)說明:
通過DECLARE_DYNCREATE巨集來使用IMPLEMENT_DYNCREATE巨集,以允許CObject派生類物件在執行時自動建立。主機使用此功能自動建立物件,例如,當它在序列化過程中從磁碟讀取一個物件時,它在類工具里加入IMPLEMENT_DYNCREATE巨集。若使用者使用DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE巨集,那麼接著使用RUNTIME_CLASS巨集和CObject::IsKindOf成員函式以在執行時確定物件類。若declare_dyncreate包含在定義中,那麼IMPLEMENT_DYNCREATE必須包含在類工具中。
CMainFrame類!!!為框架視窗物件,對應應用程式的主視窗。
1 在MainFrm.h標頭檔案中宣告派生自CFrameWnd類的CMainFrame類定義。 class CMainFrame : public CFrameWndEx { //內容 // 控制元件條嵌入成員 // 生成的訊息對映函式 protected: afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnViewCustomize(); afx_msg LRESULT OnToolbarCreateNew(WPARAM wp, LPARAM lp); DECLARE_MESSAGE_MAP() } 2 在MainFrm.cpp原始檔中實現動態建立及訊息對映等類方法的重寫工作。 IMPLEMENT_DYNCREATE(CMainFrame, CFrameWndEx) BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx) ON_WM_CREATE() ON_COMMAND(ID_VIEW_CUSTOMIZE, &CMainFrame::OnViewCustomize) ON_REGISTERED_MESSAGE(AFX_WM_CREATETOOLBAR, &CMainFrame::OnToolbarCreateNew) ON_WM_GETMINMAXINFO() END_MESSAGE_MAP() // 狀態行指示器 static UINT indicators[] = { // 狀態行指示器 ID_SEPARATOR, //分離器 ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, }; CMainFrame 構造/析構 CMainFrame::CMainFrame() { } CMainFrame::~CMainFrame() { }
CxxxApp類!!!為應用程式物件,負責應用程式的初始化和退出的清理工作
1 在 DllUseDemo.h標頭檔案 中宣告CDllUseDemoApp類。 class CDllUseDemoApp : public CWinAppEx { } //在標頭檔案中定義外部變數(App的物件) extern CDllUseDemoApp theApp; 2 在 DllUseDemo.cpp原始檔 中定義CDllUseDemoApp類。 BEGIN_MESSAGE_MAP(CDllUseDemoApp, CWinAppEx) ON_COMMAND(ID_APP_ABOUT, &CDllUseDemoApp::OnAppAbout) // 基於檔案的標準文件命令 ON_COMMAND(ID_FILE_NEW, &CWinAppEx::OnFileNew) ON_COMMAND(ID_FILE_OPEN, &CWinAppEx::OnFileOpen) END_MESSAGE_MAP() //CDllUseDemoApp構造 CDllUseDemoApp::CDllUseDemoApp() { m_bHiColorIcons = TRUE; // TODO: 將以下應用程式 ID 字串替換為唯一的 ID 字串;建議的字串格式 SetAppID(_T("DllUseDemo.AppID.NoVersion")); // 將所有重要的初始化放置在 InitInstance 中 } // 唯一的一個 CDllUseDemoApp 物件 CDllUseDemoApp theApp; // CDllUseDemoApp 初始化 BOOL CDllUseDemoApp::InitInstance() { //所有重要的初始化 InitContextMenuManager(); InitKeyboardManager(); InitTooltipManager(); // 唯一的一個視窗已初始化,因此顯示它並對其進行更新 m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow(); }
CAboutDlg類!!!對話方塊框類,對應應用程式的“幫助”->“關於”選單,彈出“關於”對話方塊。
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();
// 對話方塊資料
enum { IDD = IDD_ABOUTBOX };
protected:
DECLARE_MESSAGE_MAP()
}
CxxxView類!!!為檢視物件,對應應用程式的客戶視窗,用來顯示文件資料。1 在CDllUseDemoView.h標頭檔案中宣告CDllUseDemoView類。
class CDllUseDemoView : public CScrollView
{
protected: // 僅從序列化建立
CDllUseDemoView();
DECLARE_DYNCREATE(CDllUseDemoView)
public:
HANDLE m_pdispThread;//顯示執行緒
HANDLE m_pCapThread;//呼叫DLL執行緒
}
2 在CDllUseDemoView.cpp原始檔中。
//實現動態建立
IMPLEMENT_DYNCREATE(CDllUseDemoView, CScrollView)
BEGIN_MESSAGE_MAP(CDllUseDemoView, CScrollView)
ON_WM_CONTEXTMENU()
ON_WM_RBUTTONUP()
ON_WM_LBUTTONDBLCLK()
END_MESSAGE_MAP()
CDllUseDemoView::CDllUseDemoView()
{
}
CDllUseDemoView::~CDllUseDemoView()
{
}
BOOL CDllUseDemoView::PreCreateWindow(CREATESTRUCT& cs){}
// CDllUseDemoView 繪製
void CDllUseDemoView::OnDraw(CDC* /*pDC*/){}
//用於顯示的執行緒
void CDllUseDemoView::OnInitialUpdate(){}
void CDllUseDemoView::OnRButtonUp(UINT /* nFlags */, CPoint point){}
void CDllUseDemoView::OnContextMenu(CWnd* /* pWnd */, CPoint point){}
void CDllUseDemoView::OnLButtonDblClk(UINT nFlags, CPoint point){}
CxxxDoc類!!!派生自CDocument文件類,為文件物件,儲存於應用程式相關的資料。在應用中沒有直觀的對應關係。class CDllUseDemoDoc : public CDocument
{
}
程式的執行過程可以簡單的表示如下:CWinApp 類建立的例項theApp , 整個程式有且只有一個,一切由它開始,最後以它結束。
Visual c++所產生的程式碼首先通過初始資料段來建立一個全域性變數,以及建立一些MFC內使用的物件,然後指向CWinApp類的建構函式,一旦所有靜態物件的建構函式都執行完畢,執行是艱苦就會呼叫WinMain函式,該函式初始化MFC應用,並呼叫CWinApp的InitInstance函式。完成了這些工作後,WinMian函式呼叫CWinApp類的Run函式,通常預設為CWinThread::Run() , 用來得到應用程式的訊息迴圈,或者稱為訊息列隊。
當應用程式接受到WM_QUIT訊息,就意味著程式終止,這時,MFC就會呼叫CWinApp類的ExitInstance,然後是靜態物件的解構函式,包括CWinApp物件,然後將控制權交還作業系統。