文档类给视类发消息解决思路
文档类给视类发消息
VC新人,刚入门,想问问如何在文档类里面给视类发消息啊,网上那些办法试了下,好像没起作用呢,PostMessage执行了,不过视类收到了好像没反应啊
具体做法是在
Resource.h里面
然后在View.h里面
View.app里面
并且
观察那个OnMyMessage并未执行啊,小弟实在搞不定了,求高手帮忙下啊
------解决方案--------------------
UpdateAllViews();
------解决方案--------------------
LZ的整个程序不只一个视类吧,楼主能确认通过pView=pChild->GetActiveView()获取的pView就是LPARAM CFieldWatchView::OnMyMessage(WPARAM wParam,LPARAM lParam)的视类吗?
------解决方案--------------------
这一行CView *pView;改成CFieldWatchView *pView;
后面也pView=(CFieldWatchView*)pChild->GetActiveView();
这样试试,因为你是自定义消息。我记不准了。
在OnMyMessage(WPARAM wParam,LPARAM lParam){...}里面下个断点看看是不是消息过去了。
要是像2楼说的你是多个View那就麻烦了,你得遍历所有的View。有一个省事儿的办法是把消息发给CMainFrame,然后由主窗口广播,这样就无论在哪个View都收到消息了。
------解决方案--------------------
把发消息的那部分代码换成这样试试
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);
------解决方案--------------------
多文档还是单文档?单文档这样不行。
你还可以这样发消息
AfxGetMainWnd()->SendMessageToDescendants(WM_MY_MESSAGE);
在哪儿都可以发消息,在任何子窗口都能收,比较适合自定义消息。
不过你要是为了学习还是把PostMessage什么的搞搞清楚吧。
VC新人,刚入门,想问问如何在文档类里面给视类发消息啊,网上那些办法试了下,好像没起作用呢,PostMessage执行了,不过视类收到了好像没反应啊
具体做法是在
Resource.h里面
- C/C++ code
#define WM_MY_MESSAGE WM_USER+100
然后在View.h里面
- C/C++ code
afx_msg LRESULT OnMyMessage(WPARAM wParam,LPARAM lParam);
View.app里面
- C/C++ code
ON_MESSAGE(WM_MY_MESSAGE,OnMyMessage)
并且
- C/C++ code
LPARAM CFieldWatchView::OnMyMessage(WPARAM wParam,LPARAM lParam)
- C/C++ code
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并未执行啊,小弟实在搞不定了,求高手帮忙下啊
------解决方案--------------------
UpdateAllViews();
------解决方案--------------------
LZ的整个程序不只一个视类吧,楼主能确认通过pView=pChild->GetActiveView()获取的pView就是LPARAM CFieldWatchView::OnMyMessage(WPARAM wParam,LPARAM lParam)的视类吗?
------解决方案--------------------
这一行CView *pView;改成CFieldWatchView *pView;
后面也pView=(CFieldWatchView*)pChild->GetActiveView();
这样试试,因为你是自定义消息。我记不准了。
在OnMyMessage(WPARAM wParam,LPARAM lParam){...}里面下个断点看看是不是消息过去了。
要是像2楼说的你是多个View那就麻烦了,你得遍历所有的View。有一个省事儿的办法是把消息发给CMainFrame,然后由主窗口广播,这样就无论在哪个View都收到消息了。
------解决方案--------------------
把发消息的那部分代码换成这样试试
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);
------解决方案--------------------
多文档还是单文档?单文档这样不行。
你还可以这样发消息
AfxGetMainWnd()->SendMessageToDescendants(WM_MY_MESSAGE);
在哪儿都可以发消息,在任何子窗口都能收,比较适合自定义消息。
不过你要是为了学习还是把PostMessage什么的搞搞清楚吧。