新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论高级C/C++编程、代码重构(Refactoring)、极限编程(XP)、泛型编程等话题
    [返回] 计算机科学论坛计算机技术与应用『 C/C++编程思想 』 → 无模式对话框 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 4538 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 无模式对话框 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 C/C++编程思想 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客楼主
    发贴心情 无模式对话框

    创建无模式对话框


    无模式对话框与有模式对话框不同的是在创建后其他窗口都可以继续接收用户输入,因此无模式对话框有些类似一个弹出窗口。创建无模式对话框需要调用
    BOOL CDialog::Create( UINT nIDTemplate, CWnd* pParentWnd = NULL );之后还需要调用
    BOOL CDialog::ShowWindow( SW_SHOW);进行显示,否则无模式对话框将是不可见的。相关代码如下:

    void CYourView::OnOpenDlg(void)
    {
     /*假设IDD_TEST_DLG为已经定义的对话框资源的ID号*/
     CTestDlg *dlg=new CTestDlg;
     dlg->Create(IDD_TEST_DLG,NULL);
     dlg->ShowWindows(SW_SHOW);
     /*不要调用 delete dlg;*/
    }

    在上面的代码中我们新生成了一个对话框对象,而且在退出函数时并没有销毁该对象。因为如果此时销毁该对象(对象被销毁时窗口同时被销毁),而此时对话框还在显示就会出现错误。那么这就提出了一个问题:什么时候销毁该对象。我时常使用的方法有两个:
    在对话框退出时销毁自己:在对话框中重载OnOK与OnCancel在函数中调用父类的同名函数,然后调用DestroyWindow()强制销毁窗口,在对话框中映射WM_DESTROY消息,在消息处理函数中调用delete this;强行删除自身对象。相关代码如下:
    void CTestDlg1::OnOK()
    {
     CDialog::OnOK();
     DestroyWindow();
    }

    void CTestDlg1::OnCancel()
    {
     CDialog::OnCancel();
     DestroyWindow();
    }

    void CTestDlg1::OnDestroy()
    {
     CDialog::OnDestroy();
     AfxMessageBox("call delete this");
     delete this;
    }

    这种方法的要点是在窗口被销毁的时候,删除自身对象。所以你可以在任何时候调用DestroyWindow()以达到彻底销毁自身对象的作用。(DestroyWindow()的调用会引起OnDestroy()的调用)
    通过向父亲窗口发送消息,要求其他窗口对其进行销毁:首先需要定义一个消息用于进行通知,然后在对话框中映射WM_DESTROY消息,在消息处理函数中调用消息发送函数通知其他窗口。在接收消息的窗口中利用ON_MESSAGE映射处理消息的函数,并在消息处理函数中删除对话框对象。相关代码如下:
    /*更改对话框的有关文件*/
    CTestDlg2::CTestDlg2(CWnd* pParent /*=NULL*/)
     : CDialog(CTestDlg2::IDD, pParent)
    {/*m_pParent为一成员变量,用于保存通知窗口的指针,
    所以该指针不能是一个临时指针*/
     ASSERT(pParent);
     m_pParent=pParent;
     //{{AFX_DATA_INIT(CTestDlg2)
      // NOTE: the ClassWizard will add member initialization here
     //}}AFX_DATA_INIT
    }
    void CTestDlg2::OnOK()
    {
     CDialog::OnOK();
     DestroyWindow();
    }

    void CTestDlg2::OnCancel()
    {
     CDialog::OnCancel();
     DestroyWindow();
    }

    void CTestDlg2::OnDestroy()
    {
     CDialog::OnDestroy();
     /*向其他窗口发送消息,将自身指针作为一个参数发送*/
     m_pParent->PostMessage(WM_DELETE_DLG,(WPARAM)this);
    }

    /*在消息接收窗口中添加消息映射*/
    /*在头文件中添加函数定义*/
     afx_msg LONG OnDelDlgMsg(WPARAM wP,LPARAM lP);
    /*添加消息映射代码*/
     ON_MESSAGE(WM_DELETE_DLG,OnDelDlgMsg)
    END_MESSAGE_MAP()
    /*实现消息处理函数*/
    LONG CMy53_s1View::OnDelDlgMsg(WPARAM wP,LPARAM lP)
    {
     delete (CTestDlg2*)wP;
     return 0;
    }
    /*创建对话框*/
    void CMy53_s1View::OnTest2()
    {
     CTestDlg2 *dlg=new CTestDlg2(this);
     dlg->Create(IDD_TEST_DLG_2);
     dlg->ShowWindow(SW_SHOW);
    }

    在这种方法中我们利用消息来进行通知,在Window系统中利用消息进行通知和传递数据的用法是很多的。

    同样无模式对话框的另一个作用还可以用来在用户在对话框中的输入改变时可以及时的反映到其他窗口。下面的代码演示了在对话框中输入一段文字,然后将其更新到视图的显示区域中,这同样也是利用了消息进行通知和数据传递。

    /*在对话框中取出数据,并向其他窗口发送消息和数据,将数据指针作为一个参数发送*/
    void CTestDlg2::OnCommBtn()
    {
     char szOut[30];
     GetDlgItemText(IDC_OUT,szOut,30);
     m_pParent->SendMessage(WM_DLG_NOTIFY,(WPARAM)szOut);
    }

    /*在消息接收窗口中*/
    /*映射消息处理函数*/
     ON_MESSAGE(WM_DLG_NOTIFY,OnDlgNotifyMsg)

    /*在视图中绘制出字符串 m_szOut*/
    void CMy53_s1View::OnDraw(CDC* pDC)
    {
     CMy53_s1Doc* pDoc = GetDocument();
     ASSERT_VALID(pDoc);
     // TODO: add draw code for native data here
     pDC->TextOut(0,0,"Display String");
     pDC->TextOut(0,20,m_szOut);
    }
    /*处理通知消息,保存信息并更新显示*/
    LONG CMy53_s1View::OnDlgNotifyMsg(WPARAM wP,LPARAM lP)
    {
     m_szOut=(char*)wP;
     Invalidate();
     return 0;
    }


    此外这种用法利用消息传递数据的方法对有模式对话框和其他的窗口间通信也一样有效


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/2/6 17:25:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 C/C++编程思想 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/11/22 23:53:22

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    62.500ms