程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> VC中單文檔框架刪除菜單的調試經歷

VC中單文檔框架刪除菜單的調試經歷

編輯:vc教程

 最近想在VC中單文檔框架中刪除菜單,狀態欄,工具欄 。狀態欄,工具欄在CMainFrame::OnCreate中就可以注釋調,但是怎麼樣將菜單刪掉呢?百度了一下,不太好找到。只好依靠現有知識,自己找到辦法了。通過跟蹤調試MFC的源代碼居然讓我找到了辦法。

  首先,我們先想辦法達到在單文檔界面中不顯示菜單的效果。

  通過現有知識,我們知道MFC是在CMainFrame::OnCreate中生成狀態欄,工具欄的。代碼如下:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
        return -1;

   
    if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
        | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
        !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
    {
        TRACE0("未能創建工具欄 ");
        return -1;      // 未能創建
    }

    if (!m_wndStatusBar.Create(this) ||
        !m_wndStatusBar.SetIndicators(indicators,
          sizeof(indicators)/sizeof(UINT)))
    {
        TRACE0("未能創建狀態欄 ");
        return -1;      // 未能創建
    }

    // TODO: 如果不需要工具欄可停靠,則刪除這三行
    m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
    EnableDocking(CBRS_ALIGN_ANY);
    DockControlBar(&m_wndToolBar);
                     return 0;
}
  所以如果不想要狀態欄,工具欄,直接在CMainFrame::OnCreate中將相關代碼注釋調就行了。那麼,菜單相關的代碼在哪呢?遍歷一遍CMainFrame類,沒找到。根據代碼相關性,既然狀態欄,工具欄是在 CMainFrame::OnCreate中生成的,那麼菜單估計也是在這個函數裡面生成的。

  首先在 if (CFrameWnd::OnCreate(lpCreateStruct) == -1) 處下斷點,進入函數內部,代碼如下:

int CFrameWnd::OnCreate(LPCREATESTRUCT lpcs)
{
    ENSURE_ARG(lpcs != NULL);
    CCreateContext* pContext = (CCreateContext*)lpcs->lpCreateParams;
    return OnCreateHelper(lpcs, pContext);
}
  繼續進入OnCreateHelper函數,代碼如下:

int CFrameWnd::OnCreateHelper(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
    if (CWnd::OnCreate(lpcs) == -1)
        return -1;

    // create special children first
    if (!OnCreateClIEnt(lpcs, pContext))
    {
        TRACE(traceAppMsg, 0, "Failed to create client pane/vIEw for frame. ");
        return -1;
    }

    // post message for initial message string
    PostMessage(WM_SETMESSAGESTRING, AFX_IDS_IDLEMESSAGE);

    // make sure the child Windows have been properly sized
    RecalcLayout();

    return 0;   // create ok
}

下一步進入OnCreateClIEnt,代碼如下:

BOOL CFrameWnd::OnCreateClIEnt(LPCREATESTRUCT, CCreateContext* pContext)
{
    // default create client will create a v

[1] [2] [3] [4] 下一頁

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved