请问MFC中一个View如何发消息给MainFrame或另一个View?

mage1982 2010-10-18 05:42:12
请问MFC中一个View如何发消息给MainFrame或另一个View?

是这样的,我的程序是一个单文档应用程序,

除了默认生成的视图外还有两个视图,一个是TreeView,另一个是 ListView
它们在MainFrame中声明 通过Pane获得对象。
注意,我的View并不是FormView(就是能拖控件的那种)

现在我想通过点击树视图(TreeView)来改变ListView的内容,
请问

1, 如何截获 TreeView的点击操作?
注意我的控件是代码里生成的,不是拖上去的,所以在Wizard里面看不到控件的消息处理函数

2,点击树控件并获得响应后这个SendMessage怎么写?是直接把消息发送到MainFrame里么?
我尝试这样做,但是问题来了。我的TreeView和TreeControl树控件是代码里生成的,找不到ID啊 ????
再说SendMessage那么多,哪个 才合适我所说的情况啊???

诸位前辈们请指点一二,哪怕给个思路,谢谢了 !!!!
...全文
946 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
副组长 2010-10-21
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 mage1982 的回复:]
不知道为什么,我总觉得AfxGetMainWnd()是破坏了面向对象的原则。。。
MainFrame和view是在类结构重量个不同的分支,按理说应该在view实例化frame再调用函数啊。。。[/Quote]
一个类获得另一个类的指针太正常了,何况这里的MainFrame还是view类的父窗口。
事实上MFC程序在任何地方应用AfxGetMainWnd()不但合法,而且合理。
mage1982 2010-10-20
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 gordon3000 的回复:]
点击树控件并获得响应后,在响应函数里面
AfxGetMainWnd()->SendMessageToDescendants(UM_XXXX,wParam,lParam,1);
向所有的MainFrame的子窗口广播这个消息,谁有消息响应函数谁就能接到这个消息。UM_XXXX是一个自定义消息或者其它任何消息。

如果只向主窗口发消息
AfxGetMainWnd()->SendMessage……
[/Quote]

不知道为什么,我总觉得AfxGetMainWnd()是破坏了面向对象的原则。。。
MainFrame和view是在类结构重量个不同的分支,按理说应该在view实例化frame再调用函数啊。。。
lazy_2010 2010-10-19
  • 打赏
  • 举报
回复
NM_CLICK 一般用于 WM_NOTIFY 消息的参数,不能作为消息的;

建议你使用自定义消息 WM_USER+120 等,或者 RegisterWindowMessage 吧;

我很少用 ON_MESSAGE_VOID,都是使用 ON_MESSAGE,然后将消息处理定义成
LRESULT Onxxx(WPARAM, LPARAM);
mage1982 2010-10-19
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 lazy_2010 的回复:]
object - oriented ...
[/Quote]

麻烦稍微解释一下谢谢了!!!
C++的书我读过不少,但是实际经验不多!
麻烦您就这个例子,用VIEW,Frame,的关系稍微讲一下其中是怎样面向对象的!
真的有时候看书越看越晕,正好就这个机会,给我讲一下吧!谢谢了 !!!
lazy_2010 2010-10-19
  • 打赏
  • 举报
回复
object - oriented ...
mage1982 2010-10-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 lazy_2010 的回复:]
自定义消息,如果是 WM_USER+xxx ,使用 ON_MESSAGE 没有问题;

如果是 RegisterWindowMessage,使用 ON_REGISTERED_MESSAGE
[/Quote]

刚才我又尝试了一下,我在TreeView里面点击,使用WM_CLICK事件,可以在TreeView的Cpp中响应。我一直希望点击TreeView中的文件树(动态生成的),使得程序通过消息直接跳转到MainFrame中的函数,是不是这样不可以呢?

一定要先把消息定位到TreeView中的响应函数中,然后从这个响应函数来一个CMainFrame*)AfxGetMainWnd();然后再操作主框架中的变量????
副组长 2010-10-19
  • 打赏
  • 举报
回复
点击树控件并获得响应后,在响应函数里面
AfxGetMainWnd()->SendMessageToDescendants(UM_XXXX,wParam,lParam,1);
向所有的MainFrame的子窗口广播这个消息,谁有消息响应函数谁就能接到这个消息。UM_XXXX是一个自定义消息或者其它任何消息。

如果只向主窗口发消息
AfxGetMainWnd()->SendMessage(UM_XXXX,wParam,lParam);
lazy_2010 2010-10-19
  • 打赏
  • 举报
回复
自定义消息,如果是 WM_USER+xxx ,使用 ON_MESSAGE 没有问题;

如果是 RegisterWindowMessage,使用 ON_REGISTERED_MESSAGE
mage1982 2010-10-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 lazy_2010 的回复:]
NM_CLICK 一般用于 WM_NOTIFY 消息的参数,不能作为消息的;

建议你使用自定义消息 WM_USER+120 等,或者 RegisterWindowMessage 吧;

我很少用 ON_MESSAGE_VOID,都是使用 ON_MESSAGE,然后将消息处理定义成
LRESULT Onxxx(WPARAM, LPARAM);
[/Quote]

谢谢老兄回帖!!
我读了一下书,好像说是 ON_MESSAGE一般都是响应工具栏,菜单或控件的消息啊?自定义的消息也可以么 ?
mage1982 2010-10-18
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lazy_2010 的回复:]
对于 CMainFrame,使用 (CMainFrame*)AfxGetMainWnd() 获取指针,然后发送消息;

对于其它 View,使用 GetDocument()->UpdateAllViews(this);
[/Quote]

按你所说的,
我在TreeView里面的函数里写了

CMainFrame *MF = (CMainFrame*)AfxGetMainWnd();
MF->SendMessage(NM_CLICK);

然后在CMainFrame.h里面写
afx_msg void OnMyFunction();

然后在CMainFrame.cpp里面写
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
。。。。。。。。
ON_MESSAGE_VOID(NM_CLICK, OnMyFunction)
END_MESSAGE_MAP()

后面写函数内容
void OnMyFunction(){
.....
}

这样写正确么?反正我运行有问题。麻烦指教一下谢谢了!!!
lazy_2010 2010-10-18
  • 打赏
  • 举报
回复
对于 CMainFrame,使用 (CMainFrame*)AfxGetMainWnd() 获取指针,然后发送消息;

对于其它 View,使用 GetDocument()->UpdateAllViews(this);
mage1982 2010-10-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hztj2005 的回复:]
我不熟悉SendMessage,我是这样直接处理的:

点击树控件并,获得响应,我就给树控件写一个响应函数,比如让 ListView 显示数据

象这个帖子:
http://topic.csdn.net/u/20100915/15/005cfb1b-cd50-4341-876a-80d10fc33619.html

CMainFrame *pMain=(CMainFrame*) A……
[/Quote]


问题就是由于不能使用classWizzard去创建消息,我必须要手写Message。这个消息到底怎么写呢?
我的问题主要是希望知道
1,怎么响应点击事件
2,由于点击树控件而获得的消息如何传导到主框架或ListView
看不见的裂痕 2010-10-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hztj2005 的回复:]
我不熟悉SendMessage,我是这样直接处理的:

点击树控件并,获得响应,我就给树控件写一个响应函数,比如让 ListView 显示数据

象这个帖子:
http://topic.csdn.net/u/20100915/15/005cfb1b-cd50-4341-876a-80d10fc33619.html

CMainFrame *pMain=(CMainFrame*) A……
[/Quote]

这个方法不错,但是要记住很有可能GetActiveView();为空值的。碰到好多次都来问偶这个问题。
Liberty-Bird 2010-10-18
  • 打赏
  • 举报
回复
2,点击树控件并获得响应后这个SendMessage怎么写?是直接把消息发送到MainFrame里么?
我尝试这样做,但是问题来了。我的TreeView和TreeControl树控件是代码里生成的,找不到ID啊 ????
再说SendMessage那么多,哪个 才合适我所说的情况啊???


不可能没ID啊, 动态创建Create时里面有个参数就是ID
hztj2005 2010-10-18
  • 打赏
  • 举报
回复
我不熟悉SendMessage,我是这样直接处理的:

点击树控件并,获得响应,我就给树控件写一个响应函数,比如让 ListView 显示数据

象这个帖子:
http://topic.csdn.net/u/20100915/15/005cfb1b-cd50-4341-876a-80d10fc33619.html

CMainFrame *pMain=(CMainFrame*) AfxGetApp()->m_pMainWnd;
CChiGramView *pView=( CChiGramView * ) pMain-> GetActiveView();
((CEdit *)(pView->GetDlgItem(IDC_text_part)))->SetWindowText(str);;//

ouyh12345 2010-10-18
  • 打赏
  • 举报
回复
可以考虑把这些类的句柄都放到app类里,然后用这个句柄发消息
Eleven 2010-10-18
  • 打赏
  • 举报
回复
1. 一样的啊,NM_CLICK消息

2. 通过主框架类中转。你Create动态创建,Create函数中不是有个参数是ID吗?

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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