• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • MFC應用程序中的對象通信

    發表于:2007-07-04來源:作者:點擊數: 標簽:
    湖南商檢局 扶忠踐 使用MFC AppWizard 構造的應用程序框架,主要包括以下幾個對象:應用程序對象、文檔模板、主框架窗口對象、文檔對象、視口對象等,它們各自的任務見表1,它們之間的關系見圖1。 圖1 應用程序、文檔模板、文檔、框架窗口及視口對象之間的相
    湖南商檢局 扶忠踐

      使用MFC AppWizard 構造的應用程序框架,主要包括以下幾個對象:應用程序對象、文檔模板、主框架窗口對象、文檔對象、視口對象等,它們各自的任務見表1,它們之間的關系見圖1。
    http://www.kjueaiud.com/uploads/2007/07/1_200707042008571.jpg (20770 字節)
    http://www.kjueaiud.com/uploads/2007/07/1_200707042008572.jpg (12492 字節)
    圖1 應用程序、文檔模板、文檔、框架窗口及視口對象之間的相互關系

      應用程序用對象分工的方式,將程序的主要任務分布在這些對象中。這些對象通過用其他對象成員函數和發送消息來相互通信協同工作。

      當我們沒有弄清MFC 應用程序的這種對象分工機制和這些對象之間的通信方法時,我們就總感慨MFC 編程的困難,一頭霧水,無法領略到MFC 編程的魅力。

      由此看來,MFC 編程中一個經常遇到的問題就是如何訪問應用程序的其他對象,以利用屬于這些對象的函數,也就是對象通信的問題。當我們用AppWizard 產生一個應用程序后,在視類中就自動加入了成員函數GetDocument(),有了這個函數,視類就可以完成從視類到文檔對象的通信,就可以操作文檔類的成員函數和成員變量。但這是不夠的,下表列出了MFC 應用程序的對象之間的通信方法。
    http://www.kjueaiud.com/uploads/2007/07/1_200707042008573.jpg (31748 字節)
      下面我們給出一個實例,當雙擊視窗時,它將實現以下功能:

      改變原來視窗顯示的內容和變量的值;
      改變主框架窗口和子框架窗口的標題;
      改變狀態條的內容;
      增加一個菜單的選項;
      變化工具條圖標;
      運行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);
    }   

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>