Problem mit Ellipse
-
Hallo!
Ich bin gerade dabei, ein Programm zu schreiben, bei der am Anfang eine Ellipse gezeichnet wird, die man dann mit den Pfeiltasten bewegen kann.
Dazu habe ich eine Klasse geschrieben:#include <stdio.h> class edges { public: edges(); ~edges(); void SetX1(int x1) {itsx1 = x1;} void SetY1(int y1) {itsy1 = y1;} int GetX1()const {return itsx1;} int GetY1()const {return itsy1;} int GetX2()const {return itsx1+20;} int GetY2()const {return itsy1+20;} private: int itsx1; int itsy1; }; edges::edges(): itsx1(290),itsy1(290) { } edges::~edges() { }
So, nun habe ich ein "edges"-Objekt initialisiert und will bei der Nachricht WM_KEYDOWN(genauer: bei VK_LEFT,VK_RIGHT,VK_UP,VK_DOWN) die privaten Variablen manipulieren :
case WM_KEYDOWN: switch(wParam) { case VK_UP: kanten.SetY1(kanten.GetY1()-5); InvalidateRect(hwnd,&rect,TRUE); break; case VK_DOWN: kanten.SetY1(kanten.GetY1()+5); InvalidateRect(hwnd,&rect,TRUE); break; case VK_LEFT: kanten.SetX1(kanten.GetX1()-5); InvalidateRect(hwnd,&rect,TRUE); break; case VK_RIGHT: kanten.SetX1(kanten.GetX1()+5); InvalidateRect(hwnd,&rect,TRUE); break; case VK_ESCAPE: PostQuitMessage(0); break; } break;
In der WM_PAINT steht dann das eine Ellipse mit den Ecken gezeichnet werden soll.Aber irgendwie werden die Variablen der Klasse nicht geändert, oder es gibt sonst einen Fehler, auf jeden Fall bewegt sich die Ellipse nicht.
(aber ich weiß dass das Programm in den WM_PAINT-Aufruf kommt).Sieht jemand vielleicht einen Fehler?
Danke schonmal!!!
-
Hm, du msstest es noch ein bisschen genauer besvhreieb, denk ich: Was ist rect?
und kanten ist ein edges-Objekt?Und was gibt es sonst für einen Fehler?
Setz mal einen Haltepunkt in die switch-Anweisung, zB bei VK_UP und schau, ob er da überhaupt reinspringt.
Und zeig mal, wie du die Ellipse dann zeichnest.Und wenn du dazu eine Klasse schreibst, dann sollte das Objekt sich auch selbst zeichnen können, anstat nur die Varibalen zu speichern.
Gruß, Maxi
-
achso das hatte ich vergessen:
also rect ist ein RECT-Objekt, dem der gesamte Anwendungsbereich zugeteilt is.
kanten ist ein edges-objekt...und in die switch-anweisungen kommt er...das mit der zeichenfunktion in der klasse ist eine gute idee, das probier ich mal...
Das ist die gesamte CALLBACK-funktion:LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc ; PAINTSTRUCT ps ; int cxClient,cyClient; edges kanten; RECT rect; GetClientRect(hwnd,&rect); switch (message) { case WM_SIZE: cxClient=LOWORD(lParam); cyClient=HIWORD(lParam); case WM_PAINT: hdc=BeginPaint(hwnd,&ps); int tempx1,tempy1,tempx2,tempy2; char string[25]; tempx1=kanten.GetX1(); tempy1=kanten.GetY1(); tempx2=kanten.GetX2(); tempy2=kanten.GetY2(); sprintf(string,"%-4d %-4d %-4d %-4d",tempx1,tempy1,tempx2,tempy2); TextOut(hdc,0,0,string,strlen(string)); Ellipse(hdc,kanten.GetX1(),kanten.GetY1(),kanten.GetX2(),kanten.GetY2()); EndPaint(hwnd,&ps); return 0 ; case WM_KEYDOWN: switch(wParam) { case VK_UP: kanten.SetY1(kanten.GetY1()-5); InvalidateRect(hwnd,&rect,TRUE); break; case VK_DOWN: kanten.SetY1(kanten.GetY1()+5); InvalidateRect(hwnd,&rect,TRUE); break; case VK_LEFT: kanten.SetX1(kanten.GetX1()-5); InvalidateRect(hwnd,&rect,TRUE); break; case VK_RIGHT: kanten.SetX1(kanten.GetX1()+5); InvalidateRect(hwnd,&rect,TRUE); break; case VK_ESCAPE: PostQuitMessage(0); break; } break; case WM_DESTROY: PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }
Die Koordinaten, die ich in WM_PAINT ausgebe, ändern sich nie..das ist noch ein Problem bzw. DAS problem
-
du musst kanten static machen
-
Hey super! es funktioniert!
schonmal vielen vielen dank!!!!
aba kannst du das vielleicht nochma für nen anfänger erklären,bitte?
-
Wenn es nicht static ist wird bei jedem Aufruf der WndProc eine neue Instanz angelegt
-
ah ok verstehe...gut dann nochmal vielen dank!