最近在做一个界面上的东西:需要在工具栏中点击按钮弹出一个对话框,这个对话框需要根据视图类里面的
变量进行更新对话框里面combox的内容,同时对话框需要将变化的内容发送给视图类,这就涉及到了对话框
和视图类之间的信息传递。
首先需要说明的一点是因为需要进行数据传递,所以不能使用模态的对话框,必须使用非模态的对话框,
也就是不能使用DoModel函数,我刚开始遇到的问题时视图类如何知道对话框已经点击了确定按钮。也就是
如何实现类似DoModel函数的功能。
在网上查了一下,发现涉及到了窗口之间消息的传递。
windows传递自定义的消息,需要利用ON_MESSAGE,需要自定义消息宏。
首先,定义对话框类CMyDlg,定义视图类CMyView。
定义自定义消息 #define WM_DIALOGOK (WM_USER+1)
class CMyDialog : public CDialog
{
public:
CMyDialog(CView* pParent); //重载的构造函数声明,原来的构造函数声明去掉
CView *pView; //定义一个存储主窗的指针
protected:
virtual void OnOK(); //重载OnOK函数声明,为了关闭对话框时间向主窗提供数据
};
//重载的构造函数声明,将原来的构造函数注释掉
CMyDialog ::CMyDialog (CView* pParent)
:CDialog(TecplotColorSet::IDD, pParent)
{
pView = pParent;
}
void CMyDialog ::OnBnClickedOk()
{
UpdateData(TRUE);
pView->SendMessage(WM_DIALOGOK);
CDialog::OnOK();
DestroyWindow();
}
在CMyView.h中定义接受消息的函数
afx_msg LRESULT OnDialogOk(WPARAM wparam,LPARAM lparam);
在CMyView.cpp中定义消息列表
BEGIN_MESSAGE_MAP(..., ...)
...
ON_MESSAGE(WM_DIALOGOK,OnDialogOk)
END_MESSAGE_MAP()
然后实现接受的消息函数
LRESULT CMyView::OnDialogOk(WPARAM wparam,LPARAM lparam)
{
AfxMessageBox(_T("Here"));
return 0;
}
这里面我开始犯的错误是:
初始化非模态对话框的时候一定要将视图类的指针传进来,也就是CView要初始化进来
这样在对话框上点击确定按钮就能触发消息,在视图类里面进行相应的操作
参考: