三种方法实现快捷键编程

VC中至少有三种快捷键编程的方法,通常在SDI,MDI结构的程序中通过加入Acclelerator资源的消息响应,快速地实现快捷键功能;
除些之内,还有另两种方法.通常用在基于对话框的程序中.
1.
  1. #defineIsCTRLpressed()((GetKeyState(VK_CONTROL)&(1<<(sizeof(SHORT)*8-1)))!=0)//判断Ctrl键是否按下.
  2. BOOLCTDlg::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("youpressctrl+a");
  12. break;
  13. case'B'://ctrl+B键按下
  14. AfxMessageBox("youpressctrl+b");
  15. break;
  16. }
  17. }
  18. }
  19. returnCDialog::PreTranslateMessage(pMsg);
  20. }
.2.先添加Accelerator资源,比如:IDR_ACCELERATOR1,在其中添加要使用的快捷键资源:如
ID:IDR_CTRLTEST
Key:Ctrl + K
Type:VIRTKEY
  1. //TDlg.h
  2. HACCELm_hAcc;
  3. //TDlg.h
  4. BOOLCTDlg::OnInitDialog()
  5. {
  6. ....
  7. m_hAcc=LoadAccelerators(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDR_ACCELERATOR1));
  8. }
  9. BOOLCTDlg::PreTranslateMessage(MSG*pMsg)
  10. {
  11. intiRet;
  12. switch(pMsg->message)
  13. {
  14. caseWM_KEYDOWN:
  15. caseWM_SYSKEYDOWN:
  16. iRet=TranslateAccelerator(m_hWnd,hAcc,pMsg);
  17. if(iRet)
  18. {
  19. returnTRUE;
  20. }
  21. }
  22. returnCDialog::PreTranslateMessage(pMsg);
  23. }
  24. 然后手工添加快捷资源的消息响应:
  25. 比如:
  26. //TDlg.h
  27. //{{AFX_MSG(CTDlg)
  28. afx_msgvoidOnTest();
  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. voidCTDlg::OnTest()
  36. {
  37. AfxMessageBox("youpressctrl+k");
  38. }

你可能感兴趣的:(快捷键)