如何定制对话框中的回车键,如何定制对话框中的回车键
【 tulaoshi.com - C语言心得技巧 】
如何定制对话框中的回车键
作者/赵湘宁
BEGIN_MESSAGE_MAP(CMyDlg, CDialog) ON_MESSAGE(DM_GETDEFID, OnGetDefID) ...END_MESSAGE_MAP()LRESULT CMyDlg::OnGetDefID(WPARAM wp, LPARAM lp) { return MAKELONG(0,DC_HASDEFID); }因为MFC没有对应DM_GETDEFID的宏,你必须使用通用的ON_MASSAGE宏。这样用户可以随意按回车键,但什么事都不会发生。上面的做法是解决了按回车键程序退出的问题。但是又产生了另外一个问题:如果想要回车键做些事情怎么办呢?有一些人曾经问过如何将回车键映射到TAB键,既按下回车键就象按下TAB键一样-也就是说输入焦点移动到下一个对话框控制。这需要做一些工作才行,但最简单的方式是使用加速键。许多程序员试图用OnChar,我会对他们说:No,no,no! OnChar是一个低级趣味的东西,你应该想方设法避免它,更糟的还有WM_KEYDOWN,WM_KEYUP之类的东西。谁能处理这些东西?OnChar可以用来限制允许输入编辑框的字符,如:数字,字母等。如果想要将一个键映射到一个命令,加速键才是最好的方法。
BEGIN_MESSAGE_MAP(CMyDlg, CDialog) ON_COMMAND(ID_MY_ENTER, OnMyEnter) ......END_MESSAGE_MAP() void CMyDlg::OnMyEnter() { NextInTabOrder(); }下图是本文例子的对话框和代码,代码中的NextInTabOrder是实际起作用的函数。它使用GetNextDlgTabItem来获得Tab顺序的下一个控制焦点。
while (GetMessage(...)) { TranslateMessage(...); DispatchMessage(...); }在这里细节不是重要的,重要的是消息并不到达程序的流程,你必须请求消息。这是一种人为的非抢先式多任务方法,这种方法通过每一个任务精诚协作来仿造多任务环境,随着增加的功能越来越多,有人想到了加速键表的主意,这个表用来映射按键和命令IDs。为了实现这个目的,他们发明了一个叫TranslateAccelerator的函数。现在这个消息泵变成了如下的样子:
while (GetMessage(...)) { if (TranslateAccelerator(hAccel...)) { // handled, continue looping } else { TranslateMessage(...); DispatchMessage(...); } }来源:http://www.tulaoshi.com/n/20160129/1483532.html
看过《如何定制对话框中的回车键》的人还看了以下文章 更多>>