000
14.09.2005, 19:02 Uhr
mauralix
|
Ich möchte ein Rechteck mittels GDI an den aktuellen Mauskoordinaten zeichnen funzt aber nicht... Hier mein bisheriger Code
C++: |
//Includes #include <dinput.h> #include <stdio.h>
//Libs #pragma comment(lib,"dinput8.lib") #pragma comment(lib,"dxguid.lib")
//Makros #define RELEASE(x){if(x!=NULL){x->Release();x=NULL;}} #define UNACQUIRE_AND_RELEASE(x){if(x!=NULL){x->Unacquire();x->Release();x=NULL;}}
// Prototypen LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam); void InitMouse(HWND hWnd,HINSTANCE hInstance); void CleanUp(void); void ProcessInput(HWND hWnd);
//Globals LPDIRECTINPUTDEVICE8 lpDIMouse=NULL; LPDIRECTINPUT8 lpDI=NULL;
int x=0;int y=0;
//------------------ Main -------------------------------------------- int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nShowCmd){
WNDCLASSEX wc;
wc.cbClsExtra=0; wc.cbSize=sizeof(wc); wc.cbWndExtra=0; wc.hbrBackground=(HBRUSH)(COLOR_WINDOW); wc.hCursor=0; wc.hIcon=0; wc.hIconSm=0; wc.hInstance=hInstance; wc.lpfnWndProc=WndProc; wc.lpszClassName="DI"; wc.lpszMenuName=NULL; wc.style=CS_HREDRAW|CS_VREDRAW|CS_OWNDC;
RegisterClassEx(&wc);
HWND hWnd=CreateWindowEx(NULL,"DI","Direct Input",WS_OVERLAPPEDWINDOW,100,100,640,480, NULL,NULL,hInstance,NULL);
ShowWindow(hWnd,SW_SHOW);
InitMouse(hWnd,hInstance);
MSG msg={0};
while(msg.message!=WM_QUIT){
if(PeekMessage(&msg,0,0,0,PM_REMOVE)){
TranslateMessage(&msg); DispatchMessage(&msg);
} else{
ProcessInput(hWnd); HDC hDC=GetDC(hWnd);
Rectangle(hDC,x,y,x+10,y+10); InvalidateRect(hWnd,NULL,FALSE); ReleaseDC(hWnd,hDC);
} }
UnregisterClass("DI",hInstance); CleanUp();
return 0; } //---------------------------------------------------------------------------
LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam){
switch(msg){
case WM_DESTROY: PostQuitMessage(0); break;
case WM_KEYDOWN: switch(wParam){
case VK_ESCAPE: PostQuitMessage(0); break; } break; }
return DefWindowProc(hWnd,msg,wParam,lParam); }
void InitMouse(HWND hWnd,HINSTANCE hInstance){
DirectInput8Create(hInstance,DIRECTINPUT_VERSION, IID_IDirectInput8,(void**)&lpDI,NULL);
lpDI->CreateDevice(GUID_SysMouse,&lpDIMouse,NULL);
// Kooperationsebene festlegen lpDIMouse->SetCooperativeLevel(hWnd,DISCL_FOREGROUND | DISCL_NONEXCLUSIVE); // Struktur, die auch die Mousepuffergröße enthält DIPROPDWORD DIProperties; ZeroMemory(&DIProperties,sizeof(DIProperties)); DIProperties.diph.dwSize = sizeof(DIPROPDWORD); DIProperties.diph.dwHeaderSize = sizeof(DIPROPHEADER); DIProperties.diph.dwObj = 0; DIProperties.diph.dwHow = DIPH_DEVICE; // Puffergröße festlegen DIProperties.dwData = 16; // Puffergröße für Mouseeingaben setzen lpDIMouse->SetProperty(DIPROP_BUFFERSIZE, &DIProperties.diph); // Zugang zur Mouse verschaffen lpDIMouse->Acquire();
}
void CleanUp(void){
RELEASE(lpDI); UNACQUIRE_AND_RELEASE(lpDIMouse);
}
void ProcessInput(HWND hWnd){
DWORD NumElements = 1; DIDEVICEOBJECTDATA data; ZeroMemory(&data,sizeof(data));
if(FAILED(lpDIMouse->GetDeviceData(sizeof(data),&data,&NumElements,0))) { // die Mouse wurde zwischenzeitlich von einer andere Anwendung // genutzt -> Kontrolle wiederholen lpDIMouse->Acquire(); return; } // Mausbewegung bestimmen switch(data.dwOfs) { case DIMOFS_X: x+=data.dwData; break;
case DIMOFS_Y: y+=data.dwData; break;
case DIMOFS_BUTTON0: MessageBeep(100); break;
case DIMOFS_BUTTON1: break; }
}
|
Was ist hier wohl falsch... <?> Wäre toll wenn jemand erklären könnte wie ich Zugriff auf die Mausposition bekomme usw. wenn ich es falsch mache. -- nur olfaktorisch fassbar.... |