彈出非模態對話框很簡單,使用Create+ShowWindow就好了。但是如果在線程中這樣做,那可是有問題的~(可以自己去試試)所以,我們就需要自定義消息映射和函數,通過SendMessage來創建非模態對話框。使用非模態對話框切記要懂得及時銷毀,否則產生大量野指針就壞了!
建立非模態對話框代碼:
1 2 3 |
CMyDlg *myDlg=new CMyDlg(); // CMyDlg為對應對話框類 myDlg->Create(IDD_MY,NULL); // IDD_MY為對應對話框ID號 myDlg->ShowWindow(SW_SHOW); |
在線程中建立非模態對話框代碼:
自定義一條消息,在線程中需要創建非模態對話框向應用程序消息隊列投遞一條自定義消息,在此消息的響應函數中創建。還可以再定義一條消息進行銷毀。
1 2 3 4 5 6 |
#define UM_CREATE_DLG WM_USER+105 //創建對話框的消息 #define UM_DELETE_DLG WM_USER+106 //銷毀對話框的消息 ... afx_msg void OnCreateDlg(WPARAM,LPARAM);//消息函數聲明 afx_msg void OnDeleteDlg(WPARAM,LPARAM); //以上在頭文件中聲明 |
添加消息映射:
1 2 |
ON_MESSAGE(UM_CREATE_DLG,OnCreateDlg)//消息映射 ON_MESSAGE(UM_DELETE_DLG,OnDeleteDlg)//在CPP文件添加 |
定義創建和銷毀非模態對話框消息函數:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
void CLANCommunionDlg::OnCreateDlg(WPARAM wParam,LPARAM lParam ) { CMyDlg* p=(CMyDlg*)wParam; //CMyDlg為非模態對話框類 p->Create(IDD_MY_DLG,this); //IDD_MY_DLG為非模態對話框資源ID p->ShowWindow(SW_SHOW); }
void CLANCommunionDlg::OnDeleteDlg(WPARAM wParam,LPARAM lParam ) { CMyDlg* p=(CMyDlg*)wParam; p->DestroyWindow( ); p=NULL; } |
在非模態對話框類中添加 PostNcDestroy 消息函數(在建立類向導添加),並在其中添加 delete this :
1 2 3 4 5 |
void CMyDlg::PostNcDestroy() { // TODO: Add your specialized code here and/or call the base class delete this; } |
在線程中調用:
1 2 3 4 5 6 7 8 |
UNIT WorkThread(LPVOID param) { CWnd* pParent=CMainDlg;//CMainDlg為主對話框類 CMyDlg* pDialog=new CMyDlg(); //傳遞變量的代碼可以添加於此 pParent->SendMessage(UM_CREATE_DLG,(WPARAM)pDialog);//發送建立非模態對話框消息 pParent->SendMessage(UM_DELETE_DLG,(WPARAM)pDialog);//發送銷毀非模態對話框消息 } |
建議使用 AfxBeginThread 來啟動線程。