WM_PAINT
-
Sachetmal, ich hab nun leider meine wichtigste informationsquelle (ein gutes Buch) in meinen Umzugskisten vergraben.
Meine Frage: wie oft wird die WM_PAINT - Nachricht an ein Programm gesendet?
eigentlich doch nur über InvalidateRect, MoveWindow, erstellen des Fensters; oder?woran kann es liegen, dass mein fenster andauernd neu gezeichnet werdne will??
Ich hab neulich schonmal gefragt wegen eines Progs, das ich geschrieben hab. das ist so langsam, dass es kaum zu benutzen ist. Der Link nochmal zum Downloaden:http://mitglied.lycos.de/DocJunioR/tdown.html
P.S.: doublebuffering ist enabled, daran kann es also nicht liegen, dass es so flackert.
Ich hoffe mal, dass ich so schnell wie möglich wieder ins Netz komme umthx
DjRP.S.: wer fehler findet, darf sie mir melden und dann behalten
-
Hast du vieleicht ein WM_PAINT ohne Begin-/EndPaint -> Endlosschleife?
-
hmm.. brauch ich das auch, wenn ich ein glBegin()/glEnd() habe??
-
Versuch's doch mal.
-
Wenn du bisher nichts per GDI zeichnest reicht auch ein ValidateRect(hWnd,NULL);!
-
Ich hab dein Prog mal getestet. Da geht ja wirklich nix!
-
Also bei mir geht da schon mal überhaupt nix zum Downloaden! GetRight meckert immer, dass die Datei "seems to be a website" :(. Wenn ich sie anzeigen lasse, komme ich auf DocJunioR's Homepage, wenn ich sie runterlade, hat sie ein ungültiges Format...
cya
-
Original erstellt von MagiC Creator:
**Also bei mir geht da schon mal überhaupt nix zum Downloaden! GetRight meckert immer, dass die Datei "seems to be a website" :(. Wenn ich sie anzeigen lasse, komme ich auf DocJunioR's Homepage, wenn ich sie runterlade, hat sie ein ungültiges Format...cya :)**
deswegen heißt die Seite ja auch tdown.htm!
Tripod hat neuerdings ne DL-Sperre. Du kannst nur noch von einer site downloaden, die auch bei tripod liegt. Mal abgesehen davon. was willst Du bei 300 KB mit nem DL-Manager??Dass nix geht, kann daran liegen, dass Du erstmal eine neue Datei aufmachen willst. Du musst ja schließlich auch die Größe des Ganzen angeben, etc. Versuch doch mal im PSP gleich zu malen
Das mit dem ValidateRect() werd ich mal probieren
*pff* ich dachte, der Code liegt mit in der Datei??
hier die Fensterprocedure von meinem Zeichengrid.LRESULT CALLBACK C_mygrid::ChildProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { C_mygrid *Sc = (C_mygrid*) GetWindowLong(hWnd, GWL_USERDATA); int ScItemX, ScItemY, ScStep, PX, PY; T_KACHEL K ; float MapCX, MapCY; int CiRad; RECT rect; switch (message) /* handle the messages */ { case WM_LBUTTONDOWN: GetWindowRect(hWnd, &rect); // relative Koordinate der Mouse MapCX = ((float)((LOWORD(lParam)/ 50.0) / Sc->fZoom) + Sc->TickX); MapCY = ((float)((HIWORD(lParam)/ 50.0) / Sc->fZoom) + Sc->TickY); FillKachel (Sc->Felddaten,Sc->FileHeader, MapCX, MapCY, Sc->ScPos, 10, Sc->ActTool); //Füllen der Map Sc->MXPos = LOWORD(lParam); Sc->MYPos = HIWORD(lParam); InvalidateRect(hWnd, NULL, FALSE); break; case WM_PAINT: /* Todo: Mapdaten darstellen */ if (Sc->Felddaten != NULL) { glLoadIdentity(); glClearColor (0.0f, 0.0f, 0.0f, 0.0f); glClear (GL_COLOR_BUFFER_BIT); glPushMatrix (); glTranslatef(-1,1,0); glScalef(0.387 * Sc->fZoom * 0.0068, 0.387 * Sc->fZoom * 0.01, 0); glBegin(GL_QUADS); for (ScItemX= (int)Sc->TickX; ScItemX < Sc->FileHeader.XKCount; ScItemX += 1) { for (ScItemY = (int)Sc->TickY; ScItemY < Sc->FileHeader.YKCount; ScItemY += 1) { for (PY = 0; PY < Sc->FileHeader.SizeOfKachel; PY +=1) { for (PX = 0; PX < Sc->FileHeader.SizeOfKachel; PX +=1) { glColor3ub(Sc->ColR[Sc->Felddaten[ScItemY * Sc->FileHeader.XKCount + ScItemX] [PY * Sc->FileHeader.SizeOfKachel + PX]], Sc->ColG[Sc->Felddaten[ScItemY * Sc->FileHeader.XKCount + ScItemX] [PY * Sc->FileHeader.SizeOfKachel + PX]], Sc->ColB[Sc->Felddaten[ScItemY * Sc->FileHeader.XKCount + ScItemX] [PY * Sc->FileHeader.SizeOfKachel + PX]]); // glColor3b(Sc->ColR[PY], Sc->ColG[PX], Sc->ColB[ScItemX]); glVertex2f ( 50 * (ScItemX- Sc->TickX) + PX, -50 * (ScItemY- Sc->TickY) - PY); glVertex2f ( 50 * (ScItemX- Sc->TickX) + PX, -50 * (ScItemY- Sc->TickY) - PY-1); glVertex2f ( 50 * (ScItemX- Sc->TickX) + PX+1, -50 * (ScItemY- Sc->TickY) - PY-1); glVertex2f ( 50 * (ScItemX- Sc->TickX) + PX+1, -50 * (ScItemY- Sc->TickY) - PY); } } } } glColor3f(1,1,1); glVertex2f(-1.0,-1.0); glVertex2f(-1.0, 1.0); glVertex2f( 1.0, 1.0); glVertex2f( 1.0,-1.0); glEnd(); glPopMatrix (); SwapBuffers (Sc->hdc); } ValidateRect(); break; case WM_DESTROY: PostQuitMessage (0); /* send a WM_QUIT to the message queue */ break; default: /* for messages that we don't deal with */ return DefWindowProc (hWnd, message, wParam, lParam); } return 0; }
cYa
DjR[ Dieser Beitrag wurde am 04.01.2003 um 20:12 Uhr von DocJunioR editiert. ]
-
hat sich dein problem jetzt erledigt?
-
GetRight läuft bei mir im Hintergrund immer mit, ist besser so :).
cya
-
hat sich leider nix geändert. das Prog hat eine Prozessorausnutzung von 100% - und ich weiß nicht warum
-
Wieso, ist doch gut so... wenn es als einziges Programm läuft, kann es doch ruhig eine Auslastung von 100% haben, stell dir mal vor, der Prozessor wäre immer nur zu 50% ausgelastet.. das wär ja Verschwendung!
cya
-
aber das Prog dürfte im Normalzustand nicht mehr Auslastung als das Wordpad haben.
ich mach ja da nun auch wieder nicht so sehr vielcYa
DjR
-
man, kannst du nicht einfach immer ein bisschen mehr code rausnehmen, und gucken ob es dann irgendwann verschwindet? nimm doch einfach von WM_PAINT mal ganz raus und guck ob es dann immer noch dauernd gesendet wird. wenn nicht, dann tust du eben den quellcode wieder dazu bist du den fehler hast. stell dich doch ned so an
-
smiley: bei meinen geistigen Verrenkungen in Letzter Zeit (nicht wegen diesem Programm *gg*) komme ich scheinbar nicht mehr auf die simpelsten Sachen. Ich meld mich abernochmal, wenn das nicht funzt *gg*
-
so, ausprobiert: sowie WM_PAINT da steht (auch wenn nix drin ist) verbrät das System die komplette Rechenzeit
warum kann ich aber nicht sagen
- ich würd einfach raten, dass die Message ständig von irgendwoher gesendet wird.
irgendwelche Ideen? der Quellcode liegt dem Prog bei. (entwickelt mit dem DevCpp-Paket)
-
Schrieb doch einfach mal Begin- und EndPaint rein, wie es sich für eine Windowsanwendung gehört. Wenns dann nicht geht reden wir weiter.
-
Hmm.. okay
aber verstehen tu ich das noch nicht so ganz - naja, bin kein Win32-Profi.
Wenn ich in GL arbeite, wozu brauche ich dann die Begin- und EndPaint - Anweisungen?
-
Mach doch einfach eine Funktion z.B. Zeichnen(); in der du alle deine OGL-Zeichenaktivitäten machst. Diese Funktion kannst du dann aufrufen, wenn es neu gezeichnet werden soll, anstatt immer InvalidateRect aufzurufen, um ein neuzeichnen zu erzwingen. Im WM_PAINT-Zweig rufst du nur diese Funktion auf und gibst aber nicht 0 zurück, sondern rufst DefWndProc(...); auf.
So sollte es dann gehen.
-
hmm.. sollte eigentlich auch schneller sein - wenn ich mich nicht irre.. geht ja dann auch direkt in die Funktion und nicht erst übers Windows.
Ich werd mal schauen.