Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Pen : Farbe ändern (https://www.delphipraxis.net/202-pen-farbe-aendern.html)

Sebastian Nintemann 19. Jun 2002 17:06


Pen : Farbe ändern
 
hallo!

also ich hab ein simples Problem:

Ich erzeuge mit
Code:
 pen := CreatePen(PS_SOLID,5,rgb(r,g,b));
Einen Pen und setze ihn mit

Code:
  SelectObject(DC,pen);
in meinen dc ein. Wie kann ich nun die Farbe des Pens ändern?
Ich benutze Win9x.


Viele Grüße, Sebastian

Daniel 19. Jun 2002 17:21

Du könntest via "GetObject" wieder auf den Pen zugreifen. Hierzu ein Auszug aus dem PSDK:
Code:
int GetObject(
  HGDIOBJ hgdiobj, // handle to graphics object
  int cbBuffer,    // size of buffer for object information
  LPVOID lpvObject // buffer for object information
);
"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.

Vielleicht hilft's ja...


Grüße,
Daniel

Luckie 19. Jun 2002 18:51

Wo ist das Problem? So wie du ihn erzeugt hast, einfach einen neuen einsetzen.

Aber nicht vergessen ihn mit DeleteObject wieder zu löschen.

Sebastian Nintemann 21. Jun 2002 16:03

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).

Luckie 21. Jun 2002 16:06

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.

Sebastian Nintemann 22. Jun 2002 12:32

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

OregonGhost 22. Jun 2002 12:44

Muss man das nicht eigentlich so machen:
Code:
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);
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.
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