龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

VC程序中定制对话框中的回车键(3)

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
在加速键表中,可以使用任何ID。例如上面的代码使用的是对话框本身的ID,(m_lpszTemplateName既可以是一个串名,也可以是一个MAKEINTRESOURCE使用的整型ID)。

  在加速键表中,可以使用任何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()
};

精彩图集

赞助商链接