建立非模態對話框與在線程中建立非模態對話框


彈出非模態對話框很簡單,使用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 來啟動線程。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM