![]() |
Pen : Farbe ändern
hallo!
also ich hab ein simples Problem: Ich erzeuge mit
Code:
Einen Pen und setze ihn mit
pen := CreatePen(PS_SOLID,5,rgb(r,g,b));
Code:
in meinen dc ein. Wie kann ich nun die Farbe des Pens ändern?
SelectObject(DC,pen);
Ich benutze Win9x. Viele Grüße, Sebastian |
Du könntest via "GetObject" wieder auf den Pen zugreifen. Hierzu ein Auszug aus dem PSDK:
Code:
"lpvObject" ist dann eine Referenz auf eine TLogPen-Struktur, welche u.A. die Farbe des Stiftes enthält. Damit müsstest Du sie dann ändern können. Und anschliessend ist bestimmt wieder ein Aufruf von "SelectObject(...)" nötig.
int GetObject(
HGDIOBJ hgdiobj, // handle to graphics object int cbBuffer, // size of buffer for object information LPVOID lpvObject // buffer for object information ); Vielleicht hilft's ja... Grüße, Daniel |
Wo ist das Problem? So wie du ihn erzeugt hast, einfach einen neuen einsetzen.
Aber nicht vergessen ihn mit DeleteObject wieder zu löschen. |
Danke schonmal für die Antworten, ich habs auch jetzt so gemacht dass ich jedesmal einen neuen Pen einsetze. Allerdings: Das ganze ist in einer Schleife (man malt quasi mit einem Stift der immer seine Farbe ändert (per random)). Die ersten 5 Sekunden geht das gut, dann ändert der Stift seine Farbe nicht mehr, hab keine Ahnung woran das liegt. Ich dachte es gäbe vielleicht etwas wie SetDCPenColor (das gibts nur in win NT/2000/XP).
|
Kann daranliegen, dass ihm die Ressourcen ausgehen. Das Problem habe ich auch mit einem Programm. da wird in WM_PAINT gemalt und wenn man das Fenster so 30 - 50 mal minimiert und wieder hergstellt hat wars das mit den Farben.
Zeig uns doch mal deine Schleife. Eventuell hilft es das Objekt erst wieder zu löschen. |
Also, die Schleife:
Code:
for i := 1 to 1000 do begin pen := CreatePen(PS_SOLID,5,rgb(r,g,b)); SelectObject(DC,pen); GetCursorPos(p); LineTo(DC,p.x,p.y); r := r+random(21)-10; g := g+random(21)-10; b := b+random(21)-10; if r<0 then r:=0 else if r>255 then r:=255; if g<0 then g:=0 else if g>255 then g:=255; if b<0 then b:=0 else if b>255 then b:=255; sleep(100); WriteLn(inttostr(r)+' '+inttostr(g)+' '+inttostr(b)); DeleteObject(pen); end; Dabei verbessert oder verschlechtert sich das Ergebnis bei variationen wie zb weglassen oder hinzufügen von sleep, mit verschiedenen millisekunden Zahlen, durch hinzufügen von WriteLn (ist ne Konsole), durch ändern der Durchlaufzahl etc. r, g und b machen das was ich will, nämlich sich dauernd ändern, nur die angezeigte Farbe ändert sich mal garnicht, mal nur in den ersten Sekunden so wie es sein sollte, und danach garnicht mehr, oder mal nach ein paar Sekunden schlagartig. ISt wohl zu schnell für den armen Computer,lol Ach ja, habs auch mit und ohne DeleteObject versucht, passiert nichts. Gruß Sebastian |
Muss man das nicht eigentlich so machen:
Code:
Zumindest steht im PSDK, dass man keine GDI-Objekte löschen soll, die noch in einen Gerätekontext selektiert sind. Also wird es vielleicht gar nicht gelöscht.
pen := CreatePen(PS_SOLID,5,rgb(r,g,b));
oldPen = SelectObject(DC,pen); // <<-- hier, das meine ich { Dein Code } SelectObject(DC, oldPen); // <<-- und das auch DeleteObject(pen); Konnte ich leider nicht nachprüfen, weil mein Taskmanager hat für das Testprogramm immer 38 Handles angezeigt, egal ob ich den immer freigegeben hab' oder nicht ;c) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:39 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz