我设计一个非模式对话框,使用视图——文档结构。我在视图CMyView里设一成员变量CMyDialog *pDlg 并让它在没有对话框时为NULL。在显示对话框时,动态分配一个对话框。如果pDlg不为NULL,则直接把焦点给这个对话框。
     if(m_pDlg != NULL)
m_pDlg->SetFocus();
else
{
m_pDlg = new CMyDialog;
m_pDlg->Create(IDD_OPERATE);
m_pDlg->ShowWindow(SW_SHOW);
}
取消对话框时,我让对话框自己删除自己的资源,并送一个自定义消息WM_USER_DIALOG_DESTROY给CMyFrameWnd类,然后让 CMyFrameWnd类中这个消息的处理函数把这个消息发给CMyView类,再由CMyView类的OnDialogDestroy给m_pDlg赋成NULL。
LRESULT CMyFrameWnd::OnDialogDestroy(WPARAM wParam, LPARAM lParam)
{
GetActiveView()->SendMessage(wParam, lParam);
return 0;}可问题是这个消息传到CMyFrameWnd类后,CMyView无法接受到转发的消息。m_pDlg无法变回NULL。但同时,对话框上有几个另外的按键,他们的功能也是像上面那样实现的(CMyDialog->CMyFrameWnd->CMyView)且都很正常。请问为什么?如要完整的源代码,请写下你的邮箱地址。

解决方案 »

  1.   

    LRESULT CMyFrameWnd::OnDialogDestroy(WPARAM wParam, LPARAM lParam)
    {
    GetActiveView()->SendMessage(wParam, lParam);
             //这里怎么没有要发送的消息名? 没写应该编译不过去啊 return 0;}
      

  2.   

    你看一下CView的classmembers 其中的SendMessage();是从CWnd那儿继承下来的
    需要三个参数 消息ID;wParam;lParam;上贴我说编译不过去其实能过去 忘了它后两个参数默认为0了 你这样写 等于没传消息ID 只传了消息的wparam和lparam .wParam被当作消息ID 而lParam被当作wParam了
    不知道你要向view发送什么消息 如果还是那个自定义的消息 改成
    (CMyView*) GetActiveView->SendMessasge(WM_USER_DIALOG_DESTROY,wParam,lParam);