VC程序中定制对话框中的回车键(3)
在加速键表中,可以使用任何ID。例如上面的代码使用的是对话框本身的ID,(m_lpszTemplateName既可以是一个串名,也可以是一个MAKEINTRESOURCE使用的整型ID)。
// 本文例子中的加速键(In DlgKeys.rc )
IDD_MYDIALOG ACCELERATORS DISCARDABLE
BEGIN
VK_RETURN, ID_MY_ENTER, VIRTKEY, NOINVERT
END
一旦已经加载加速键,剩下的事情是重载PreTranslateMessage函数,进行消息映射了:
BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)
{
if (WM_KEYFIRST <= pMsg->message && pMsg->message <= WM_KEYLAST)
{
HACCEL hAccel = m_hAccel;
if (hAccel && ::TranslateAccelerator(m_hWnd, hAccel, pMsg))
return TRUE;
}
return CDialog::PreTranslateMessage(pMsg);
}
之所以要检查按键类的消息(从WM_ KEYFIRST 到 WM_KEYLAST)是为了提高速度。如果你知道不是一个按键消息,你就不用浪费时间去调用TranslateAccelerator()。再说TranslateAccelerator()是一个虚拟函数,不用增加一个消息映射入口。仅仅写这个函数就可以了。
二、编程步骤
1、 启动Visual C++6.0,生成一个Win32应用程序,将该程序命名为"DlgKeys";
2、 使用CLASSWIZARD为应用程序添加CdlgWithAccelerators和CmyDlg类;
3、 在程序的资源中添加添加加速键资源,内容如下:ID_MY_ENTER, VK_RETURNVIRTKEY,VIRTKEY;
4、添加代码,编译运行程序。
三、程序代码
/////////////////////////////////////////
#include "stdafx.h"
// Generic dialog-that-uses-accelerators.
class CDlgWithAccelerators : public CDialog {
public:
CDlgWithAccelerators(UINT nIDTemplate, CWnd* pParentWnd = NULL);
CDlgWithAccelerators(LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL);
~CDlgWithAccelerators();
protected:
HACCEL m_hAccel; // accelerator table
// MFC overrides
virtual BOOL OnInitDialog();
virtual BOOL PreTranslateMessage(MSG* pMsg);
DECLARE_MESSAGE_MAP()
};
- 上一篇:VC通过HTTP方式获取网页
- 下一篇:VC++实现Windows回收站的文件存取