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 {
17public:
18 CAboutDlg();
19
20// 对话框数据
21 enum { IDD = IDD_ABOUTBOX };
22
23 protected:
24 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
25
26// 实现
27protected:
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
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 {
17public:
18 CAboutDlg();
19
20// 对话框数据
21 enum { IDD = IDD_ABOUTBOX };
22
23 protected:
24 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
25
26// 实现
27protected:
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