MFC問題解決辦法

1.MFC程序編譯通過,運行時出錯並提示 f:/dd/vctools/vc7libs/ship/atlmfc/src/mfc/這樣的錯誤,如下圖:


  目前發現的原因有2個:

    (1)之前爲一個控件進行變量綁定,後來覺得這個控件沒用了,就直接在對話框上把控件刪除了,而這個控件的關聯代碼卻沒刪除,這時候刪除該控件的關聯代碼就行了
    (2)在對話框類的構造函數裏初始化對話框中的一些控件值,這樣也會出現上述錯誤。應該在對話框類的 OnInitDialog()方法中初始化控件,然而會發現自己新建對話框類沒有OnInitDialog()方法,這時候需要重寫父類的OnInitDialog()方法:
       在.h文件中加入:
        protected:
            virtual BOOL OnInitDialog();
        在.cpp文件中加入:
        BOOL CDlgBackPlay::OnInitDialog()
        {
                CDialog::OnInitDialog();
                 //這裏寫你的初始化操作
                return TURE;
        }

2. 如何實現在點擊窗口右上角的叉叉(關閉)時不直接退出?   
    首先在
    這裏加入ON_WM_CLOSE(),
    
    然後重寫OnClose()方法,如:
    //重寫OnClose() 方法,釋放SDK資源
    void CLymSdkDemoDlg::OnClose()
    {    
        //if(MessageBox(TEXT("are you sure?"),TEXT("Exit"),MB_OKCANCEL)!=IDOK)
        //{
        //    return;
        //}     
        //NET_DVR_Cleanup();
        //這裏寫你想要的操作
        CDialog::OnClose();
        // TODO: Add your message handler code here
    }
    當然,需要在.h文件中加入:
    public:
        afx_msg void OnClose();

3. 子父窗口間數據如果不好傳遞,可定義爲全局變量。
    如工程名爲Demo,需要全局變量g_lLoginID,
    則在Demo.h中聲明extern LONG g_lLoginID;
    在Demo.cpp文件中定義LONG g_lLoginID;
    這樣在需要g_lLoginID的cpp文件中#include "Demo.h"就行了(默認該工程下的cpp文件都包含了"Demo.h"文件)。

    如果要用的變量比較多,可以將父窗口指針設爲全局變量,如Demo.h中申明extern CDemoDlg *g_pMainDlg;
    cpp文件中寫 CDemoDlg *g_pMainDlg = NULL;在該cpp文件的InitInstance()中合適地方(構造出CDemoDlg 類的對象dlg後)添加g_pMainDlg = &dlg;

    更好的方法:
     (1)發現GetParent函數可以直接獲取父類指針
              CDlgBackPlay * p = (CDlgBackPlay *)GetParent();
     (2)寫一個帶參的子類構造函數,將父類的this指針直接作爲參數傳入到子類中,然後在子類構造函數中將該指針保存下來,這樣就可以使用了


發佈了59 篇原創文章 · 獲贊 10 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章