• 建立非模态对话框与在线程中建立非模态对话框


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

  • 相关阅读:
    ztCreateUserWizard输入密码和设置安全问题
    寻觅在office(确切的说是word) 的工具栏中添加控件的方法,找到了这个控件列表
    vs2005,combox 数据绑定和SelectedIndexChanged事件触发 引发的问题
    今天下载安装了Enterprise Library for .NET Framework 2.0 January 2006,准备试试dataAccess application block
    zt 3DO的历史,让人感慨啊
    iBM,tivoli,flash挺有意思的
    zt科学家发现自转最快中子星 比地球快1亿倍
    c#中读取应用程序路径的方法
    郁闷啊郁闷,为了access的like,折腾了一上午.
    人生
  • 原文地址:https://www.cnblogs.com/ahuo/p/2879406.html
Copyright © 2020-2023  润新知