Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi wie temoräres Canvas erstellen und nutzen? (https://www.delphipraxis.net/128716-wie-temoraeres-canvas-erstellen-und-nutzen.html)

himitsu 4. Feb 2009 15:46


wie temoräres Canvas erstellen und nutzen?
 
Eigentlich wollte ich mir bei der internen Initialisierung 'ner Komponente
nur kurz ein Canvas erstellen, um darüber die Größe bestimmter Texte/Buchstaben abhängig eine bestimmten Fonts ermitteln.

nur leider geht das nicht so, wie ich wollte.

Zitat:

Zitat von EInvalidOperation
Leinwand/Bild erlaubt kein Zeichnen

das wäre mir ja egal, da ich doch eh nicht zeichnen wollte ... nur auslesen.

z.B.
Delphi-Quellcode:
Canvas := TCanvas.Create;
Try
  ...
  GetTextExtentPoint32W(Canvas.Handle,
  ...
Finally
  Canvas.Free;
End;
Aber anscheinend macht da das Handle, bzw. csAllValid nicht mit:
Delphi-Quellcode:
function TCanvas.GetHandle: HDC;
begin
  Changing;
  RequiredState(csAllValid);
  Result := FHandle;
end;

wie komm ich nun am Einfachsten ein nettes Handle ran
, wo ich in Ruhe auslesen kann?

Das Canvas, wo später alles ausgegeben werden soll, ist zu diesem Zeitpunkt noch nicht Verfügbar.

:angel:

taaktaak 4. Feb 2009 15:55

Re: wie temoräres Canvas erstrllen und nutzen?
 
Hmm, ist TControlCanvas eine Alternative?

DeddyH 4. Feb 2009 15:55

Re: wie temoräres Canvas erstrllen und nutzen?
 
Oder eine temporäre Bitmap?

turboPASCAL 4. Feb 2009 15:58

Re: wie temoräres Canvas erstrllen und nutzen?
 
Oder dem Canvas ein temp. HDC zuweisen... ? :gruebel:

Sunlight7 4. Feb 2009 16:19

Re: wie temoräres Canvas erstrllen und nutzen?
 
Delphi-Quellcode:
var Canvas:TCanvas;
begin
   Canvas:=TCanvas.Create;
   Canvas.Handle:=GetDC(GetDesktopWindow);
...

Assertor 4. Feb 2009 17:44

Re: wie temoräres Canvas erstrllen und nutzen?
 
Hi himitsu,

müsstest Du jetzt nicht etwas :oops: werden, bist doch auch schon länger dabei :mrgreen:

Harter Typcast auf eine eigene TCanvas-Klasse und RequiredState überschreiben.

Beispiel (von TntUnicode):
Delphi-Quellcode:
type
  TAccessCanvas = class(TCanvas);

function WideDCTextExtent(hDC: THandle; const Text: UnicodeString): TSize;
begin
  Result.cx := 0;
  Result.cy := 0;
  Windows.GetTextExtentPoint32W(hDC, PWideChar(Text), Length(Text), Result);
end;

function WideCanvasTextExtent(Canvas: TCanvas;
  const Text: UnicodeString): TSize;
begin
  with TAccessCanvas(Canvas) do begin
    RequiredState([csHandleValid, csFontValid]);
    Result := WideDCTextExtent(Handle, Text);
  end;
end;
Gruß Assertor

Edits: Tippfehler...

taaktaak 4. Feb 2009 17:57

Re: wie temoräres Canvas erstrllen und nutzen?
 
Oh, oh, das ist wieder einmal so ein Moment, wo sich die Spreu vom Weizen trennt :(

DeddyH 4. Feb 2009 18:00

Re: wie temoräres Canvas erstrllen und nutzen?
 
Macht nichts, Ralph, nobody' s perfect (ich schon lange nicht) :zwinker:

taaktaak 4. Feb 2009 18:17

Re: wie temoräres Canvas erstrllen und nutzen?
 
Danke, Detlef, das hast du lieb gesagt!
Arbeiten wir also weiter an unserer Fortbildung!
:cheers:

himitsu 4. Feb 2009 18:18

Re: wie temoräres Canvas erstrllen und nutzen?
 
Kennt ihr diesen Satz mit dem Wald und den Bäumen?


So, ich probier es gleich mal direkt mit GetDC(GetDesktopWindow) und ohne eine Canvas dazwischen.

Kann ich auf den Desktop eigentlich immer zugreifen?
(nicht daß ich unter Vista/Win7 mal Probleme bekomm)

Assertor 4. Feb 2009 18:24

Re: wie temoräres Canvas erstrllen und nutzen?
 
Hi,

@himitsu: Sollte gehen, aber ich würde aus einem Bauchgefühl heraus das gecastete Canvas bevorzugen.

Zitat:

Zitat von taaktaak
Oh, oh, das ist wieder einmal so ein Moment, wo sich die Spreu vom Weizen trennt :(

Du meinst aber nicht meine Antwort, oder :gruebel:

Da ich zur Bescheidenheit erzogen wurde, werd ich sonst selbst gleich :oops:

Zitat:

Zitat von DeddyH
Macht nichts, Ralph, nobody' s perfect (ich schon lange nicht) :zwinker:

Gleiches gilt für mich. Hautpsache wir können es nachschlagen, oder uns hier helfen lassen :)

:dp:

Zitat:

Zitat von taaktaak
Danke, Detlef, das hast du lieb gesagt!
Arbeiten wir also weiter an unserer Fortbildung!
:cheers:

Ihr zwei Beide seit ja wohl die, die mir hier am häufigsten geholfen haben. Also von mir auch ein Feierabend-:cheers:

Gruß Assertor

taaktaak 4. Feb 2009 18:36

Re: wie temoräres Canvas erstrllen und nutzen?
 
Zitat:

Zitat von Assertor
Du meinst aber nicht meine Antwort, oder :gruebel:

Doch, doch, von solchen Lösungen bin ich als Hobby-Autodidakt noch sehr weit entfernt.
Vielleicht haben wir zusammen auf der "Cap San Diego" ja mal Gelegenheit für ein "echtes" :cheers:

himitsu 4. Feb 2009 19:02

Re: wie temoräres Canvas erstrllen und nutzen?
 
hab's doch über das Canvas gelöst ... hatte fast vergessen, daß ich an einer Stelle das Canvas weitergeb :oops:

es gibt zumindestens keine Exception mehr :thumb:

ob die Berechnung dann stimmt werd ich ja bald erfahren ... muß aber erst noch die Anzeigeprozedur wieder instandsetzen.

Delphi-Quellcode:
Canvas := TCanvas.Create;
Try
  Canvas.Handle := GetDC(GetDesktopWindow);
  ResizeTextComp(Comp, Canvas, 1, 1.0);
  //ReleaseDC(Canvas.Handle);
Finally
  Canvas.Free;
End;
Danker erstmal.
da fallen einem fast die Schuppen aus den Haaren, wenn man sieht, wie einfach es sein kann und man einfach nicht sieht :angel:


Das Desktop-Handle muß ich dann nicht extra noch freigeben ... dürfte doch hoffentlich vom Canvas erledigt werden? :gruebel:

Assertor 4. Feb 2009 19:07

Re: wie temoräres Canvas erstrllen und nutzen?
 
Hi,

Zitat:

Zitat von taaktaak
Zitat:

Zitat von Assertor
Du meinst aber nicht meine Antwort, oder :gruebel:

Doch, doch, von solchen Lösungen bin ich als Hobby-Autodidakt noch sehr weit entfernt.

Vielleicht haben wir zusammen auf der "Cap San Diego" ja mal Gelegenheit für ein "echtes" :cheers:

Auf jeden Fall, sehr gerne! Ich weiß nur nicht, wie wir uns alle dann erkennen - ist für mich ja das erste mal Delphi-Tage. Wir können ja Namensschilder mit den Pseudonymen machen ;)

Gruß Assertor

Apollonius 4. Feb 2009 19:18

Re: wie temoräres Canvas erstrllen und nutzen?
 
Du musst das Desktop-Handle selbst freigeben! Das Canvas kann das gar nicht automatisch tun, da es weder über die Besitzverhältnisse des HDC informiert ist noch über das Fensterhandle, welches zur Freigabe benötigt wird.

himitsu 4. Feb 2009 19:58

Re: wie temoräres Canvas erstrllen und nutzen?
 
Hab auch grad gemerkt, TCanvas besitzt nichtmal Destroy/Free-Methoden, um da überhaupt was beim Löschen freigeben zu können. :shock:

Das Ergebnis sieht nun so aus
Code:
Canvas := TCanvas.Create;
[b]Try[/b]
  Canvas.Handle := GetDC(GetDesktopWindow);
  [color=gray]ResizeTextComp(Comp, Canvas, 1, 1.0);[/color]
  ReleaseDC(GetDesktopWindow, Canvas.Handle);
[b]Finally[/b]
  Canvas.Free;
[b]End[/b];
Und laut Taskmanager bleiben die GDI-Objecte auch konstant (ohne ReleaseDC stiegen die wirklich an)


also Danke nochmal an alle :love:


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz