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);
}