弹出非模态对话框很简单,使用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 来启动线程。