VC新人,刚入门,想问问如何在文档类里面给视类发消息啊,网上那些办法试了下,好像没起作用呢,PostMessage执行了,不过视类收到了好像没反应啊
具体做法是在
Resource.h里面#define WM_MY_MESSAGE WM_USER+100
然后在View.h里面afx_msg LRESULT OnMyMessage(WPARAM wParam,LPARAM lParam);
View.app里面ON_MESSAGE(WM_MY_MESSAGE,OnMyMessage)
并且LPARAM CFieldWatchView::OnMyMessage(WPARAM wParam,LPARAM lParam)然后在文档类里面按照网上的文章里面执行的
CMDIFrameWnd *pFrame;
CMDIChildWnd *pChild;
CView *pView;
pFrame=(CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
pChild=(CMDIChildWnd*)pFrame->GetActiveFrame();
pView=pChild->GetActiveView();
pView->PostMessage(WM_MY_MESSAGE,0,0);
观察那个OnMyMessage并未执行啊,小弟实在搞不定了,求高手帮忙下啊

解决方案 »

  1.   

    LZ的整个程序不只一个视类吧,楼主能确认通过pView=pChild->GetActiveView()获取的pView就是LPARAM CFieldWatchView::OnMyMessage(WPARAM wParam,LPARAM lParam)的视类吗?
      

  2.   

    这一行CView *pView;改成CFieldWatchView *pView;
    后面也pView=(CFieldWatchView*)pChild->GetActiveView();
    这样试试,因为你是自定义消息。我记不准了。
    在OnMyMessage(WPARAM wParam,LPARAM lParam){...}里面下个断点看看是不是消息过去了。要是像2楼说的你是多个View那就麻烦了,你得遍历所有的View。有一个省事儿的办法是把消息发给CMainFrame,然后由主窗口广播,这样就无论在哪个View都收到消息了。
      

  3.   


    应该是没过去,我在那个On里面第一行就执行了一个messagebox,结果没弹出的
      

  4.   

    把发消息的那部分代码换成这样试试
    CView *pView;
    CFieldWatchView *pFiView;//CFieldWatchView是LZ收消息的视类名称
    POSITION pos = pDoc->GetFirstViewPosition();
    while(pos!=NULL)
    {
        pView = pDoc->GetNextView(pos);
        if(pView->IsKindOf((RUNTIME_CLASS(CFieldWatchView))) )
        {
          pFiView = (CFieldWatchView*)pView;
          break;
        }
    }
    pFiView->PostMessage(WM_MY_MESSAGE,0,0);
      

  5.   

    多文档还是单文档?单文档这样不行。你还可以这样发消息
    AfxGetMainWnd()->SendMessageToDescendants(WM_MY_MESSAGE);
    在哪儿都可以发消息,在任何子窗口都能收,比较适合自定义消息。不过你要是为了学习还是把PostMessage什么的搞搞清楚吧。