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
 15class 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
 31CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
 32{
 33}

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

 39
 40BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
 41END_MESSAGE_MAP()
 42
 43
 44// CKeyMsgDlg 对话框
 45
 46
 47
 48
 49CKeyMsgDlg::CKeyMsgDlg(CWnd* pParent /*=NULL*/)
 50    : CDialog(CKeyMsgDlg::IDD, pParent)
 51{
 52    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
 53}

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

 59
 60BEGIN_MESSAGE_MAP(CKeyMsgDlg, CDialog)
 61    ON_WM_SYSCOMMAND()
 62    ON_WM_PAINT()
 63    ON_WM_QUERYDRAGICON()
 64    //}}AFX_MSG_MAP
 65END_MESSAGE_MAP()
 66
 67
 68// CKeyMsgDlg 消息处理程序
 69
 70BOOL 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
102void 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
119void 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//
146HCURSOR CKeyMsgDlg::OnQueryDragIcon()
147{
148    return static_cast<HCURSOR>(m_hIcon);
149}

150BOOL 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
posted @ 2006-02-21 15:54  2008.5.12  阅读(1073)  评论(0编辑  收藏  举报