CDialog程序响应键盘消息
KeyMsgDlg.cpp
1
// KeyMsgDlg.cpp : 实现文件
2
//
3![]()
4
#include "stdafx.h"
5
#include "KeyMsg.h"
6
#include "KeyMsgDlg.h"
7![]()
8
#ifdef _DEBUG
9
#define new DEBUG_NEW
10
#endif
11![]()
12![]()
13
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
14![]()
15
class CAboutDlg : public CDialog
16
{
17
public:
18
CAboutDlg();
19![]()
20
// 对话框数据
21
enum { IDD = IDD_ABOUTBOX };
22![]()
23
protected:
24
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
25![]()
26
// 实现
27
protected:
28
DECLARE_MESSAGE_MAP()
29
};
30![]()
31
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
32
{
33
}
34![]()
35
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
36
{
37
CDialog::DoDataExchange(pDX);
38
}
39![]()
40
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
41
END_MESSAGE_MAP()
42![]()
43![]()
44
// CKeyMsgDlg 对话框
45![]()
46![]()
47![]()
48![]()
49
CKeyMsgDlg::CKeyMsgDlg(CWnd* pParent /*=NULL*/)
50
: CDialog(CKeyMsgDlg::IDD, pParent)
51
{
52
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
53
}
54![]()
55
void CKeyMsgDlg::DoDataExchange(CDataExchange* pDX)
56
{
57
CDialog::DoDataExchange(pDX);
58
}
59![]()
60
BEGIN_MESSAGE_MAP(CKeyMsgDlg, CDialog)
61
ON_WM_SYSCOMMAND()
62
ON_WM_PAINT()
63
ON_WM_QUERYDRAGICON()
64
//}}AFX_MSG_MAP
65
END_MESSAGE_MAP()
66![]()
67![]()
68
// CKeyMsgDlg 消息处理程序
69![]()
70
BOOL CKeyMsgDlg::OnInitDialog()
71
{
72
CDialog::OnInitDialog();
73![]()
74
// 将“关于
”菜单项添加到系统菜单中。
75![]()
76
// IDM_ABOUTBOX 必须在系统命令范围内。
77
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
78
ASSERT(IDM_ABOUTBOX < 0xF000);
79![]()
80
CMenu* pSysMenu = GetSystemMenu(FALSE);
81
if (pSysMenu != NULL)
82
{
83
CString strAboutMenu;
84
strAboutMenu.LoadString(IDS_ABOUTBOX);
85
if (!strAboutMenu.IsEmpty())
86
{
87
pSysMenu->AppendMenu(MF_SEPARATOR);
88
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
89
}
90
}
91![]()
92
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
93
// 执行此操作
94
SetIcon(m_hIcon, TRUE); // 设置大图标
95
SetIcon(m_hIcon, FALSE); // 设置小图标
96![]()
97
// TODO: 在此添加额外的初始化代码
98![]()
99
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
100
}
101![]()
102
void CKeyMsgDlg::OnSysCommand(UINT nID, LPARAM lParam)
103
{
104
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
105
{
106
CAboutDlg dlgAbout;
107
dlgAbout.DoModal();
108
}
109
else
110
{
111
CDialog::OnSysCommand(nID, lParam);
112
}
113
}
114![]()
115
// 如果向对话框添加最小化按钮,则需要下面的代码
116
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
117
// 这将由框架自动完成。
118![]()
119
void CKeyMsgDlg::OnPaint()
120
{
121
if (IsIconic())
122
{
123
CPaintDC dc(this); // 用于绘制的设备上下文
124![]()
125
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
126![]()
127
// 使图标在工作矩形中居中
128
int cxIcon = GetSystemMetrics(SM_CXICON);
129
int cyIcon = GetSystemMetrics(SM_CYICON);
130
CRect rect;
131
GetClientRect(&rect);
132
int x = (rect.Width() - cxIcon + 1) / 2;
133
int y = (rect.Height() - cyIcon + 1) / 2;
134![]()
135
// 绘制图标
136
dc.DrawIcon(x, y, m_hIcon);
137
}
138
else
139
{
140
CDialog::OnPaint();
141
}
142
}
143![]()
144
//当用户拖动最小化窗口时系统调用此函数取得光标显示。
145
//
146
HCURSOR CKeyMsgDlg::OnQueryDragIcon()
147
{
148
return static_cast<HCURSOR>(m_hIcon);
149
}
150
BOOL CKeyMsgDlg::PreTranslateMessage(MSG *pMsg)
151
{
152
if(pMsg->message==WM_KEYDOWN)
153
{
154
switch(pMsg->wParam)
155
{
156
case VK_DOWN:
157
::AfxMessageBox(_T("VK_SHIFT"));//CTRL 按键按下
158
return TRUE;
159
case 'M':
160
if(::GetKeyState(VK_SHIFT)<0)
161
{
162
::AfxMessageBox(_T("VK_SHIFT+M"));//SHIFT+M 按键被按下
163
}
164
return TRUE;
165
}
166
}
167
return CDialog::PreTranslateMessage(pMsg);
168
}
169![]()
170![]()
// KeyMsgDlg.cpp : 实现文件2
//3

4
#include "stdafx.h"5
#include "KeyMsg.h"6
#include "KeyMsgDlg.h"7

8
#ifdef _DEBUG9
#define new DEBUG_NEW10
#endif11

12

13
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框14

15
class CAboutDlg : public CDialog16
{17
public:18
CAboutDlg();19

20
// 对话框数据21
enum { IDD = IDD_ABOUTBOX };22

23
protected:24
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持25

26
// 实现27
protected:28
DECLARE_MESSAGE_MAP()29
};30

31
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)32
{33
}34

35
void CAboutDlg::DoDataExchange(CDataExchange* pDX)36
{37
CDialog::DoDataExchange(pDX);38
}39

40
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)41
END_MESSAGE_MAP()42

43

44
// CKeyMsgDlg 对话框45

46

47

48

49
CKeyMsgDlg::CKeyMsgDlg(CWnd* pParent /*=NULL*/)50
: CDialog(CKeyMsgDlg::IDD, pParent)51
{52
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);53
}54

55
void CKeyMsgDlg::DoDataExchange(CDataExchange* pDX)56
{57
CDialog::DoDataExchange(pDX);58
}59

60
BEGIN_MESSAGE_MAP(CKeyMsgDlg, CDialog)61
ON_WM_SYSCOMMAND()62
ON_WM_PAINT()63
ON_WM_QUERYDRAGICON()64
//}}AFX_MSG_MAP65
END_MESSAGE_MAP()66

67

68
// CKeyMsgDlg 消息处理程序69

70
BOOL CKeyMsgDlg::OnInitDialog()71
{72
CDialog::OnInitDialog();73

74
// 将“关于
”菜单项添加到系统菜单中。75

76
// IDM_ABOUTBOX 必须在系统命令范围内。77
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);78
ASSERT(IDM_ABOUTBOX < 0xF000);79

80
CMenu* pSysMenu = GetSystemMenu(FALSE);81
if (pSysMenu != NULL)82
{83
CString strAboutMenu;84
strAboutMenu.LoadString(IDS_ABOUTBOX);85
if (!strAboutMenu.IsEmpty())86
{87
pSysMenu->AppendMenu(MF_SEPARATOR);88
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);89
}90
}91

92
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动93
// 执行此操作94
SetIcon(m_hIcon, TRUE); // 设置大图标95
SetIcon(m_hIcon, FALSE); // 设置小图标96

97
// TODO: 在此添加额外的初始化代码98

99
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE100
}101

102
void CKeyMsgDlg::OnSysCommand(UINT nID, LPARAM lParam)103
{104
if ((nID & 0xFFF0) == IDM_ABOUTBOX)105
{106
CAboutDlg dlgAbout;107
dlgAbout.DoModal();108
}109
else110
{111
CDialog::OnSysCommand(nID, lParam);112
}113
}114

115
// 如果向对话框添加最小化按钮,则需要下面的代码116
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,117
// 这将由框架自动完成。118

119
void CKeyMsgDlg::OnPaint()120
{121
if (IsIconic())122
{123
CPaintDC dc(this); // 用于绘制的设备上下文124

125
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);126

127
// 使图标在工作矩形中居中128
int cxIcon = GetSystemMetrics(SM_CXICON);129
int cyIcon = GetSystemMetrics(SM_CYICON);130
CRect rect;131
GetClientRect(&rect);132
int x = (rect.Width() - cxIcon + 1) / 2;133
int y = (rect.Height() - cyIcon + 1) / 2;134

135
// 绘制图标136
dc.DrawIcon(x, y, m_hIcon);137
}138
else139
{140
CDialog::OnPaint();141
}142
}143

144
//当用户拖动最小化窗口时系统调用此函数取得光标显示。145
//146
HCURSOR CKeyMsgDlg::OnQueryDragIcon()147
{148
return static_cast<HCURSOR>(m_hIcon);149
}150
BOOL CKeyMsgDlg::PreTranslateMessage(MSG *pMsg)151
{152
if(pMsg->message==WM_KEYDOWN)153
{ 154
switch(pMsg->wParam)155
{156
case VK_DOWN:157
::AfxMessageBox(_T("VK_SHIFT"));//CTRL 按键按下158
return TRUE;159
case 'M':160
if(::GetKeyState(VK_SHIFT)<0)161
{162
::AfxMessageBox(_T("VK_SHIFT+M"));//SHIFT+M 按键被按下163
}164
return TRUE;165
}166
}167
return CDialog::PreTranslateMessage(pMsg);168
}169

170





浙公网安备 33010602011771号