MyEdit.cpp
上传用户:royluo
上传日期:2007-01-05
资源大小:1584k
文件大小:6k
源码类别:

游戏

开发平台:

Visual C++

  1. /*****************************************************************************
  2. *                                                                             
  3. *   MyEdit.cpp                                                            
  4. *                                                                             
  5. *   Electrical Engineering Faculty - Software Lab                             
  6. *   Spring semester 1998                                                      
  7. *                                                                             
  8. *   Tanks game                                                                
  9. *                                                                             
  10. *   Module description: Implements an Edit box object that responds to all key
  11. *                       strokes. Used in the keyboard setting dialog, to catch
  12. *                       all key that can be used to control the tank.    
  13. *                                                                             
  14. *   Authors: Eran Yariv - 28484475                                           
  15. *            Moshe Zur  - 24070856                                           
  16. *                                                                            
  17. *                                                                            
  18. *   Date: 23/09/98                                                           
  19. *                                                                            
  20. ******************************************************************************/
  21. #include "stdafx.h"
  22. #include "MyEdit.h"
  23. BOOL CMyEdit::PreTranslateMessage(MSG* pMsg)
  24. {
  25.     BOOL bIgnore = FALSE;   // When this flag is true, the special key is not passed to
  26.                             // the application (keys like Return or arrows), to avoid 
  27.                             // cursor movements and mischief behavior.
  28. if(pMsg->message == WM_SYSKEYDOWN || pMsg->message == WM_KEYDOWN)
  29.     {       // Yep, some key was pressed down alright:
  30.         UINT nKey = pMsg->wParam;
  31.             // Handle text in CEdit control, if key is appropiate
  32.         if (SetKeyName (nKey))
  33.         {   // Check that key is unique, and sets it
  34.             if ( m_pKeys->SetKey(m_iIndex, nKey) ) 
  35.             {
  36.                 UpdateText();
  37.             } else  // Sound a beep notifying the key pressed is mapped to another control:
  38.             {
  39.                 MessageBeep(MB_ICONEXCLAMATION);
  40.             }
  41.         }
  42.             // Check for trouble makers:
  43.         bIgnore = ( nKey == VK_RETURN  || 
  44.                     nKey == VK_END     ||
  45.                     nKey == VK_DOWN    ||
  46.                     nKey == VK_UP      ||
  47.                     nKey == VK_LEFT    ||
  48.                     nKey == VK_RIGHT );
  49.     }
  50.     if (bIgnore)
  51.         return TRUE;
  52. return CEdit::PreTranslateMessage(pMsg);
  53. }
  54. /*------------------------------------------------------------------------------
  55.   Function: SetKeyName
  56.   Purpose:  Finds the given key's name, and return TRUE if key is appropiate.
  57.   Input:    nKey: Virtual code of key pressed by user.
  58.   Output:   return TRUE if the key pressed is supported as control key.
  59.   Remarks:  We don't support keys that change the normal windows behavior, such as
  60.             TAB, ALT etc.
  61. ------------------------------------------------------------------------------*/
  62. BOOL
  63. CMyEdit::SetKeyName (UINT nKey)
  64. {
  65.     char cGroup1[] = ";=,-./`"; // The codes for these keys are sequents:
  66.     char cGroup2[] = "[\]'";
  67.     m_cstrKeyName.Empty();   // Reference string, to help find out if key is appropiate
  68.     switch(nKey)
  69. { // Handle all playable keys, including non-alpha-numeric keys:
  70. case VK_CONTROL:
  71. m_cstrKeyName = "CONTROL";
  72. break;
  73. case VK_SHIFT:
  74. m_cstrKeyName = "SHIFT";
  75. break;
  76. case VK_BACK:
  77. m_cstrKeyName = "BACKSPACE";
  78. break;
  79. case VK_RETURN:
  80. m_cstrKeyName = "ENTER";
  81. break;
  82. case VK_LEFT:
  83. m_cstrKeyName = "Left Arrow";
  84. break;
  85. case VK_RIGHT:
  86. m_cstrKeyName = "Right Arrow";
  87. break;
  88. case VK_UP:
  89. m_cstrKeyName = "Up Arrow";
  90. break;
  91. case VK_DOWN:
  92. m_cstrKeyName = "Down Arrow";
  93. break;
  94. case VK_SPACE:
  95. m_cstrKeyName = "Spacebar";
  96. break;
  97. case VK_MULTIPLY:
  98. m_cstrKeyName = "NUM *";
  99. break;
  100. case VK_DIVIDE:
  101. m_cstrKeyName = "NUM /";
  102. break;
  103. case VK_SUBTRACT:
  104. m_cstrKeyName = "NUM -";
  105. break;
  106. case VK_ADD:
  107. m_cstrKeyName = "NUM +";
  108. break;
  109. case VK_DECIMAL:
  110. m_cstrKeyName = "NUM .";
  111. break;
  112.     case VK_NUMPAD0:
  113.     case VK_NUMPAD1:
  114.     case VK_NUMPAD2:
  115.     case VK_NUMPAD3:
  116.     case VK_NUMPAD4:
  117.     case VK_NUMPAD5:
  118.     case VK_NUMPAD6:
  119.     case VK_NUMPAD7:
  120.     case VK_NUMPAD8:
  121.     case VK_NUMPAD9:
  122.         m_cstrKeyName.Format ("NUM %d", nKey - VK_NUMPAD0);
  123.         break;
  124.     case VK_F2:
  125.     case VK_F3:
  126.     case VK_F4:
  127.     case VK_F5:
  128.     case VK_F6:
  129.     case VK_F7:
  130.     case VK_F8:
  131.     case VK_F9:
  132.     case VK_F11:
  133.     case VK_F12:
  134.         m_cstrKeyName.Format ("FUNC %d", nKey - VK_F1 + 1);
  135.         break;
  136.     case VK_PRIOR:
  137.         m_cstrKeyName = "Page Up";
  138.         break;
  139.     case VK_NEXT:
  140.         m_cstrKeyName = "Page Down";
  141.         break;
  142.     case VK_HOME:
  143.         m_cstrKeyName = "Home";
  144.         break;
  145.     case VK_END:
  146.         m_cstrKeyName = "End";
  147.         break;
  148.     case VK_INSERT:
  149.         m_cstrKeyName = "Insert";
  150.         break;
  151.     case VK_DELETE:
  152.         m_cstrKeyName = "Delete";
  153.         break;
  154.     case 186:   // ;
  155.     case 187:   // =
  156.     case 188:   // ,
  157.     case 189:   // -
  158.     case 190:   // .
  159.     case 191:   // /
  160.     case 192:   // `
  161.         m_cstrKeyName = cGroup1[nKey - 186];
  162.         break;
  163.     case 219:   // [
  164.     case 220:   // ()
  165.     case 221:   // ]
  166.     case 222:   // '
  167.         m_cstrKeyName = cGroup2[nKey - 219];
  168.         break;
  169.     case VK_CLEAR:
  170.         m_cstrKeyName = "NUM 5"; // Infact you get this key if numlock is off, but who cares
  171.         break;
  172.     default:
  173.         if ((47 < nKey && 58 > nKey) ||     // isalnum give us trouble, so we check it manually
  174.             (64 < nKey && 91 > nKey)) 
  175.         {
  176. m_cstrKeyName.Format ("%c", nKey);
  177.         }
  178. break;
  179. }
  180.     return (!m_cstrKeyName.IsEmpty());
  181. }