1. 程式人生 > >寫MFC程式還是先註釋寫登錄檔或者先清理登錄檔吧!

寫MFC程式還是先註釋寫登錄檔或者先清理登錄檔吧!

血的教訓,浪費了大把時間除錯找問題,然而卻不知道MFC自動寫註冊帶來的巨坑有多坑。一次次讓你懷疑人生, 微軟這個設計老子真心想拍死你。 1.自動寫登錄檔,這裡說自動是建立工程自帶SetRegistryKey將巨坑埋下伏筆 2.註冊資訊不是空,講道理應該為空,但老vc都知道軟體保留使用者操作習慣是預設的。 3.註冊資訊奇多,含選單/工具欄/狀態列/停靠視窗,,,似乎除了main  client區域。(需要補充,不確定) 這些東西,如果你沒註釋,開發過程中受的苦就是:面板設定成功,顯示還是原來的,選單修改成功顯示還是原來的,原因就是登錄檔裡儲存的是你的資源資訊。各種介面呼叫成功了,顯示出來的卻不是你想要的是不是懷疑人生? 開發後,如果不注意,在你的電腦顯示好好的,在人家的電腦上就是不一樣,原因還是登錄檔。 此次就是為了做多語言支援,修改選單ModifyMenu(hSubMenu,i, MF_STRING| MF_BYPOSITION,ID_FILE_SAVE,"Save");總是不成功,實際呼叫是正確的,清除登錄檔就ok了。 好了,暫不吐槽了,處理問題才是關鍵: 1.InitInstance()中註釋SetRegistryKey() 2.ExitInstance()中CleanState() 今天還遇到還有可能碰到以上兩種方法不管用,第一種程式跑不起來,第二種清理不乾淨。原因:第一種會導致取資源失敗自然建立MainFrame失敗,第二種就真是清理不乾淨了,所以手動delRegist(自己寫清理登錄檔函式,或者手動刪除登錄檔)才行。 關於ModifyMenu
再補充一點使用時的注意項: 在修改MDI的Mainfrm/ChildFrm選單時,獲取這兩個選單控制代碼然後修改 pDocTemplate->m_hMenuShared;//ChildFrm Menu pMainFrame->m_hMenuDefault;//主框架Menu 如果是在MainFrm中獲取MainMenu還有m_wndMenuBar.GetHMenu()和GetMenu() 至於修改就是ModifyMenu了。 今天發現在InitInstance中可以初始化ChrildFrmMenu的修改,但不能對MainFrmMenu修改 在MainFrm中OnCreat()中初始化MainFrmMenu的修改又能成功,於是我對比pMainFrame->m_hMenuDefault ?= m_wndMenuBar.GetHMenu()。是相等的,也就是說Menu是同一個,都正確取到了,但是更改只能在Mainfrm中完成!!!