Problem WinAPI+GDI
-
Hi,
also ich hab da ein problem bei folgendem code:
#include <windows.h> #include <wingdi.h> #define T1 1 LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static char szAppName[] = "Name" ; HWND hwnd ; MSG msg ; WNDCLASSEX wndclass ; wndclass.cbSize = sizeof (wndclass) ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION) ; RegisterClassEx (&wndclass) ; hwnd = CreateWindow (szAppName, "WinAPI", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL) ; ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { HDC hdc ; PAINTSTRUCT ps ; HPEN hPen; int a = 10, b = 10, x = 0; switch (iMsg) { case WM_CREATE: SetTimer(hwnd,T1,1000,NULL); return 0; case WM_TIMER: if(wParam==T1 && x < 10) { MessageBox(0,"bvg","gfvb",0); hdc = BeginPaint(hwnd, &ps); hPen = CreatePen (PS_SOLID, 0, RGB(255,0,0)); SelectObject(hdc, GetStockObject(BLACK_BRUSH)); SelectObject(hdc, hPen); Rectangle(hdc,a,b,100,100); a+20; b+20; x++; EndPaint(hwnd, &ps); DeleteObject(hPen); } break; case WM_PAINT: return 0 ; case WM_DESTROY: PostQuitMessage (0) ; KillTimer(hwnd, T1); return 0 ; case WM_KEYDOWN: break; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; }eigentlich soll das program jede sekunde ein Rechteck versetzt einzeichnen (insgesamt 10mal).
Sieht evtl. jemand meinen Fehler und kann mir helfen?

Schonmal danke im voraus

-
Begin-/EndPaint gehört ausschließlich nach WM_PAINT - und sollte dort auch aufgerufen werden, wenn du WM_PAINT abfängst. Bei dem was du machen willst, rufst du einfach in WM_TIMER InvalidateRect auf.
-
In die WM_TIMER Nachricht darfst Du nur das verschieben der Koordinaten packen und dann einfach InvalidateRect aufrufen. Das Zeichnen dann ganz normal in WM_PAINT machen...
-
Cool, schonmal danke für die Hilfe

aber jetzt hab ich noch eion problem:
int i = 0; int l = 10, r = 60; switch (iMsg) { case WM_CREATE: SetTimer(hwnd,T1,1000,NULL); return 0; case WM_TIMER: if(wParam==T1 && i < 10) { RECT myRECT; myRECT.left = l; myRECT.top = 475; myRECT.right = r; myRECT.bottom = 425; InvalidateRect(hwnd, myRECT, false); l += 50; r += 50; i++; } .....In der Zeile mit der Funktion InvalidateRect() mault mein compiler:
cannot convert `RECT' to `const RECT*' for argument `2' to `BOOL InvalidateRect(HWND__*, const RECT*, BOOL)'Hat jemand eine Ahnung wie man RECT konstant machen kann?
Danke

-
Entscheidend ist das "*"

InvalidateRect() möchte gerne einen Zeiger auf myRECT haben:RECT myRECT; // [..] InvalidateRect(hwnd, &myRECT, false);
-
Ich würde empfehlen anstelle von "myRECT" einfach "NULL" zu übergeben, da sonst das Zeichnen nicht ganz stimmt!
-
Erstmal vielen dank für die Hilfe, funktionieren aber beide leider nicht so richtig....
Hat jemand eine Idee an was es sonst liegen kann?
Danke!
-
Zeigt der Compiler denn immer noch den gleichen fehler an oder ist es jetzt ein anderer?
-
ich würde die variablen erst mal zu static machen!
static int i = 0; statuc int l = 10, r = 60;
-
Zeigt der Compiler denn immer noch den gleichen fehler an oder ist es jetzt ein anderer?
Ne, ich kann des programm schon kompilieren aber des zeichnet kein Rechteck

ich würde die variablen erst mal zu static machen!
C/C++ Code:
static int i = 0;
statuc int l = 10, r = 60;Danke!
