MFC父控件与子控件消息传递问题

mudunke775 2011-05-10 04:00:00
(对话框程序)
我在主窗体内创建了一个BUTTON父控件A,然后又创建了一个BUTTON子控件B(B是使用CREATE创建的,父窗口指针是A)

现在的问题是:B的 ON_BN_CLICKED 消息映射不到主窗口,只能在控件A当中接受到这个消息,有什么办法可以传递这个消息给主窗体,使主窗体可以处理这个消息。

(这是对话框程序,方法最好有通用性,还有其他的类似消息)
...全文
593 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
mudunke775 2011-05-11
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 dnkuni 的回复:]

把你的父控件Panel做成个对话框,重载OnCmdMsg转发控制消息
C/C++ code

BOOL CDlgPanel::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
if (CDialog::OnCmdMsg(nID, nCode, pExtra, pHandler……
[/Quote]

嗯,不用对话框也行,我的panel是继承CStatic的,一样可以,结贴给分
Dnkuni 2011-05-11
  • 打赏
  • 举报
回复
把你的父控件Panel做成个对话框,重载OnCmdMsg转发控制消息

BOOL CDlgPanel::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
if (CDialog::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
return TRUE;

CWnd* pParent = GetParent();
if (pParent != NULL)
{
return pParent->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}

return FALSE;
}
mudunke775 2011-05-11
  • 打赏
  • 举报
回复
早上来顶起,看看今天有没有人帮我解决下
mudunke775 2011-05-10
  • 打赏
  • 举报
回复
TO VisualEleven

如何制作这个消息我还没试验,但是我的父控件想做成PANEL,也就是上面可以有任何控件,好像MFC的TABCTRL就可以转发任何子控件的消息,那个是怎么实现的?
Eleven 2011-05-10
  • 打赏
  • 举报
回复
PostMessage(GetParent(HWND_BUTTON), WM_COMMAND, MAKEWPARAM(nID, BN_CLICKED), (LPARAM)HWND_BUTTON);
mudunke775 2011-05-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 allenhiman 的回复:]

你的这种需求大概类似 消息路由的概念。 理论就是任何一个控件 收到任何消息都个它的父窗口发送。这样就形成了一个消息逐渐下发的体制。 比如你C上放B,B上放A。 A收到任何消息都给B,B也同样 那C自然就收到了来自A的消息( WPF就是这样的体制)
[/Quote]

我现在把ON_BN_CLICKED这种消息都变成自己实现发送PostMessage了,因为我不知道怎么转发这种消息
allenhiman 2011-05-10
  • 打赏
  • 举报
回复
你的这种需求大概类似 消息路由的概念。 理论就是任何一个控件 收到任何消息都个它的父窗口发送。这样就形成了一个消息逐渐下发的体制。 比如你C上放B,B上放A。 A收到任何消息都给B,B也同样 那C自然就收到了来自A的消息( WPF就是这样的体制)
allenhiman 2011-05-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 mudunke775 的回复:]
TO lghndyz:
实际上我的父控件是个类似C#里的panel,所以子控件会传递什么消息根本不能确定,难道所有的消息都写一遍?

TO fjun_1118:
ON_BN_CLICKED是自动的。还有有时是几层控件,你也不知道父几层才是主窗体


另,我现在的解决方法是在父控件添加PreTranslateMessage,截获每个消息然后转发父窗口,缺点是转发时会丢失一个参数,以PO……
[/Quote]

你说的少一个参数的想法是错的 wnd->PostMessage( a1, a2, a3)
a1 是消息ID a2是wParam, a3是Lparam
mudunke775 2011-05-10
  • 打赏
  • 举报
回复
TO sky101010ws
请问你ON_BN_CLICKED怎么指定父窗口?
龙行天下之Sky 2011-05-10
  • 打赏
  • 举报
回复
循环去除子ButtonB的父指针,指针父指针为空,则去为空前的指针,
作为子Button发送消息的Handle
mudunke775 2011-05-10
  • 打赏
  • 举报
回复
TO lghndyz:
实际上我的父控件是个类似C#里的panel,所以子控件会传递什么消息根本不能确定,难道所有的消息都写一遍?

TO fjun_1118:
ON_BN_CLICKED是自动的。还有有时是几层控件,你也不知道父几层才是主窗体


另,我现在的解决方法是在父控件添加PreTranslateMessage,截获每个消息然后转发父窗口,缺点是转发时会丢失一个参数,以POSTMESSAGE为例,一共有3个参数(事件ID,wParam,lParam),因为转发,所以事件ID自动就变成父控件了,所以就少了一个参数。

BOOL MyPanel::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class

CWnd *pcwnd = this->GetParent();
pcwnd->PostMessage(WM_MY_MESSAGE_PANEL_MESSAGE, pMsg->message, pMsg->lParam);

return MyImage::PreTranslateMessage(pMsg);
}

oldmanzhao 2011-05-10
  • 打赏
  • 举报
回复
可以实现A的类,派生一个A的类,然后重载PreTranslateMessage,在里面把消息发到A的父窗口
fjun_1118 2011-05-10
  • 打赏
  • 举报
回复
CButton * A=(CButton *)B->GetParent();
CmainDLG * C=(CmainDLG *)A->GetParent();

C->....

试试
lghndyz 2011-05-10
  • 打赏
  • 举报
回复
用消息钩子应该可以,获取“B的 ON_BN_CLICKED 消息”后取消“B的 ON_BN_CLICKED 消息”,然后往主窗体发送ON_BN_CLICKED 消息!!

15,980

社区成员

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

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