Figure 2 DLGKEYS

DlgAccel.h
#include "stdafx.h"

//////////////////
// 使用加速键的对话框.
//
class CDlgWithAccelerators : public CDialog {
public:
   CDlgWithAccelerators(UINT nIDTemplate, CWnd* pParentWnd = NULL);
   CDlgWithAccelerators(LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL);
   ~CDlgWithAccelerators();

protected:
   HACCEL m_hAccel; // 加速键表

   // 类库重载
   virtual BOOL OnInitDialog();
   virtual BOOL PreTranslateMessage(MSG* pMsg);
   DECLARE_MESSAGE_MAP()
};

DlgAccel.cpp
////////////////////////////////////////////////////////////////
// VCKBASE -- July 2000
//
// Visual C++ 6.0环境中编译, 在 Windows 98 和 Windows NT 上运行.
// 
// CDlgWithAccelerators 是一个可重用的类,这个类的功能是向对话框
// 添加加速键
//
#include "stdafx.h"
#include "dlgaccel.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

BEGIN_MESSAGE_MAP(CDlgWithAccelerators,CDialog)
END_MESSAGE_MAP()

////////////////
// 构造函数和析构函数
//
CDlgWithAccelerators::CDlgWithAccelerators(LPCTSTR lpszTemplateName,
   CWnd* pParentWnd) : CDialog(lpszTemplateName, pParentWnd)
{
}

CDlgWithAccelerators::CDlgWithAccelerators(UINT nIDTemplate,
   CWnd* pParentWnd) : CDialog(nIDTemplate, pParentWnd)
{
}

CDlgWithAccelerators::~CDlgWithAccelerators()
{
}

//////////////////
// 预解释消息: 使用加速键表解释击键. 
//
BOOL CDlgWithAccelerators::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);
}

//////////////////
// 初始化对话框: 加载加速键
//
BOOL CDlgWithAccelerators::OnInitDialog()
{
   BOOL bRet = CDialog::OnInitDialog();

   // 加载对话框的加速键
   m_hAccel = ::LoadAccelerators(AfxGetResourceHandle(),
      m_lpszTemplateName); // 使用的资源名与对话框相同

   return bRet;
}

DlgKeys.cpp
////////////////////////////////////////////////////////////////
// VCKBASE -- July 2000
//
// Visual C++ 6.0环境中编译, 在 Windows 98 和 Windows NT 上运行.
// DlgKeys 此代码告诉你如何忽略对话框中的 Enter 键, 或者使用加速键
// 将 Enter 键映射到不同的命令.
//
#include "stdafx.h"
#include "resource.h"
#include "StatLink.h"
#include "dlgaccel.h"
#include "TraceWin.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

//////////////////
// 
// 简化的 MFC 应用程序类 
class CMyApp : public CWinApp {
public:
   CMyApp();
   ~CMyApp();
   virtual BOOL InitInstance();
   DECLARE_MESSAGE_MAP()
};

CMyApp theApp; // 创建唯一的应用程序对象

//////////////////
//
// 简化的框架窗口
class CMainFrame : public CFrameWnd {
protected:
   virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
public:
   CMainFrame();
   ~CMainFrame();
};

//////////////////
// 典型的对话框
//
class CMyDlg : public CDlgWithAccelerators {
public:
   CMyDlg(CWnd* pParent = NULL); // 标准构造函数
protected:
   HICON m_hIcon;
   CStaticLink m_wndLink1;
   CStaticLink m_wndLink2;

   // 辅助函数
   void NextInTabOrder();

   // 类库重载
   virtual BOOL OnInitDialog();
   afx_msg void OnMyEnter();
   afx_msg LRESULT OnGetDefID(WPARAM wp, LPARAM lp);
   DECLARE_MESSAGE_MAP()
};

BEGIN_MESSAGE_MAP(CMyApp, CWinApp)
END_MESSAGE_MAP()

CMyApp::CMyApp()
{
   // nothing to do
}

CMyApp::~CMyApp()
{
   // nothing to do
}

//////////////////
// 实例化: 创建对话框为 child
//
BOOL CMyApp::InitInstance()
{
   // 创建框架并加载它
   CMainFrame* pFrame = new CMainFrame;
   m_pMainWnd = pFrame;
   pFrame->LoadFrame(IDR_MAINFRAME, WS_OVERLAPPED, NULL, NULL);

   // 创建对话框并打开它
   CMyDlg dlg(pFrame);
   int nResponse = dlg.DoModal();
   if (nResponse == IDOK) {
   } else if (nResponse == IDCANCEL) {
   }

   return FALSE; // 退出
}

CMainFrame::CMainFrame()
{
   // nothing to do
}

CMainFrame::~CMainFrame()
{
   // nothing to do
}

//////////////////
// 创建窗口前: 设置 WS_EX_TOOLWINDOW 风格在任务条上隐藏对话框
//
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
   if (CFrameWnd::PreCreateWindow(cs)) {
      cs.dwExStyle |= WS_EX_TOOLWINDOW;
      return TRUE;
   }
   return FALSE;
}

BEGIN_MESSAGE_MAP(CMyDlg, CDlgWithAccelerators)
   ON_COMMAND(ID_MY_ENTER, OnMyEnter)
//
// 下列代码不是必须的,因为我使用加速键将 ENTER 键映射到 ID_MY_ENTER.
// 但如果你想要忽略到 ENTER 键. 就像下面这样处理 DM_GETDEFID
// 消息.
//
// ON_MESSAGE(DM_GETDEFID, OnGetDefID) // 不使用
END_MESSAGE_MAP()

CMyDlg::CMyDlg(CWnd* pParent) : CDlgWithAccelerators(IDD_MYDIALOG, pParent)
{
   // nothing to do
}

//////////////////
// 初始化对话框: 
//
BOOL CMyDlg::OnInitDialog()
{
   CDlgWithAccelerators::OnInitDialog();

   m_wndLink1.m_link = _T("http://www.vckbase.com");
   m_wndLink2.m_link = _T("mailto:vckbase@public.hk.hi.cn");
   m_wndLink1.SubclassDlgItem(IDC_VCKBASE, this);
   m_wndLink2.SubclassDlgItem(IDC_MAIL, this);

   // 设置对话框的 icon .  当应用程序主窗口不是一个对话框时,
   // 框架自动完成这项工作.
   // 
   m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
   ASSERT(m_hIcon);
   SetIcon(m_hIcon, TRUE);       // 设置大图标
   SetIcon(m_hIcon, FALSE);      // 设置小图标
   
   // 加载对话框的加速键
   m_hAccel = ::LoadAccelerators(AfxGetResourceHandle(),
      m_lpszTemplateName); // 使用的资源名与对话框相同
   ASSERT(m_hAccel);

   return TRUE;  // 返回 TRUE  除非你设置了输入焦点
}

//////////////////
// 处理 ID_MY_ENTER--即 Enter 键.
//
void CMyDlg::OnMyEnter()
{
   TRACE(_T("CMyDlg::OnMyEnter\n"));
   NextInTabOrder(); // 移动到下一个控制
}

//////////////////
// 辅助函数移动输入焦点到下一个控制.
// GetNextDlgTabItem 查找控制.
//
void CMyDlg::NextInTabOrder()
{
   CWnd* pWndNext = GetNextDlgTabItem(GetFocus());
   if (pWndNext) {
      pWndNext->SetFocus();
   }
}

//////////////////
// 这个函数不使用, 因为其消息映射入口是被注释掉的.
// 如果你想要忽略 Enter 键(不将它映射到一个命令),
// 在这里返回0就可以了.注意你在高位字节中必须返回
// 专门代码 DC_HASDEFID!!
//
//
LRESULT CMyDlg::OnGetDefID(WPARAM wp, LPARAM lp)
{
   TRACE(_T("CMyDlg::OnGetDefID\n"));
   return MAKELONG(0,DC_HASDEFID);
}