关于楼主提问的“对话框怎样修改右上角的叉的响应函数”就是WM_CLOSE消息的处理函数OnClose(),fanskydream已经回答的很详细了,在此不再赘述。
我要补充的是,对话框关闭有很多途径,仅仅处理WM_CLOSE消息还是不够的。
本人就曾犯过这种错误,在对话框类中new了几个变量,在OnClose中d出关闭确认的对话框并进行delete。当用户不点击这个“叉”关闭而直接用组合键“Alt+F4”关闭时,问题就来了:
首先是没有了关闭确认的对话框,再次就是没有delete那几个在堆上分配的变量造成内存泄漏。
因此,建议楼主重载对话框类的OnDestroy()函数。在这个函数里面进行是否关闭的确认,如果用户选择不关闭对话框,就直接返回该函数不调用父类的OnDestroy()即可。
而对话框对象内部动态生成的变量析构在放在PostNcDestroy()函数中进行。
添加消息:在类视图先选中要添加的类,然后在属性框的右上的消息按钮,选中消息后点击添加即可。
删除消息:在相关的类的类名上右击,选择属性,在右边d出的属性对话框的上面选择消息,找到相应的消息,在具体消息的右边的空格中单击,d出下拉列表,选择删除就行了
在
BEGIN_MESSAGE_MAP
和
END_MESSAGE_MAP
之间添加消息映射
大致如下:
BEGIN_MESSAGE_MAP
ON_BN_CLICKED(1000, OnCheck)
//1000是你的复选框的ID号,OnCheck是你点击后要执行的方法
END_MESSAGE_MAP
最后就是在相应的类中添加成员函数OnCheck去实现你要执行的 *** 作了
有什么不明白的就Hi
对话框是没有焦点权限的,所以拦截不到keydown消息(被过滤掉了,这些都是MFC包的执行约定)。SDI程序中view的扩展类都有输入子控件,有输入焦点,当然可以得到keydown进行处理。
过滤的这步是在窗口所在线程的pretranslatemessage函数里面做的(你可以重载这个函数,在里面拦截keydown消息,就能拦截到)。
添加PreTranslateMessage(MSG pMsg)虚函数。。。
在函数体中,添加如下代码:
if (pMsg->message==WM_KEYDOWN)
{
if (pMsg->wParam==81)
{
MessageBox("q");
}
}
return CDialog::PreTranslateMessage(pMsg);
在MFC中,可以通过以下步骤建立消息响应函数与控件对应的关系:
打开MFC应用程序的资源视图,双击对应的对话框资源文件(dlg文件)打开对话框编辑器。
在对话框编辑器中,选择要添加消息响应函数的控件。例如,选择一个按钮控件,然后右键单击该控件,在d出的上下文菜单中选择“添加事件处理程序”。
在d出的“添加事件处理程序”对话框中,选择要添加的消息类型。例如,选择“BN_CLICKED”表示添加“单击”消息的响应函数。
在“添加事件处理程序”对话框中,选择要添加响应函数的类。这里需要选择的是包含响应函数的类,通常是该对话框所在的类。
在“添加事件处理程序”对话框中,输入要添加的响应函数的名称。这个名称需要以“On”开头,后面跟上消息类型和控件的ID,例如“OnBnClickedButton1”。
点击“添加”按钮,将响应函数添加到代码中。然后,在响应函数中编写具体的处理逻辑。
完成上述步骤后,消息响应函数就与控件对应起来了。当用户 *** 作控件时,MFC会自动调用相应的消息响应函数来处理该消息。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)