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

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()函数!

请问可能是什么原因?
...全文
191 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);
内容概要:本文系统介绍了基于MATLAB平台的风力涡轮机雷达信号仿真研究,涵盖完整的仿真代码、实测数据及配套学术文章,重点实现雷达信号处理、风力涡轮机回波建模、微动特征提取与时频分析等核心技术。通过高精度模拟风机叶片旋转引起的调制效应与雷达散射截面变化,深入揭示风力发电场对周边雷达系统造成的电磁干扰机制,为雷达杂波抑制、目标检测优化及空域兼容性设计提供理论支撑与技术验证平台。资源内容还可拓展应用于无人机路径规划、电动汽车调度、电力系统优化等交叉领域,展现MATLAB在复杂系统仿真中的强大集成能力。; 适合人群:具备MATLAB编程基础与雷达信号处理知识的科研人员,适用于从事新能源并网影响评估、雷达系统设计、电磁兼容分析、智能电网或远程 sensing 领域研究的研究生、工程师及高校教师; 使用场景及目标:①开展风电场对空中监视雷达干扰效应的仿真评估;②研究风电杂波的时频特性与微多普勒特征建模方法;③开发针对非合作目标干扰的雷达抗干扰算法与信号分离技术;④作为科研项目申报、论文复现或工程预研的技术原型工具包; 阅读建议:建议结合百度网盘提供的完整资料包(含代码、数据集与参考文献)同步学习,优先运行示例脚本以掌握仿真流程,再根据具体研究需求调整系统参数进行扩展实验,同时可借鉴文中提到的其他MATLAB仿真案例以提升研究深度与广度。

15,976

社区成员

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

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