三种方法实现快捷键编程

  VC中至少有三种快捷键编程的方法,通常在SDI,MDI结构的程序中通过加入Acclelerator资源的消息响应,快速地实现快捷键功能;
除些之内,还有另两种方法.通常用在基于对话框的程序中.
  1.
  1. #define   IsCTRLpressed()  ((GetKeyState(VK_CONTROL) & (1<<(sizeof(SHORT)*8-1)))!= 0)  //判断Ctrl键是否按下.
  2. BOOL CTDlg::PreTranslateMessage(MSG* pMsg) 
  3. {
  4.     if(pMsg->message == WM_KEYDOWN)
  5.     {
  6.         if(IsCTRLpressed())
  7.         {
  8.             switch(pMsg->wParam)
  9.             {
  10.             case 'A':  //ctrl + A键按下
  11.                 AfxMessageBox("you press ctrl + a");
  12.                 break;
  13.             case 'B':  //ctrl + B键按下
  14.                 AfxMessageBox("you press ctrl + b");
  15.                 break;
  16.             }
  17.         }
  18.     }
  19.     return CDialog::PreTranslateMessage(pMsg);
  20. }
.2.先添加Accelerator资源,比如:IDR_ACCELERATOR1,在其中添加要使用的快捷键资源:如
  ID:IDR_CTRLTEST
  Key:Ctrl + K
  Type:VIRTKEY
 
  1. //TDlg.h
  2. HACCEL m_hAcc;
  3. //TDlg.h
  4. BOOL CTDlg::OnInitDialog()
  5. {
  6.   ....
  7.   m_hAcc = LoadAccelerators(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR1));
  8. }
  9. BOOL CTDlg::PreTranslateMessage(MSG* pMsg) 
  10. {
  11.     int iRet;
  12.     switch(pMsg->message)
  13.     {
  14.     case WM_KEYDOWN:
  15.     case WM_SYSKEYDOWN:
  16.         iRet = TranslateAccelerator(m_hWnd, hAcc, pMsg);
  17.         if(iRet)
  18.         {
  19.             return TRUE;
  20.         }
  21.     }
  22.     return CDialog::PreTranslateMessage(pMsg);
  23. }
  24. 然后手工添加快捷资源的消息响应:
  25. 比如:
  26. //TDlg.h
  27.     //{{AFX_MSG(CTDlg)
  28.     afx_msg void OnTest();
  29.     //}}AFX_MSG
  30.     DECLARE_MESSAGE_MAP()
  31. //TDlg.cpp
  32.  BEGIN_MESSAGE_MAP(CTDlg, CDialog)
  33.   ON_COMMAND(IDR_CTRLTEST, OnTest)
  34.  END_MESSAGE_MAP()
  35. void CTDlg::OnTest()
  36. {
  37.    AfxMessageBox("you press ctrl + k");
  38. }

posted @ 2008-08-03 22:14  Socrates  阅读(364)  评论(0编辑  收藏  举报