Delphi-PRAXiS
Seite 1 von 2  1 2      

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)


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:52 Uhr.
Seite 1 von 2  1 2      

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