Discussion:
Über DeviceContext Handle auf Canvas zugreifen
(zu alt für eine Antwort)
Christian Bode
2004-11-17 23:13:23 UTC
Permalink
Hallo,

ich übergebe einer Klassenfunktion das DC Handle eines Canvas. Die Funktion
speichert das Handle in einer seperaten Klassenvariable. Später weise ich
das Handle einem anderen Canvas-Object zu und zeichne auf den Canvas und
somit auf das eigentliche Formular. Das funktioniert aber nur, wenn ich
jedes Mal vor jedem Zeichnen erneut das Handle neu zuweise. Erledige ich das
bereits einmalig an anderer Stelle z.B. im Constructor funktioniert das
ganze schon nicht mehr.
Ich habe auch schon ein wenig mit CreateCompatibleDC und SelectObject herum
experimentiert, allerdings hat das auch irgendwie nicht funktioniert.

OnCreate()
NewCanvas := TCanvas.Create;
NewCanvas.Handle := Form1.Canvas.Handle;

OnIrgendwann
NewCanvas.Draw(10, 10, Image1.Picture.Bitmap);

OnDestroy()
NewCanvas.Free;

Danke für Eure Hilfe
Christian
Hans-Joachim Weber
2004-11-18 08:42:16 UTC
Permalink
Hi,
Post by Christian Bode
ich übergebe einer Klassenfunktion das DC Handle eines Canvas. Die Funktion
speichert das Handle in einer seperaten Klassenvariable. Später weise ich
das Handle einem anderen Canvas-Object zu und zeichne auf den Canvas und
somit auf das eigentliche Formular. Das funktioniert aber nur, wenn ich
jedes Mal vor jedem Zeichnen erneut das Handle neu zuweise. Erledige ich das
bereits einmalig an anderer Stelle z.B. im Constructor funktioniert das
ganze schon nicht mehr.
Das liegt IMHO daran, dass Windows solche Handles gelegentlich neu zuordnet.
Deshalb kümmert sich ein Canvas vor der Durchführung von Zeichenoperationen
AFAIK um die Gültigkeit seines Handles.

Gruß, Jochen.
--
Nicht ärgern, nur wundern
Christian Bode
2004-11-18 20:58:50 UTC
Permalink
Das liegt IMHO daran, dass Windows solche Handles gelegentlich neu zuordnet.
Deshalb kümmert sich ein Canvas vor der Durchführung von Zeichenoperationen
AFAIK um die Gültigkeit seines Handles.

Und was kann ich dagegen tun?

Christian
Hans-Joachim Weber
2004-11-19 09:06:28 UTC
Permalink
Hi,
Post by Christian Bode
Post by Hans-Joachim Weber
Das liegt IMHO daran, dass Windows solche Handles gelegentlich neu zuordnet.
Und was kann ich dagegen tun?
Das Handle nicht beim Programmstart speichern, sondern vor jedem Gebrauch holen.
Ohne Gewähr: Lesen von Canvas.Handle gibt ein gültiges Handle zurück.
Oder Du benutzt direkt die Canvas-Methoden.

Gruß, Jochen.
--
Nicht ärgern, nur wundern
Michael Winter
2004-11-19 20:58:52 UTC
Permalink
Post by Hans-Joachim Weber
Das liegt IMHO daran, dass Windows solche Handles gelegentlich neu zuordnet.
Delphi, nicht Windows.

Vor Win32 waren Device contexts (DC) nur sehr begrenzt verfügbar. Jede
Anwendung war gehalten, einen solchen möglichst schnell wieder an Windows
zurück zu geben.

Auch heute ist ein DC nur in wenigen Fällen 'Eigentum' eines Fensters.
Vielmehr besorgt sich die Anwendung per GetDeviceContext einen solchen,
wenn er nötig ist. Die VCL kapselt dasm daher ist Canvas.Handle in der
Regel alles andere als konstant.

An den OP: Was ist der Grund, einen DC zu speichern und nicht ein HWND?

-Michael

Loading...