是不是每个非模态对话框必须要一一对应一个对话框资源?因为要用同一个模块处理不同的数据。如果复制资源并分别建两个相同内容的类,只是资源名和类名不一样,这样太繁琐了。我想基于同一个资源两个非模态对话框去处理。如果我基于一个资源创建两个非模态对话框,如下:
CManagModifyDlg   *dlg1=new  CManagModifyDlg;   
dlg1->Create(IDD_DIALOG_MODIFY_MANAGE,this);
dlg1->ShowWindow(SW_SHOW); CManagModifyDlg   *dlg1=new  CManagModifyDlg;   
dlg1->Create(IDD_DIALOG_MODIFY_MANAGE,this);
dlg1->ShowWindow(SW_SHOW); 弹出两个非模态对话框,都使用资源IDD_DIALOG_MODIFY_MANAGE。这两个非模态对话框是相互独立的吗?
而IDD_DIALOG_MODIFY_MANAGE资源上的按钮该怎么分别针对两个非模态对话框进行处理。或者说,程序如何处理消息响应函数才能区别用户按的是dlg1上的按钮,还是dlg2上的按钮呢?
请明白人指点,感激不尽! 

解决方案 »

  1.   

    弹出两个非模态对话框,都使用资源IDD_DIALOG_MODIFY_MANAGE。这两个非模态对话框是相互独立的吗?
    =============
    是独立的,不过他们对事件的处理还不是一样的。IDD_DIALOG_MODIFY_MANAGE资源上的按钮该怎么分别针对两个非模态对话框进行处理。或者说,程序如何处理消息响应函数才能区别用户按的是dlg1上的按钮,还是dlg2上的按钮呢?
    =================
    这两个对话框的HWND应该是不一样的。我只能想到这一点了。
      

  2.   

    CManagModifyDlg *dlg1=new CManagModifyDlg;  
    有两个定义这样的 dlg1在同一个地方,难道不会报错吗?
    使用相同的资源是可以建立两个对话框,两个对话框的句柄是不一样的。
    如果你要区别两个按钮,最好是用一个变量,在Create之前先将值传过去。然后在按钮上根据值来做区别处理。
      

  3.   

    我刚才试了一下,如果通过FindWindow()去获取句柄,再发送WM_CLOSE消息关闭的话,只能关闭其中一个对话框。
    楼主你可以 遍历一遍z序上的窗口,找到第一个与你这个无模式对话框对应的句柄,通过句柄传递一个标志到这个对话框的控件,继续查找下一个窗口,找到下一个与你这个无模式对话框对应的句柄,再作一个标志传进该对话框,不知道行不行
      

  4.   

    我刚才试了一下,如果通过FindWindow()去获取句柄,再发送WM_CLOSE消息关闭的话,只能关闭其中一个对话框。
    楼主你可以 遍历一遍z序上的窗口,找到第一个与你这个无模式对话框对应的句柄,通过句柄传递一个标志到这个对话框的控件,继续查找下一个窗口,找到下一个与你这个无模式对话框对应的句柄,再作一个标志传进该对话框,不知道行不行
      

  5.   

    我刚才试了一下,如果通过FindWindow()去获取句柄,再发送WM_CLOSE消息关闭的话,只能关闭其中一个对话框。
    楼主你可以 遍历一遍z序上的窗口,找到第一个与你这个无模式对话框对应的句柄,通过句柄传递一个标志到这个对话框的控件,继续查找下一个窗口,找到下一个与你这个无模式对话框对应的句柄,再作一个标志传进该对话框,不知道行不行
      

  6.   

    句柄可以得到,但怎么应用呢?
    如果说我要在按键响应函数里区别用户按了哪个对话框的按键
    void CManagModifyDlg::OnBnClickedButton1()
    {
    // TODO: 在此添加控件通知处理程序代码
    MessageBox(L"你选择了左边对话框");//这里在dlg1和dlg2中显示都一样的,怎么区分呢?
    }
      

  7.   


    应该是
    应该是
    CManagModifyDlg *dlg1=new CManagModifyDlg;   
    dlg1->Create(IDD_DIALOG_MODIFY_MANAGE,this);
    dlg1->ShowWindow(SW_SHOW);  CManagModifyDlg *dlg2=new CManagModifyDlg;   
    dlg2->Create(IDD_DIALOG_MODIFY_MANAGE,this);
    dlg2->ShowWindow(SW_SHOW); 如果说我要在按键响应函数里区别用户按了哪个对话框的按键
    void CManagModifyDlg::OnBnClickedButton1()
    {
    // TODO: 在此添加控件通知处理程序代码
    MessageBox(L"你选择了左边对话框");//这里在dlg1和dlg2中显示都一样的
    }
    那么,需要设置个标志位,然后用switch来区别处理?
      

  8.   

    弹出两个非模态对话框,都使用资源IDD_DIALOG_MODIFY_MANAGE。这两个非模态对话框是相互独立的吗?
    ============
    是没有问题而IDD_DIALOG_MODIFY_MANAGE资源上的按钮该怎么分别针对两个非模态对话框进行处理。或者说,程序如何处理消息响应函数才能区别用户按的是dlg1上的按钮,还是dlg2上的按钮呢?
    ==============
    这两个对话框是独立处理消息的
    这个问题我觉得要看你的需求
    有可能你多虑了
    比如QQ
    所有的聊天窗口都可以用同一个对话框类
    但是我们使用的时候也不用特意去区分啊
    类似的东西我做过
    没有问题
    你可以试一试
      

  9.   


    有道理,你邮箱多少,我想把一个简单的TestModeless程序给你看看,谢谢啦!
      

  10.   


    有道理,你邮箱多少,我想把一个简单的TestModeless程序给你看看,谢谢啦!
      

  11.   

    你想让我看什么?
    [email protected]
      

  12.   

    这个函数这样写
    你看看效果
    void CModelessDlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    CString str;
    str.Format("这个对话框的句柄是 %d", GetSafeHwnd()); MessageBox(str);
    }
      

  13.   


    Thank you all the same!!