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:
z.B.
Delphi-Quellcode:
Aber anscheinend macht da das Handle, bzw. csAllValid nicht mit:
Canvas := TCanvas.Create;
Try ... GetTextExtentPoint32W(Canvas.Handle, ... Finally Canvas.Free; End;
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: |
Re: wie temoräres Canvas erstrllen und nutzen?
Hmm, ist TControlCanvas eine Alternative?
|
Re: wie temoräres Canvas erstrllen und nutzen?
Oder eine temporäre Bitmap?
|
Re: wie temoräres Canvas erstrllen und nutzen?
Oder dem Canvas ein temp. HDC zuweisen... ? :gruebel:
|
Re: wie temoräres Canvas erstrllen und nutzen?
Delphi-Quellcode:
var Canvas:TCanvas;
begin Canvas:=TCanvas.Create; Canvas.Handle:=GetDC(GetDesktopWindow); ... |
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:
Gruß Assertor
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; Edits: Tippfehler... |
Re: wie temoräres Canvas erstrllen und nutzen?
Oh, oh, das ist wieder einmal so ein Moment, wo sich die Spreu vom Weizen trennt :(
|
Re: wie temoräres Canvas erstrllen und nutzen?
Macht nichts, Ralph, nobody' s perfect (ich schon lange nicht) :zwinker:
|
Re: wie temoräres Canvas erstrllen und nutzen?
Danke, Detlef, das hast du lieb gesagt!
Arbeiten wir also weiter an unserer Fortbildung! :cheers: |
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) |
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:
Da ich zur Bescheidenheit erzogen wurde, werd ich sonst selbst gleich :oops: Zitat:
:dp: Zitat:
Gruß Assertor |
Re: wie temoräres Canvas erstrllen und nutzen?
Zitat:
Vielleicht haben wir zusammen auf der "Cap San Diego" ja mal Gelegenheit für ein "echtes" :cheers: |
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:
Danker erstmal.
Canvas := TCanvas.Create;
Try Canvas.Handle := GetDC(GetDesktopWindow); ResizeTextComp(Comp, Canvas, 1, 1.0); //ReleaseDC(Canvas.Handle); Finally Canvas.Free; End; 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: |
Re: wie temoräres Canvas erstrllen und nutzen?
Hi,
Zitat:
Gruß Assertor |
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.
|
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:
Und laut Taskmanager bleiben die GDI-Objecte auch konstant (ohne ReleaseDC stiegen die wirklich an)
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]; 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