|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
derUnwissende Mini JLI'ler
Anmeldedatum: 14.11.2002 Beiträge: 32
Medaillen: Keine
|
Verfasst am: 05.06.2003, 22:57 Titel: InvalidateRect |
|
|
Hi,
hab da ein kleines Problem, und zwar will ich das Fenster bevor ich etwas zeichnen möchte mit InvalidateRect neu zeichnen lassen.
Also z.B. zeichnet man durch Mausklick einen Strich und jetzt soll immer zu beginn von WM_LBUTTONDOWN das Fenster neugezeichnet werden um den alten Strich durch einen neuen zu ersetzen.
Problem ist, obwohl ich InvalidateRect vorm Zeichnen des neuen Objektes aufrufe wird das Fenster nach dem Objekt direkt neugezeichnet.
1. Wollt ich fragen wieso das so is, denn ich rufe ja InvalidateRect zuerst auf und
2. natürlich wie man das ganze richtig macht
Danke |
|
Nach oben |
|
|
Starwash3 Mini JLI'ler
Anmeldedatum: 02.06.2003 Beiträge: 4
Medaillen: Keine
|
Verfasst am: 06.06.2003, 04:52 Titel: |
|
|
Hi,
warum das von dir oben beschriebene Eintritt kann ich nicht sagen, da ich noch nie Probs mit dem erneuern durch Invalidate/InvalidateRect hatte.
Aber wenn es dir darum geht den alten Strich weg zu kriegen und den neuen zu zeichenen dann tue doch folgendes:
1. ClientRect mit weißen Brush füllen
1.1 gibt ne WinKonstante für den weißen Brush
2. neue Linie zeichnen
Den DeviceContext musst du dir natürlich auch holen und wieder freigeben.
Sollte dein Fenster nicht früh genug Aktualisiert werden (wer weiß warum) hilft
1. UpdateWindow
(2. ShowWindow)
Gruss Tarek |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 06.06.2003, 11:21 Titel: |
|
|
Und falls das immer noch nicht hilft, kannst du ja mal etwas Code posten _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
derUnwissende Mini JLI'ler
Anmeldedatum: 14.11.2002 Beiträge: 32
Medaillen: Keine
|
Verfasst am: 06.06.2003, 13:39 Titel: |
|
|
So, wollte einfach machen, das vom mittelpunkt M(Xm|Ym) eines winkels ein strich zum mauszeiger geführt wird:
Code: |
x=LOWORD(lParam);
y=HIWORD(lParam);
case WM_MOUSEMOVE:
{
HDC hDC = GetDC(hwnd);
InvalidateRect(hwnd, 0, TRUE);
MoveToEx(hDC, Xm, Ym, NULL);
LineTo(hDC, x, y);
ReleaseDC(hwnd, HDC);
}
|
So, ich dachte mir, wenn jetzt die Maus bewegt wird, wird erst das fenster neu gezeichnet, und danach der strich gezeichnet, und wenn man die maus nicht wieder bewegt sollte dieser ja acuh erstma da bleiben, da das fenster ja erst wieder beim nächstenma neu gezeichnet wird.
Problem is, dass ich den alten strich nich einfach mit weiß überzeichnen, denn dann wird der kreisbogen ja an der schnittstelle auch weiß gezeichnet(in WM_PAINT wird um den Punkt P ein Kreis gezeichnet) |
|
Nach oben |
|
|
Starwash3 Mini JLI'ler
Anmeldedatum: 02.06.2003 Beiträge: 4
Medaillen: Keine
|
Verfasst am: 06.06.2003, 16:17 Titel: |
|
|
Hi,
du solltest auch das Rect angeben, dass du Invalidaten willst.
Code: | RECT rcWnd;
GetClientRect(hWnd,&rcWnd);
InvalidateRect(hWnd,&rcWnd,true);
//... |
Im MSDN steht zwar dass du Null übergeben kannst, um die gesamte Clientarea zu aktualisieren, aber so sollte es eigentlich auf jeden Fall funktionieren.
Falls du an dieser Stelle immer noch nichts vom Refresh merken solltest kannst du ja immer noch mal das mit UpdateWindow, etc. ausprobieren, nach dem du invalidatet hast.
Gruss Tarek |
|
Nach oben |
|
|
Jörg JLI MVP
Anmeldedatum: 19.07.2002 Beiträge: 182 Wohnort: Siegen/NRW Medaillen: Keine
|
Verfasst am: 06.06.2003, 16:28 Titel: |
|
|
Meiner Ansicht nach liegt das Problem vielmehr darin, dass du nicht BeginPaint() und EndPaint() aufrufst. Außerdem würde ich dir empfehlen, dass du das Zeichnen des Striches auch nur in der WM_PAINT-Behandlung machst, und nicht bei WM_MOUSEMOVE.
Du könntest bspw. globale Variablen benutzen, in die du in WM_MOUSEMOVE die Mauskoordinaten speicherst. Danach rufst du InvalidateRect(hwnd,NULL,TRUE) auf.
In WM_PAINT machst du dann, nachdem du BeginPaint() aufgerufen hast und den DC hast, dein MoveTo() und LineTo() und rufst EndPaint() auf. _________________ www.messiahzone.de.vu |
|
Nach oben |
|
|
derUnwissende Mini JLI'ler
Anmeldedatum: 14.11.2002 Beiträge: 32
Medaillen: Keine
|
Verfasst am: 07.06.2003, 16:03 Titel: |
|
|
Danke,
es geht mit UpdateWindow |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|