请教消息反射的简单问题——

jxk122481 2006-05-15 03:09:35
重载一个CButton类,处理反射消息如下:
.h文件——
protected:
//...
afx_msg BOOL OnClicked();
//...

.cpp文件——
BEGIN_MESSAGE_MAP(CMyButton, CButton)
//{{AFX_MSG_MAP(CMyButton)
ON_CONTROL_REFLECT_EX(BN_CLICKED, OnClicked)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

BOOL CMyButton::OnClicked()
{
//...
return FALSE;
}

在某个Dialog中,有成员变量CMyButton* m_btn,并申明成员函数
afx_msg void OnModeChange(),企图在m_btn的OnClick事件中调用,
该dialog实现文件中相关代码如下:
IMPLEMENT_DYNCREATE(CICAUnitTestView, CFormView)

BEGIN_MESSAGE_MAP(CICAUnitTestView, CFormView)
ON_BN_CLICKED(IDB_AUTO_MODE,OnModeChange)
END_MESSAGE_MAP()

void CICAUnitTestView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();

m_btn = new CMyButton;
m_Radio1->Create("自动模式",WS_VISIBLE|WS_CHILD,CRect(100,100,200,130),this,IDB_AUTO_MODE);;
}

void CICAUnitTestView::OnModeChange()
{
//...
}

结果点击m_btn之后,只执行了CMyButton中的OnClick事件,而并没有执行
CICAUnitTestView::OnModeChange()函数!

请问可能是什么原因?
...全文
196 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jxk122481 2006-05-15
  • 打赏
  • 举报
回复
自己粗心了!
m_btn->Create("自动模式",WS_VISIBLE|WS_CHILD,CRect(100,100,200,130),this,IDB_AUTO_MODE);
我把this换成一个GroupBox的句柄了!
怪不得不行————

呵呵 多谢三位捧场
jxk122481 2006-05-15
  • 打赏
  • 举报
回复
to mynamelj:
换了个ID也不管用。
“CMyButton在这个类中检查Create是否初重载,ID参数是否被传到父类”,不是太懂?
能否详细解释下。
to Kerrie:
用GetParent()->PostMessage(WM_COMMAND,(WPARAM)GetDlgCtrlID(),0);好象不行
to happyness44:
查过资料,确实应该先处理子控件的消息,但为什么父窗口中的就不处理了呢?
happyness44 2006-05-15
  • 打赏
  • 举报
回复
按钮相当于对话框的一个子窗口,一般情况下它是优先实现子窗口的消息应射
Kerrie 2006-05-15
  • 打赏
  • 举报
回复
可能跟消息处理链有关,对于command消息,消息传递流程为:
消息触发-〉自身窗口-〉父窗口-〉视图窗口(如果父窗口为frame的话)
而整个处理链中,如果已经有窗口作了相应,则消息不再向后转发。

从实际开发的角度来看,似乎把一个消息响应函数的处理写在两个窗口类中,不是一个很好的做法。当然,肯定也会存在部分特殊应用要求如此,此时自行转发一下消息即可。例如楼上的例子,在 BOOL CMyButton::OnClicked()增加添加一个转发处理:
GetParentO->PostMessage(WM_COMMAND, (WPARAM)GetDlgCtrlID()。。。 // 随手写的代码,仅供参考
mynamelj 2006-05-15
  • 打赏
  • 举报
回复
1.换个ID看看
2.CMyButton在这个类中检查Create是否初重载,ID参数是否被传到父类
jxk122481 2006-05-15
  • 打赏
  • 举报
回复
上面打错了,不是
m_Radio1->Create("自动模式",WS_VISIBLE|WS_CHILD,CRect(100,100,200,130),this,IDB_AUTO_MODE);
而是
m_btn->Create("自动模式",WS_VISIBLE|WS_CHILD,CRect(100,100,200,130),this,IDB_AUTO_MODE);

15,975

社区成员

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

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