1. 程式人生 > >mfc單文件框架剖析

mfc單文件框架剖析

要看具體的程式碼例項請跳轉點選開啟連結

通過一些巨集定義實現:

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物件,然後將控制權交還作業系統。