MFC 單文件框架的主選單建立時間

2021-05-22 12:13:59 字數 1920 閱讀 4816

在主框架的oncreate函式中,你可以看到工具條和狀態列的建立,理論上來說,你也應該可以看到主選單的建立。找找看,發現沒有。但是當你執行程式的時候,卻又明明有主選單。很顯然,mfc還是建立了主選單,只是在某個函式中將它隱藏了。那是在哪呢?慢慢找,不著急。

你看到前面有這樣的一句話,

if (cframewnd::oncreate(lpcreatestruct) == -1)

return -1;

感覺有點像,莫非主框架類呼叫了基類的oncreate函式建立了主選單?看看它的引數,在csdn看看,如下:

typedef struct tagcreatestruct createstruct;

裡面果真有個hmenu,這是個選單控制代碼,可能性加大了。但是你現在還不能肯定,怎麼辦?把這句話注釋掉,看是不是主選單沒有了?如果沒有了主選單,那麼就可以肯定主選單肯定是在這句**中建立的。好的,試試看,主選單還在。顯然尋找失敗了,不然主選單不可能還在。

繼續尋找,發現下面還有個:

if( !cframewnd::precreatewindow(cs) )

return false;

return true;

難道是這個嗎?按照上面相同的方法,我將這句注釋掉,發現主選單不見了,而且提示「建立空文件失敗」。顯然,我們現在還不能肯定主選單一定是在這個函式中建立的。我們搜下包含文字"loadmenu"的檔案,因為建立主選單往往要載入選單資源。發現在winfram.cpp中有cframewnd::create函式包含loadmenu. 接下來分別在cframewnd::oncreate(lpcreatestruct) == -1),  if( !cframewnd::precreatewindow(cs) ) 和loadmenu加三個斷點,發現程式的確執行到這三個位置,並且loadmenu是在cframewnd::oncreate(lpcreatestruct) == -1)之前。現在看看cframewnd::precreatewindow(cs),**如下:

bool cframewnd::precreatewindow(createstruct& cs)

if ((cs.style & fws_addtotitle) && afxdata.bwin4)

cs.style |= fws_prefixtitle;

if (afxdata.bwin4)

cs.dwexstyle |= ws_ex_clientedge;

return true;

}可以看到,它並沒有做什麼,只是修改了視窗的樣式。

現在我們可以得出兩個結論,主選單是在precreatewindow之後建立的,並且是在oncreate被呼叫之前建立的。

我們看看還有什麼**我們沒有用到,在這些**中可能含有我們所要找的東西。我們知道設定主選單的函式為setmenu,它是cframewnd的成員函式,我們在cframewnd的實現**中搜尋它,有以下幾個函式包括它。

onupdateframemenu,ondestroy,onsetpreviewmode.這三個函式都有可能,我們用排除法。查詢msdn,發現後面兩個在一般情況下不會被呼叫,故可以肯定主選單是在cframewnd載入,在onupdateframemenu中設定的。我們可以看下主框架的函式呼叫順序。

loadframe->precreatewindow->create(載入選單)->oncreate->oncreateclient->createview->initialupdateframe->

onidleupdatecmdui(在這裡呼叫了onidleupdatecmdui設定了主選單)。

這是我自己的探索過程,能力有限,有可能有錯誤,關鍵在於思路。

另外提示一下:如果 要隱藏主選單或者設定自己的選單為主選單,可以對映主框架的wm_showwindow訊息。這個訊息是發生在主框架和檢視已經建立後,視窗顯示前。如果在之前的地方設定,會出現錯誤,而在顯示之後再設定選單就達不到預定的目的。

MFC 單文件 建立

據嚮導建立的單文件時候,view類的基類選擇 cformview,這樣可使用控制項 根據嚮導建立單文件,在 使用者介面功能 取消 使用傳統的停靠工具欄 可選 如果支援mysql資料庫 在資料庫支援的頁面 資料庫支援 選擇 不提供檔案支援的資料庫檢視 客戶端型別選 odbc 型別選擇 快照 資料來源 ...

MFC單文件框架理解

mfc程式的整個執行機制需要經過 設計視窗類,註冊視窗類,建立視窗,顯示並更新視窗,訊息迴圈。csingledoctemplate pdoctemplate 定義單文件模板物件指標 pdoctemplate new csingledoctemplate idr mainframe,runtime c...

VC 手工編譯MFC單文件框架

2.匯入現有的 和res資料夾和其中的檔案 3.修改專案屬性和依賴項 1 右鍵選單 選擇專案 屬性 配置屬性 鏈結器 子系統,改為windows subsystem windows 解決方法 工程 project 屬性 properties 配置屬性 configuration properties...