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指針直接作爲參數傳入到子類中,然後在子類構造函數中將該指針保存下來,這樣就可以使用了