Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi GetPixel gibt fehlerhaften Wert zurück (https://www.delphipraxis.net/74798-getpixel-gibt-fehlerhaften-wert-zurueck.html)

xZise 8. Aug 2006 22:44


GetPixel gibt fehlerhaften Wert zurück
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe folgenden Code:
Delphi-Quellcode:
procedure TfrmEId3.FormShow(Sender: TObject);
var
  hDesk : HWND;
  hdcDesktop : HDC;
  i : Byte;
begin
  hDesk := GetDesktopWindow;
  hdcDesktop := GetWindowDC(hDesk);

  for i := 0 to xiBg.ControlCount - 1 do begin
    if xiBg.Controls[i] is TEdit then begin
      (xiBg.Controls[i] as TEdit).Color := GetPixel(hdcDesktop, 71, xiBg.Controls[i].Top);
    end;
  end;
end;
Der bei Show ausgeführt wird. Diese TEdits haben folgende Position:
Top = 32 + (Edit - 1) * 16
Left = 72

Das sind 7 Edits die alle untereinander angeordnet sind.
Alle sind auf einem "xiPanel", welches eine Farbverlauf hat und mit diesem Code wollte ich den Pixelfarbwert von Edit.Top und Edit.Left - 1 (immer 71) nehmen... Nun funktioniert das auch schon einigermaßen ( :D )... Siehe Anhang... Ich kann mit das eigentlich nicht erklären... (Das 1. Edit kann man nicht erkennen ;) )

Sascha L 9. Aug 2006 07:50

Re: Farben spielen verrückt
 
Ich habe gerade kein Delphi offen, sodass ich mir die Funktion GetPixel anschauen kann, aber kann es vllt. sein dass du den übergebenen Wert (Koordinaten) erst mit ClientToScreen umrechnen lassen musst?

xZise 9. Aug 2006 09:40

Re: Farben spielen verrückt
 
Nein das ist es leider nicht!
Ich habe Top/Left der Form auf 0 gesetzt (fsNone) und es geht immernochnicht :( Schade...

Sascha L 9. Aug 2006 12:26

Re: GetPixel gibt fehlerhaften Wert zurück
 
Naja, auch wenn du es auf 0,0 setzt, ist es ja nun keine richtige Lösung. Wenn GetPixel die Koordinaten des Bildschirms meint, dann MUSST du die Umrechnungs-Funktion verwenden ;)

xZise 23. Aug 2006 08:42

Re: GetPixel gibt fehlerhaften Wert zurück
 
Zitat:

Zitat von Sascha L
Wenn GetPixel die Koordinaten des Bildschirms meint, dann MUSST du die Umrechnungs-Funktion verwenden ;)

Nicht immer!

Wenn Point(0, 0) die Koos des Fensters ist, dann muss ich es nicht umrechnen.

Was mir aufgefallen ist: Die Farbe, ist die Farbe der Fenster dadrunter. (Also sozusagen, das was man ohne den Fenster sehen würde)

Vielleicht liegts daran, dass das Fenster nicht die Mainform ist?

PS: Scheiß T-Online... Weil ich umgezogen bin habe ich 2 Wochen kein I-Net :( Total Müll, wenn man Programmiert...

xZise 25. Aug 2006 13:14

Re: GetPixel gibt fehlerhaften Wert zurück
 
Hat keiner eine Idee?

himitsu 25. Aug 2006 14:34

Re: GetPixel gibt fehlerhaften Wert zurück
 
Haste schonmal versucht ein Pixel zu zeichnen?

Also statt Auszulesen einen setzen und nachsehn wo das landet.

Neutral General 25. Aug 2006 14:40

Re: GetPixel gibt fehlerhaften Wert zurück
 
Vielleicht hilft das ja:

Delphi-Quellcode:
function TCanvas.GetPixel(X, Y: Integer): TColor;
begin
  RequiredState([csHandleValid]);
  GetPixel := Windows.GetPixel(FHandle, X, Y);
end;
So bekommt TCanvas seine Pixel :)

Gruß
Neutral General

himitsu 25. Aug 2006 14:52

Re: GetPixel gibt fehlerhaften Wert zurück
 
So hat er es ja schon (GetPixel).

Das RequiredState([csHandleValid]); sorgt nur dafür, daß ein entsprechendes Handle zur Verfügung steht ... anwenden kann und braucht er sowas aber nicht (beim Desktop).


hmmm, im Moment machst du es ja so:
Delphi-Quellcode:
GetPixel(GetWindowDC(GetDesktopWindow), ...);
versuch es mal so:
(ich hoffe ich irre mich grad nicht, aber gab GetDC(0) nicht das DesktopHandle zurück?)
Delphi-Quellcode:
GetPixel(GetDC(0), ...);

Neutral General 25. Aug 2006 15:05

Re: GetPixel gibt fehlerhaften Wert zurück
 
Also bei mir funktioniert

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  hDesk : HWND;
  hdcDesktop : HDC;
begin
  hDesk := GetDesktopWindow;
  hdcDesktop := GetWindowDC(hDesk);
  Form1.Color := GetPixel(hdcDesktop, 81, 961);
end;
wunderbar.
Nur ich glaube es liegt wirklich daran das wenn Controls[i].Top = 0... Dann kann die y Koordinate die du suchst 500 sein. Du musst es wirklich umrechnen.

Gruß
Neutral General

xZise 29. Aug 2006 11:21

Re: GetPixel gibt fehlerhaften Wert zurück
 
Ja! Es ist schon so mit dem Umrechnen, ABER er nimmt immernoch den Farbpixel von dem Fenster darunter (getestet).

Und ich verstehe nicht, das Problem mit dem Umrechnen, es ist erwähnt, und könnte so sein, aber ist zu 99,99% nicht der Fehler.

Und dann möchte ich noch darauf hinweisen, dass ich es in "onShow" gepackt habe und ich keinen Timer verwende (auf der Mainform gabs einen Timer, find ich aber ein bisschen "dumm", extra eine eigene Kombo reinzusetzen...)!

Achso: Form != Mainform ;)

OregonGhost 29. Aug 2006 14:26

Re: GetPixel gibt fehlerhaften Wert zurück
 
Zitat:

Und dann möchte ich noch darauf hinweisen, dass ich es in "onShow" gepackt habe
Gerade kein Delphi zur Hand, aber war es nicht zumindest früher so, dass OnShow ganz kurz vor dem tatsächlichen Anzeigen des Fensters ausgeführt wird? Was macht dein Code denn, wenn du ihn irgendwann später ausführst, zum Beispiel im OnClick?

xZise 29. Aug 2006 15:08

Re: GetPixel gibt fehlerhaften Wert zurück
 
Zitat:

Zitat von OregonGhost
Was macht dein Code denn, wenn du ihn irgendwann später ausführst, zum Beispiel im OnClick?

Anso ich nehme an er würde gehen (Es geht ja auch über Timer ;))...
Gibts denn eine Prozedur, die von der Form kurz nach dem Anzeigen ausgeführt wird?
Oder würde es rein theroretisch so gehen:
Delphi-Quellcode:
procedure TForm1.Show;
begin
  inherited;
  GetPixels...;
end;
?

xZise 2. Sep 2006 14:46

Re: GetPixel gibt fehlerhaften Wert zurück
 
Gibts keine Andere Möglichkeit?


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:58 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 by Thomas Breitkreuz