Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi DrawText nur Hwnd (https://www.delphipraxis.net/85870-drawtext-nur-hwnd.html)

EWeiss 6. Feb 2007 10:10


DrawText nur Hwnd
 
Ich möchte eine zeile Text ohne umbruch auf ein Fenster schreiben von dem nur das Hwnd bekannt ist.
Das möchte ich realisieren ohne Forms einzubinden.

API .. Drawtext in verbindung mit Rect das ganze in WM_PAINT damit der Text nicht gelöscht wird.

Jemand ein kleines Beispiel?

gruß

Luckie 6. Feb 2007 10:31

Re: DrawText nur Hwnd
 
Delphi-Quellcode:
var
  dc: HDC;
begin
  dc := GetDC(hWnd);
  if dc <> 0 then
  begin
    DrawText(dc, ..., ..., ...);
  end
  else
    ShowMessage(SysErrorMessage(getlastError));
end;

EWeiss 6. Feb 2007 10:35

Re: DrawText nur Hwnd
 
Zitat:

Zitat von Luckie
Delphi-Quellcode:
var
  dc: HDC;
begin
  dc := GetDC(hWnd);
  if dc <> 0 then
  begin
    DrawText(dc, ..., ..., ...);
  end
  else
    ShowMessage(SysErrorMessage(getlastError));
end;

Danke Luckie wie komme ich nun an den Font bzw.. kann die Farbe setzen.
Einfach die Fonts UNIT einbinden ?

Hat sich erledigt!
Benutze Graphics.

gruß

Luckie 6. Feb 2007 11:57

Re: DrawText nur Hwnd
 
Nachtrag: ReleaseDC nicht vergessen!

EWeiss 6. Feb 2007 12:13

Re: DrawText nur Hwnd
 
Zitat:

Zitat von Luckie
Nachtrag: ReleaseDC nicht vergessen!

Ja habs mir gedacht denn der Canvas zeichnet nicht immer neu ;)

Trotzdem wie schon bei anderen!
Das problem ist nun das die schrift flackert.

Mit WM_PAINT ließ es sich leider nicht verwirklichen.

Kann leider da mit Bitmaps erstellen nicht viel machen da ich keine Form verwende.
Was gäbe es da noch?


Habs mal mit TextOut versucht

Delphi-Quellcode:
procedure Overlay(handle: HWND; Text: PChar);
var
  DC: HDC;
  OCanvas: TCanvas;
begin
  DC := GetDC(handle);
  OCanvas := TCanvas.Create;
  OCanvas.Handle := DC;

  BeginPath(OCanvas.Handle);
  OCanvas.Font.Color := clwhite;
  OCanvas.Font.Name := 'Arial';
  OCanvas.Font.Size := 8;
  SetBkMode(OCanvas.Handle,TRANSPARENT);
  EndPath(OCanvas.Handle);

  OCanvas.TextOut(0, 0, Text);
  ReleaseDC(handle, dc);
end;
EDIT:
Da ich eh die Unit Graphics einfügen mußte
Kann ich auch direkt über canvas gehen
Allerdings ändert auch die procedure nix am Flackern.

Theoretisch müßte ich ein Bitmap Transparent auf das Fenster(hwnd) zeichen in dem dann die Schrift
dargestellt wird.
Nur die frage ob sich das dann auch beim neuzeichnen löscht.
Da es ja auch nur auf den dc gezeichnet wird.

gruß

Luckie 6. Feb 2007 12:22

Re: DrawText nur Hwnd
 
Du kannst doch ein auch ein Bitmap auf den Canvas kopieren. Wo ist das Problem?

EWeiss 6. Feb 2007 12:24

Re: DrawText nur Hwnd
 
Zitat:

Zitat von Luckie
Du kannst doch ein auch ein Bitmap auf den Canvas kopieren. Wo ist das Problem?

Das ich das in Delphi schreiben muss ;)
Kleines Beispiel? HIhihiiiii

EDIT:
Hmm und woher soll das kommen ? Müßte ich ja virtuell erstellen.
Das es dann wenn es vorhanden ist mit BitBlt gehen würde ist klar!

gruß

Luckie 6. Feb 2007 13:54

Re: DrawText nur Hwnd
 
  1. Bitmap erzeugen / erstellen
  2. Auf Bitmap malen
  3. Bei Bedarf Bitmap auf Canvas des Fensters kopieren
Zu allen Punkten solltets du etwas im Forum finden. Die Suche überlasse ich jetzt mal dir.

EWeiss 6. Feb 2007 14:26

Re: DrawText nur Hwnd
 
Zitat:

Zitat von Luckie

Zu allen Punkten solltets du etwas im Forum finden. Die Suche überlasse ich jetzt mal dir.

Ja Danke habe es schon.
Das problem ist nur was ich bisher gefunden habe baut sich auf Forms mit eingebauten Images auf .
damit kann ich aber nichts anfangen da wie schon gesagt ich über keine Form verfüge.

Gut werd dann mal weiter suchen .. vielleicht findet sich was.

gruß

Der_Ventilator 21. Mär 2007 21:00

Re: DrawText nur Hwnd
 
Hat jemand eine Ahnung wie ich den Text ohne Flackern wieder wegkriege?

Mit
Delphi-Quellcode:
InvalidateRect(0, nil, false)
wird zwar der ganze Bildschirm gelöscht, aber dabei flackert es hässlich.

Und mit
Delphi-Quellcode:
  PMyRect: PRect;
  MyRect: TRect;
begin
  MyRect.Left:=200;
  myRect.Top:=200;
  myrect.Bottom:=750;
  myrect.Right:=500;
  pmyrect:=@myrect;
  InvalidateRect(0, PMyRect, false)
ändert sich daran auch nichts. Egal wie groß ich das MyRect einstelle, es wird immer der ganze Bildschirm gelöscht. (Ich hab das getestet, indem ich den ganzen Screen vollgemalt habe).


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:17 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