使用MFC AppWizard
構造的應用程序框架,主要包括以下幾個對象:應用程序對象、文檔模板、主框架窗口對象、文檔對象、視口對象等,它們各自的任務見表1,它們之間的關系見圖1。
圖1
應用程序、文檔模板、文檔、框架窗口及視口對象之間的相互關系
應用程序用對象分工的方式,將程序的主要任務分布在這些對象中。這些對象通過用其他對象成員函數和發送消息來相互通信協同工作。
當我們沒有弄清MFC
應用程序的這種對象分工機制和這些對象之間的通信方法時,我們就總感慨MFC
編程的困難,一頭霧水,無法領略到MFC 編程的魅力。
由此看來,MFC
編程中一個經常遇到的問題就是如何訪問應用程序的其他對象,以利用屬于這些對象的函數,也就是對象通信的問題。當我們用AppWizard
產生一個應用程序后,在視類中就自動加入了成員函數GetDocument(),有了這個函數,視類就可以完成從視類到文檔對象的通信,就可以操作文檔類的成員函數和成員變量。但這是不夠的,下表列出了MFC
應用程序的對象之間的通信方法。
下面我們給出一個實例,當雙擊視窗時,它將實現以下功能:
改變原來視窗顯示的內容和變量的值;
改變主框架窗口和子框架窗口的標題;
改變狀態條的內容;
增加一個菜單的選項;
變化工具條圖標;
運行AppWizard,產生一個多文檔的名稱為Test 的工程;
為工程加入ID 號為ID_MY_MENU 的資源;
為CTestDoc 類增加成員變量CString TestText。
class CTestDoc : public Cdocument
{
public:
CString TestText;
};
BOOL CTestDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
TestText=" 初次進入,
未有雙擊事件!";// 初始化TestText;
return TRUE;
}
void CTestView::OnDraw(CDC *pDC)
{
CTestDoc *pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC ->TextOut(5,5,pDoc ->TestText);
}
用ClassWizard 為CTestView 類增加處理鼠標左鍵雙擊事件的函數;
void CTestView::OnLButtonDblClk
(UINT nFlags, CPoint point)
{
CView::OnLButtonDblClk(nFlags, point);
//CTestDoc 的成員變量
TestText 被重新賦值!
CTestDoc *pDoc = GetDocument();
pDoc ->TestText=" 雙擊事件發生,
變量TestText 被重新賦值!";
InvalidateRect(NULL,TRUE);
// 變化子框架窗口的標題
CWnd *pParent= GetParentFrame();
pParent ->SetWindowText
(" 雙擊事件發生,變量TestText
被重新賦值!這是在子窗口??!");
// 變化主框架窗口的標題
AfxGetApp() ->m_pMainWnd ->
SetWindowText(" 雙擊事件發生,
變量TestText 被重新賦值!
這是在主窗口??!");
// 變化狀態條的內容
CStatusBar *pStatus=(CStatusBar *)
AfxGetApp() ->m_pMainWnd ->
GetDescendantWindow(AFX_IDW_STATUS_BAR);
if (pStatus) pStatus ->SetPaneText
(0," 雙擊事件發生,變量TestText
被重新賦值!這是在狀態條??!");
// 插入新的菜單項目ID_MY_MENU,
標題為新菜單
CMenu *pMenu;
pMenu=AfxGetApp() ->m_pMainWnd ->GetMenu();
pMenu ->InsertMenu
( -1,MF_BYCOMMAND,ID_MY_MENU," 新菜單");
AfxGetApp() ->m_pMainWnd ->DrawMenuBar();
// 變化工具條
CToolBar *pTool=(CToolBar *)AfxGetApp() ->
m_pMainWnd ->GetDescendantWindow
(AFX_IDW_ TOOLBAR);
pTool ->SetButtons(NULL,8);
pTool ->SetButtonInfo
(0,ID_FILE_NEW,TBBS_BUTTON,0);
pTool ->SetButtonInfo
(1,ID_FILE_OPEN,TBBS_BUTTON,1);
pTool ->SetButtonInfo
(2,ID_FILE_SAVE,TBBS_BUTTON,2);
pTool ->SetButtonInfo
(3,ID_SEPARATOR,TBBS_SEPARATOR,4);
pTool ->SetButtonInfo
(4,ID_EDIT_CUT,TBBS_BUTTON,4);
pTool ->SetButtonInfo
(5,ID_EDIT_COPY,TBBS_BUTTON,5);
pTool ->SetButtonInfo
(6,ID_EDIT_PASTE,TBBS_BUTTON,6);
pTool ->SetButtonInfo
(7,ID_SEPARATOR,TBBS_SEPARATOR,4);
}