zoukankan      html  css  js  c++  java
  • 建立非模态对话框与在线程中建立非模态对话框

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

  • 相关阅读:
    父组件向子组件传递数据(vue.js)
    vue引入JQ的方法
    webstorm添加*.vue文件代码提醒支持webstorm支持es6vue里支持es6写法
    创建脚手架步骤
    JS严格校验身份证号
    微信小程序开发工具 常用快捷键
    GIT 常用命令
    git 操作
    通过selenium(也有Puppeter版在最后)登录网页获取特定信息
    用Django ORM实现树状结构
  • 原文地址:https://www.cnblogs.com/ahuo/p/2879406.html
Copyright © 2011-2022 走看看