两个对话框之间,如何响应自定义消息!

cengkis 2009-12-15 01:56:20

首先,我建立了一个MFC,工程,选择对话框。

(设系统自动创建的对话框为A对话框)

在里面插入一个对话框资源。(下面简称B对话框)
为其关联一个类:CMyDlg 。

然后在A对话框中,添加一个按钮,为其添加响应函数。
CMyDlg dlg;
dlg.DoModal();
创建一个模态对话框——B对话框。


这样,疑问就来了。我想在A中,发出一个消息,使B对话框中,有相应的改变。



我在CMyDlg中,自定义了消息。



#define WM_MY_MESSAGE (WM_USER+100)


LRESULT CMyDlg::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
// TODO: 处理用户自定义消息
MessageBox("success");
return 0;
}

afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);

ON_BN_CLICKED(IDC_BUTTON1, OnButton1)



这些自定义的操作,我都基本搞明白了,
类之间发送消息,我也实现了。
但是,跨类操作,就搞不清楚了。
请问下,怎么解决?
...全文
314 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
barber1 2011-05-20
  • 打赏
  • 举报
回复
顶楼上的 必须要用非模态的 模态的是会出现编译没错 而运行时候会出错的
zhouchuan111 2009-12-15
  • 打赏
  • 举报
回复
应该用非模态对话框才行,模态的会停在提示的地方
cengkis 2009-12-15
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 a746027209 的回复:]
照你的想法,只有把对话框设为非模态对话框才可以,不然要等到对话框销毁推出时消息才可以发送得出去,
要不你就在弹出对话框之前就把消息送出...下面非模态对话框的做法
[/Quote]


谢谢,按照你的写法,我也完成了“非模态对话框”下的实现。
但是关于“模态对话框”,这点,就没法了。
因为对话框都销毁了,还怎么对其操作?
cengkis 2009-12-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 starytx 的回复:]
我感觉你没有在B中写映射
ON_MESSAGE(WM_MY_MESSAGE ,OnMyMessage)


[/Quote]

嗯,最开始贴错了一行代码,我在第六楼,说明,并改正了。
starytx 2009-12-15
  • 打赏
  • 举报
回复
我感觉你没有在B中写映射
ON_MESSAGE(WM_MY_MESSAGE ,OnMyMessage)

a746027209 2009-12-15
  • 打赏
  • 举报
回复
照你的想法,只有把对话框设为非模态对话框才可以,不然要等到对话框销毁推出时消息才可以发送得出去,
要不你就在弹出对话框之前就把消息送出...下面非模态对话框的做法
//Main Dialog app...
void CHHDlg::OnOK()
{
// TODO: Add extra validation here
m_bDlg.Create(IDD_DIALOG1,this);
m_bDlg.ShowWindow(SW_SHOW);
//::SendMessage(m_bDlg.GetSafeHwnd(),UM_MYMESSAGE,0,0);
::PostMessage(m_bDlg.GetSafeHwnd(),UM_MYMESSAGE,0,0);
//CDialog::OnOK();
}

//CB dialog Header file
#define UM_MYMESSAGE WM_USER+100

class CB : public CDialog
{
// Construction
public:
CB(CWnd* pParent = NULL); // standard constructor

// Dialog Data
//{{AFX_DATA(CB)
enum { IDD = IDD_DIALOG1 };
// NOTE: the ClassWizard will add data members here
//}}AFX_DATA


// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CB)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL

// Implementation
protected:

// Generated message map functions
//{{AFX_MSG(CB)
// NOTE: the ClassWizard will add member functions here
//}}AFX_MSG
afx_msg void OnMyMessage();
DECLARE_MESSAGE_MAP()
};
//CB App file
CB::CB(CWnd* pParent /*=NULL*/)
: CDialog(CB::IDD, pParent)
{
//{{AFX_DATA_INIT(CB)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}


void CB::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CB)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CB, CDialog)
//{{AFX_MSG_MAP(CB)
// NOTE: the ClassWizard will add message map macros here
//}}AFX_MSG_MAP
ON_MESSAGE(UM_MYMESSAGE,OnMyMessage)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CB message handlers
void CB::OnMyMessage()
{
MessageBox("Success!");
}
mengde007 2009-12-15
  • 打赏
  • 举报
回复
让WM_MY_MESSAGE 对应一个消息;在OnButton1()
里面直接调用;
cengkis 2009-12-15
  • 打赏
  • 举报
回复
上面关于CMyDlg 的自定义消息,有行代码,我贴错了。现改正下。

#define WM_MY_MESSAGE (WM_USER+100)
LRESULT CMyDlg::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
// TODO: 处理用户自定义消息
MessageBox("success");
return 0;
}

afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);

ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)
cengkis 2009-12-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 tr0j4n 的回复:]
Google “MFC 自定义消息”
[/Quote]

我就是谷歌、百度一天了,都没有找到自己想要的(或者无法实现),才来提问的。
cengkis 2009-12-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bragi523 的回复:]
你要得到B的句柄
dlg.m_hwnd;
PostMessage(dlg.m_hwnd,0,0);
在CMyDlg的中加上ON_MESSAGE(WM_MY_MESSAGE,&CMyDlg::OnMyMessage);
[/Quote]

我还是没有实现~~

我把我的一些具体代码说下咯:
CTestDlg 这个类,是系统自建了。(A对话框)
我在A对话框里面,添加了一个按钮。显示出B对话框。
void CTestDlg::OnButton1() 
{
// TODO: Add your control notification handler code here
CMyDlg dlg;
// dlg.m_hWnd;
dlg.DoModal();
// PostMessage(dlg.m_hWnd,0,0);
}



为B对话框,关联一个类:CMyDlg
然后对其设置自定义消息的各种操作。
#define WM_MY_MESSAGE (WM_USER+100) 
LRESULT CMyDlg::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
// TODO: 处理用户自定义消息
MessageBox("success");
return 0;
}

afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);

ON_BN_CLICKED(IDC_BUTTON1, OnButton1)


如果我在B对话框中,添加一个函数。
void CMyDlg::OnButton1() 
{
// TODO: Add your control notification handler code here
PostMessage(WM_MY_MESSAGE,0,0);
}




那么当我点击A对话框中的按钮,弹出B对话框。
然后点击B对话框中的那个按钮,就会弹出一个消息框:“success”!

那么,我想在A对话框中,点击按钮,弹出B对话框,然后,发送自定义消息,使B对话框,弹出消息框。
这样,要怎么实现呢?

恳求各位给小弟解解惑。最好有具体代码~
MoXiaoRab 2009-12-15
  • 打赏
  • 举报
回复
Google “MFC 自定义消息”
bragi523 2009-12-15
  • 打赏
  • 举报
回复
你要得到B的句柄
dlg.m_hwnd;
PostMessage(dlg.m_hwnd,0,0);
在CMyDlg的中加上ON_MESSAGE(WM_MY_MESSAGE,&CMyDlg::OnMyMessage);
hufen2740 2009-12-15
  • 打赏
  • 举报
回复
PostMessage

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧