MFC对话框的按钮控件消息函数不起作用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC对话框的按钮控件消息函数不起作用相关的知识,希望对你有一定的参考价值。

这个对话框是建立主对话框的菜单按钮显示出的对话框

参考技术A

控件的ID号有冲突,在工程中搜索该控件的ID号,查看是否有重用的,屏蔽不需要的空间的ID即可。

参考技术B 能具体一点么,控件的ID号有没有冲突呢追问

控件ID 冲突就有问题吗?我的程序是建立在基于对话框下,在主对话框上加入“MENU”菜单后,点击这个对话框的菜单下的按钮出来一个对话框,在对话框里有个按钮,点击按钮不响应,对话框不消失

追答

你写了这个按钮的响应函数了么,可以在响应函数里面加入OnOK()语句试试

追问

一定写了呀 ,, 就是双击按钮出现
void CRegist::OnOk()

// TODO: Add your control notification handler code here

追答

哥们,你新建CRegist对话框没有使用CRegist类啊,你使用的是CDialog类,你添加的消息响应函数都在CRegist类里面,而你产生的对话框是CDialog类型,而不是CRegist类

修改方法
void CVideoCaptureServerDlg::OnRegister()

// TODO: Add your command handler code here
CRegist* dlg = new CRegist;
……

然后在 CVideoCaptureServerDlg.h头文件中加入 #include"register.h"

生成的 mfc 消息映射无效

【中文标题】生成的 mfc 消息映射无效【英文标题】:Invalid mfc message map being generated 【发布时间】:2013-03-05 09:26:57 【问题描述】:

我在 MFC 中有一个简单的测试应用程序,但它不起作用。消息处理程序根本不会被调用。窗口接收消息,但不调用在消息映射中注册的处理程序。

这是一个标准的 mfc 单对话框应用程序,具有大量按钮,并在推送它们时对库进行各种调用。但它不会调用处理程序。

我已经对其进行了跟踪,并且消息映射似乎已损坏。有如下标准声明:

BEGIN_MESSAGE_MAP(CommLib_test_x86Dlg, CDialog)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(IDCANCEL, &CommLib_test_x86Dlg::OnBnClickedCancel)
    ON_BN_CLICKED(IDOK, &CommLib_test_x86Dlg::OnBnClickedOk)
    ON_BN_CLICKED(IDC_BUTTON1, &CommLib_test_x86Dlg::OnBnClickedButton1)
    ON_BN_CLICKED(IDC_BUTTON2, &CommLib_test_x86Dlg::OnBnClickedButton2)
    ON_BN_CLICKED(IDC_BUTTON3, &CommLib_test_x86Dlg::OnBnClickedButton3)
    ON_BN_CLICKED(IDC_BUTTON4, &CommLib_test_x86Dlg::OnBnClickedButton4)
    ON_BN_CLICKED(IDC_BUTTON5, &CommLib_test_x86Dlg::OnBnClickedButton5)
    // many more buttons, but I commented the rest out for test
END_MESSAGE_MAP()

如果我在第一个ON_WM_*(即进入GetThisMessageMap静态方法)上放一个断点并查看消息映射的内容,第一个条目是正确的,但其余大部分是0 and 数组大小与实际定义不符。调试器将值报告为

[0] nMessage=274 nCode=0 nID=0 ...
[1] nMessage=0 nCode=0 nID=0 ...
[2] nMessage=0 nCode=19 nID=4206192 ...
[3] nMessage=55 nCode=0 nID=0 ...
[4] nMessage=0 nCode=0 nID=0 ...
[5] nMessage=0 nCode=0 nID=0 ...
[6] nMessage=0 nCode=0 nID=0 ...
[7] nMessage=0 nCode=0 nID=0 ...
[8] nMessage=0 nCode=0 nID=0 ...
[9] nMessage=0 nCode=0 nID=0 ...
[10] nMessage=0 nCode=0 nID=0 ...
[11] nMessage=0 nCode=0 nID=0 ...
[12] nMessage=0 nCode=0 nID=0 ...
[13] nMessage=0 nCode=0 nID=0 ...
[14] nMessage=0 nCode=0 nID=0 ...
[15] nMessage=0 nCode=0 nID=0 ...

代码编译良好,没有任何警告或任何东西。

请务必注意,该应用程序是大量项目的一部分,并且这些项目共享编译器选项。我们实际上生成了 Visual Studio 项目,但在我们使用 .vsprops 文件之前。我有一段时间没有使用该项目,可以想象编译器标志同时发生了变化。

【问题讨论】:

【参考方案1】:

好的,我找到了。编译器标志确实发生了变化。添加了可怕的/vmg 标志(我们在其他一些库中使用它,它在重构期间传播到不正确的项目)。此标志与 MFC 不兼容,因为它更改了消息映射项的定义。

长话短说:为了节省一些空间,Microsoft 决定根据类是使用单继承、多继承还是虚拟继承,对成员的指针表示不同。虽然理论上看起来不错,但实际上在以下情况下会出现问题:

声明了指向不完整类型成员的指针(这在 C++ 中是合法的)。

我怀疑它也会在以下情况下引起问题:

指向具有更复杂指针的类成员的指针需要转换为指向具有更简单指针的基类成员的指针。

文档没有提到这种情况,但很明显。顺便说一句,这正是 MFC 所做的。

规范 (ISO/IEC 14882-2011) 仅要求 static_cast 指向基成员的指针,如果基不是虚拟继承,但在 Microsoft 编译器中,即使基类只有线性继承,它也不起作用,但是子类具有多重继承,并且基类不是第一类。好吧,每个人都知道编译器已经不符合标准了。

【讨论】:

以上是关于MFC对话框的按钮控件消息函数不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 MFC 中,当 CEdit 控件达到最大字符时,退格不起作用

MFC 在控件上显示图片不起作用

为啥 UpdateData() 在 MFC CEdit 控件的 EN_CHANGE 处理程序中不起作用

键盘 Enter 键在 MFC 对话框中不起作用?

MFC:在静态控件上更改字体大小不起作用?

生成的 mfc 消息映射无效