cMouse.cpp
上传用户:sycq158
上传日期:2008-10-22
资源大小:15361k
文件大小:4k
源码类别:

游戏

开发平台:

Visual C++

  1. // CMAIN LIB - APPLICATION AND DIRECT WRAPPER
  2. //
  3. // Written by Mauricio Teichmann Ritter
  4. //
  5. // Copyright (C) 2002, Brazil. All rights reserved.
  6. // 
  7. //
  8. // cMouse.cpp: implementation of the cMouse class.
  9. //
  10. //////////////////////////////////////////////////////////////////////
  11. #include "stdafx.h"
  12. #include "cMouse.h"
  13. #include "cKeyboard.h"
  14. //////////////////////////////////////////////////////////////////////
  15. // Construction/Destruction
  16. //////////////////////////////////////////////////////////////////////
  17. cMouse::cMouse()
  18. {
  19. m_lXPos = 0;
  20. m_lYPos = 0;
  21. m_bButton0 = TRUE;
  22. m_bButton1 = TRUE;
  23. }
  24. cMouse::~cMouse()
  25. {
  26. }
  27. BOOL cMouse::Create()
  28. {
  29. cInputDevice::Create();
  30. HRESULT         hRet; 
  31. hRet = m_lpDI->CreateDevice(GUID_SysMouse, &m_lpDIMouse, NULL); 
  32. if FAILED(hRet) { 
  33. Destroy();
  34. return FALSE; 
  35. hRet = m_lpDIMouse->SetDataFormat(&c_dfDIMouse); 
  36. if FAILED(hRet) { 
  37. Destroy();
  38. return FALSE; 
  39.     hRet = m_lpDIMouse->SetCooperativeLevel(GetMainApp()->GetMainWnd(), 
  40.                              DISCL_FOREGROUND | DISCL_EXCLUSIVE); 
  41.     if FAILED(hRet) 
  42.     { 
  43.         Destroy();
  44.         return FALSE; 
  45.     } 
  46. m_hMouseEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  47. if (m_hMouseEvent == NULL) {
  48. return FALSE;
  49. }
  50. hRet = m_lpDIMouse->SetEventNotification(m_hMouseEvent);
  51.  
  52. if (FAILED(hRet)) {
  53. return FALSE;
  54. }
  55. #define SAMPLE_BUFFER_SIZE  16
  56.  
  57. DIPROPDWORD dipdw;
  58. // the header
  59. dipdw.diph.dwSize       = sizeof(DIPROPDWORD);
  60. dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER);
  61. dipdw.diph.dwObj        = 0;
  62. dipdw.diph.dwHow        = DIPH_DEVICE;
  63. // the data
  64. dipdw.dwData            = SAMPLE_BUFFER_SIZE;
  65.  
  66. hRet = m_lpDIMouse->SetProperty(DIPROP_BUFFERSIZE, &dipdw.diph);
  67. if (FAILED(hRet))
  68. {
  69. return FALSE;
  70. }
  71.     // Get access to the input device. 
  72.     hRet = m_lpDIMouse->Acquire(); 
  73.     if FAILED(hRet) 
  74.     { 
  75.         Destroy(); 
  76.         return FALSE; 
  77.     }
  78.  
  79. return TRUE;
  80. }
  81. void cMouse::Destroy()
  82. {
  83. if(m_lpDIMouse != NULL){
  84. m_lpDIMouse->Unacquire();
  85. m_lpDIMouse->Release();
  86. m_lpDIMouse = NULL;
  87. }
  88. cInputDevice::Destroy();
  89. //free(m_KbdBuffer);
  90. }
  91. void cMouse::Process()
  92. {
  93.     DIDEVICEOBJECTDATA didod[ SAMPLE_BUFFER_SIZE ];  // Receives buffered data 
  94.     DWORD              dwElements;
  95.     DWORD              i;
  96.     HRESULT            hr;
  97.     dwElements = SAMPLE_BUFFER_SIZE;
  98.     hr = m_lpDIMouse->GetDeviceData( sizeof(DIDEVICEOBJECTDATA),
  99.                                      didod, &dwElements, 0 );
  100.     if( hr != DI_OK ) 
  101.     {
  102.         hr = m_lpDIMouse->Acquire();
  103.         while( hr == DIERR_INPUTLOST ) 
  104.             hr = m_lpDIMouse->Acquire();
  105.    }
  106.     // Study each of the buffer elements and process them.
  107.     //
  108.     // Since we really don't do anything, our "processing"
  109.     // consists merely of squirting the name into our
  110.     // local buffer.
  111.     for( i = 0; i < dwElements; i++ ) 
  112.     {
  113.         switch( didod[ i ].dwOfs )
  114.         {
  115.             case DIMOFS_BUTTON0:
  116.                 if( didod[ i ].dwData & 0x80 )
  117.                     m_bButton0 = FALSE;
  118.                 else
  119.                     m_bButton0 = TRUE;
  120.                 break;
  121.             case DIMOFS_BUTTON1:
  122.                 if( didod[ i ].dwData & 0x80 )
  123.                     m_bButton1 = FALSE;
  124.                 else
  125.                     m_bButton1 = TRUE;
  126.                 break;
  127.             case DIMOFS_X:
  128. m_lXPos += didod[ i ].dwData;
  129. if(m_lXPos > 640)
  130. m_lXPos = 640;
  131. if(m_lXPos < 0)
  132. m_lXPos = 0;
  133. break;
  134.             case DIMOFS_Y:
  135. m_lYPos += didod[ i ].dwData;
  136. if(m_lYPos > 480)
  137. m_lYPos = 480;
  138. if(m_lYPos < 0)
  139. m_lYPos = 0;
  140. break;
  141.             /*case DIMOFS_Z:
  142.             {
  143.                 TCHAR strCoordValue[20];
  144.                 wsprintf( strCoordValue, TEXT("%d "), didod[ i ].dwData );
  145.                 _tcscat( strNewText, strCoordValue );
  146.                 break;
  147.             }*/
  148.         }
  149.     }
  150.     return;
  151. }
  152. LPDIRECTINPUTDEVICE8 cMouse::m_lpDIMouse = NULL;