Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi DrawShadowText in Delphi (commctrl.h/ComCtl32.dll) (https://www.delphipraxis.net/66678-drawshadowtext-delphi-commctrl-h-comctl32-dll.html)

Delphi-Freak 2. Apr 2006 15:26


DrawShadowText in Delphi (commctrl.h/ComCtl32.dll)
 
Hi!
Ich bin irgendwann auf die Funktion DrawShadowText gestoßen, und wollte die auch einmal ausprobieren. Aber sie ist in der Delphi-Unit CommCtrl nicht drin. Jetzt habe ich mich in C++ versucht (ist ja beim BDS2006 dabei), ohne jegliche Kenntnis in C/C++ (außer was man von PHP oder so kennt...), habe es dort aber auch nicht geschafft... Nachdem aber auch die DLL angegeben war, habe ich versucht, die Funktion so hereinzukriegen, aber auch erfolglos. Das Programm hat sich nach dem Starten sofort wieder geschlossen und mit Debugger gabs eine AV.

Liege ich da ganz falsch mit meinen Versuchen, oder kann ich die Funktion mit dem BDS einfach nicht verwenden? :gruebel:

Übrigens noch der Code für die DLL, den ich probiert habe:
Delphi-Quellcode:
function DrawShadowText(hdc: HDC; pszText: LPCWSTR; cch: UINT;
   const pRect: PRect; dwFlags: DWORD; crText: COLORREF; crShadow: COLORREF;
   ixOffset: Integer; iyOffset: Integer): Integer; external 'ComCtl32.dll';
LG, ich

turboPASCAL 2. Apr 2006 16:31

Re: DrawShadowText in Delphi (commctrl.h/ComCtl32.dll)
 
:!:
Code:
[b]Function Information[/b]

    [color=#df0000]Minimum DLL Version   ComCtl32.dll version 6 or later[/color]
    Header                     - commctrl.h
    Import library             - comctl32.lib
    Minimum operating systems  - Windows XP
Win XP benutz nur ComCtl32.dll Version 5.xx.

Bei .Net ist glaube ich Version 6 dabei. :gruebel:

xaromz 2. Apr 2006 16:53

Re: DrawShadowText in Delphi (commctrl.h/ComCtl32.dll)
 
Hallo,

fehlt bei der Deklaration vielleicht einfach stdcall?

Gruß
xaromz

Delphi-Freak 2. Apr 2006 17:21

Re: DrawShadowText in Delphi (commctrl.h/ComCtl32.dll)
 
Danke mal für die Antworten! :thumb:
Das stdcall vor die external-Deklaration? Funktioniert nämlich auch nicht...
Wie kann man herausfinden, welche Version das ist? Hab mir die dll mal mit Luckies DLLExports angeschaut, aber da ist die Funktion nicht dabei :(
Was meinst du mit
Zitat:

Zitat von turboPASCAL
Bei .Net ist glaube ich Version 6 dabei.

LG, ich

Christian Seehase 2. Apr 2006 17:49

Re: DrawShadowText in Delphi (commctrl.h/ComCtl32.dll)
 
Moin Matti,

die Bemerkung zu der Funktion hast Du nicht geschrieben ;-)

Zitat:

Zitat von PSDK - DrawShadowText - Remarks
To use DrawShadowText, specify Comctl32.dll version 6 in the manifest.


Delphi-Freak 2. Apr 2006 18:13

Re: DrawShadowText in Delphi (commctrl.h/ComCtl32.dll)
 
Übrigens, ich bin schon etwas weiter mit den Fehlermeldungen: wenn man es aus der IDE startet (Strg+Shift+F9) schließt sich das Proggie sofort wieder, wenn mans aber anders startet kommt die Fehlermeldung "Einsprungspunkt nicht gefunden...".
Auch die Manifest-Datei hilft nicht weiter:
Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
    version="1.0.0.0"
    processorArchitecture="X86"
    name="DrawShadowTextSample"
    type="win32"
/>
<description>Just a sample proggy for the DrawShadowText-function.</description>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="X86"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
</assembly>
abgespeichert als AppName.exe.manifest
:roll:

LG, ich - und danke für eure Hilfe!!!

Luckie 3. Apr 2006 07:14

Re: DrawShadowText in Delphi (commctrl.h/ComCtl32.dll)
 
Delphi-Quellcode:
function DrawShadowText(hdc: HDC; pszText: LPCWSTR; cch: UINT;
   const pRect: PRect; dwFlags: DWORD; crText: COLORREF; crShadow: COLORREF;
   ixOffset: Integer; iyOffset: Integer): Integer; stdcall; external 'ComCtl32.dll';

implementation

{$R *.dfm}


procedure TForm1.FormPaint(Sender: TObject);
var
  rect: TRect;
begin
  rect.Top := 10;
  rect.Left := 10;
  rect.Bottom := 50;
  rect.Right := 150;
  DrawShadowText(Canvas.Handle, 'Hello world', 11, @rect, 0, COLORREF(RGB(255,255,255)), COLORREF(RGB(100,100,100)), 25, 25);
end;
Und das Manifest muss den Dateinamen haben: <Project1>.exe.manifest, wobei Project1 deinem Exe-Namen vor der Erweiterung entspricht. In diesem Fall hieße die Exe: Project1.exe

turboPASCAL 3. Apr 2006 15:54

Re: DrawShadowText in Delphi (commctrl.h/ComCtl32.dll)
 
Ja, soweit bin ich nun auch gekommen, das Manifest ist als Res eingebunden. Das Problem bei mir ist das der Text nicht gezeichnet wird. :gruebel:

//Edit #1:

Delphi-Quellcode:
implementation

{$R *.dfm}

function DrawShadowText(hdc: HDC; pszText: LPCWSTR; cch: UINT;
   const pRect: PRect; dwFlags: DWORD; crText: COLORREF;
   crShadow: COLORREF; ixOffset: Integer;
   iyOffset: Integer): Integer; stdcall; external 'ComCtl32.dll';

procedure TForm1.FormPaint(Sender: TObject);
const
  szText = 'Hallo, ich bin ein Text mit Schatten.';
var
  r: TRect;
begin
  r := Rect(10,10,50,100);

  DrawShadowText(Canvas.Handle, szText, length(szText), @r, 0,
    RGB(255, 0, 0), RGB(25, 25, 25), 2, 2);
end;
Naja, der Text wird nicht in voller länge ausgegeben "Hallo, ic", also wenn überhaubt.

//Edit #2: Selberschult, in Rect muss ja der Text passen. Der Tag ist dann doch schon zu lang. :wall:


Luckie, danke.

Luckie 3. Apr 2006 16:03

Re: DrawShadowText in Delphi (commctrl.h/ComCtl32.dll)
 
Es ist ein WideString. Also length*2.

turboPASCAL 3. Apr 2006 16:05

Re: DrawShadowText in Delphi (commctrl.h/ComCtl32.dll)
 
1. Siehe oben.

2. Warum muss, bzw. machst du

Delphi-Quellcode:
COLORREF(RGB(100,100,100))
RGB gibt doch ein en Wert von COLORREF zurück.


...und es funktioniert doch... :bounce2:

turboPASCAL 3. Apr 2006 16:35

Re: DrawShadowText in Delphi (commctrl.h/ComCtl32.dll)
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ich naochmal ;)


Delphi-Quellcode:
implementation

{$R *.dfm}

function DrawShadowText(hdc: HDC; pszText: LPCWSTR; cch: UINT;
   const pRect: PRect; dwFlags: DWORD; crText: COLORREF;
   crShadow: COLORREF; ixOffset: Integer;
   iyOffset: Integer): Integer; stdcall; external 'ComCtl32.dll';


function _DrawShadowText(ACanvas: TCanvas; x,y: Integer; AText: LPCWSTR;
  TextColor, ShadowColor: TColor; ShadowSpaceX, ShadowSpaceY: Integer): Integer;
var TextRect: TRect;
begin
   TextRect := Rect(x, y, x + ACanvas.TextWidth(AText),
     y + ACanvas.TextHeight(AText));

   Result := DrawShadowText(ACanvas.Handle, AText, length(AText), @TextRect, 0,
               COLORREF(TextColor), COLORREF(ShadowColor),
               ShadowSpaceX, ShadowSpaceY);
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  Canvas.Font.Name := 'MS Sans Serif';
  Canvas.Font.Size := 8;
  Canvas.Font.Style := [];

  _DrawShadowText(Canvas, 10,25, 'Hallo, ich bin ein Text mit Schatten.',
    clBtnText, clGray, 3, 3);


  Canvas.Font.Name := 'Arial';
  Canvas.Font.Size := 14;
  Canvas.Font.Style := [fsBold];

  _DrawShadowText(Canvas, 10, 50, 'Ich auch !', clRed, clBlue, 5, 2);

  Canvas.Font.Name := 'Arial';
  Canvas.Font.Size := 10;
  Canvas.Font.Style := [];

  _DrawShadowText(Canvas, 10, 80, 'Na und ich erst !', clBlue, clBlack, 2, 2);
end;

Luckie 3. Apr 2006 18:04

Re: DrawShadowText in Delphi (commctrl.h/ComCtl32.dll)
 
Der überflüssige Cast ist irgendwie übrig geblieben. ;)

Delphi-Freak 3. Apr 2006 18:13

Re: DrawShadowText in Delphi (commctrl.h/ComCtl32.dll)
 
Tschuldigung, dass ich mich jetzt nicht gemeldet habe... ich häng nur momentan mit der Schule etwas dran
Also VIELEN DANK euch beiden!! :thumb:
Ich werde mir das in ein paar Tagen (leider erst, vorher komm ich nicht dazu...) anschauen; aber nach dem Beweis-"foto" und Source kann nichts mehr schief gehen. Sonst meld ich mich halt wieder.

Also nochmal VIELEN DANK & LG, ich

Delphi-Freak 7. Apr 2006 19:55

Re: DrawShadowText in Delphi (commctrl.h/ComCtl32.dll)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also, es funzzt wirklich :mrgreen:
Habs aber nicht anders erwartet :dp:

Habe das ganze jetzt noch in eine Unit gepackt (die auch die Ressourcen einbindet, müssen halt vorhanden sein) und die Funktion, die man aufruft, heißt jetzt DrawShadowText und die andere (direkt aus der DLL) _DrawShadowText. Außerdem hat die Funktion so manches Problem mit einer schwarzen Schriftfarbe, dann wird kein Schatten gezeichnet -> Abhilfe: wenn Schriftfarbe schwarz dann auf $00010101 gesetzt, man sollte also keinen Unterschied sehen, außer natürlich, dass der Schatten dann doch gezeichnet wird :mrgreen:

Also noch mal DANKE für eure Hilfen & LG, ich

PS: Nochmal für die, die sich mit Ressourcen etc. nicht so gut auskennen (wo ich eigentlich auch dazu gehöre), man braucht nur die 4 Dateien ins lib-Verzeichnis kopieren, die Unit einbinden und dann natürlich die Funktion auch verwenden...

[edit]So manch kleiner Fehler ausgebessert...[/edit]

[nochmaledit]Ich seh gerade noch im Screenshot oben, dass das mit schwarz irgendwie doch funktionieren dürfte, außerdem hat mein Rechner das ursprüngliche Beispiel türkis gezeichnet und nicht schwarz, keine Ahnung wieso :gruebel: [/nochmaledit]

Daniel G 7. Apr 2006 20:02

Re: DrawShadowText in Delphi (commctrl.h/ComCtl32.dll)
 
Wär das nicht evtl. etwas für die CodeLib?

Delphi-Freak 7. Apr 2006 20:07

Re: DrawShadowText in Delphi (commctrl.h/ComCtl32.dll)
 
Stimmt... eigentlich schon, fragt sich nur, mit oder ohne möglicherweise unnötiges schwarz-Workaround :gruebel:
Könnte wer anderer das vlt. auch noch testen, obs bei ihm mit schwarzer (wirklich $00000000) Schriftfarbe geht?

LG, ich

turboPASCAL 15. Apr 2006 18:52

Re: DrawShadowText in Delphi (commctrl.h/ComCtl32.dll)
 
Hi, ich nochmal... :stupid:

Ich verschlimmbessere gerade experimentell das Aussehen eines Programms mit MSDN-Library durchsuchenDrawShadowText.

Jetzt hänge ich wieder an der selben Stelle wie schon einmal, kann mir jemand bitte mal sagen was der Parameter dwFlags anstellt ?

Code:
int DrawShadowText(     
    HDC hdc,
    LPCWSTR pszText,
    UINT cch,
    const RECT *pRect,
    [b]DWORD dwFlags,[/b]
    COLORREF crText,
    COLORREF crShadow,
    int ixOffset,
    int iyOffset
);
Zitat:

Zitat von MDSN Home
dwFlags
DWORD that specifies how the text is to be drawn.

Aha !? :gruebel:

Delphi-Freak 15. Apr 2006 19:03

Re: DrawShadowText in Delphi (commctrl.h/ComCtl32.dll)
 
Hat das vlt. mit links- bzw. rechtsbündig etc. zu tun - das was bei TextOut der Parameter uFormat macht, die Typen passen zusammen (DWORD bzw. UINT)...

LG, ich

turboPASCAL 15. Apr 2006 19:42

Re: DrawShadowText in Delphi (commctrl.h/ComCtl32.dll)
 
Ja natürlich, da ich das Ausgaberechteck immer angepasst habe ist mir das nicht aufgefallen...
Also TA_BOTTOM, TA_TOP, TA_CENTER, TA_LEFT, und TA_RIGHT (etc.) funktionieren.

:roteyes:

Delphi-Freak 15. Apr 2006 19:47

Re: DrawShadowText in Delphi (commctrl.h/ComCtl32.dll)
 
Was ist es dann eigentlich für vertikales Zentrieren (TA_VCENTER dürfte er nicht kennen...)

LG, ich

turboPASCAL 15. Apr 2006 19:51

Re: DrawShadowText in Delphi (commctrl.h/ComCtl32.dll)
 
:gruebel: Also TA_CENTER und VTA_CENTER wollen nicht so...

// Edit:

Ne, also die Parameter sind wohl doch etwas anders, für dwFlags eingesetzte Werte von 0 .. 2
sind:

0: normal (rechts oben)
1: center text oben
2: links oben


Die Parameter von MSDN-Library durchsuchenDrawText passen anscheinend besser. ;)

MagicAndre1981 15. Apr 2006 19:59

Re: DrawShadowText in Delphi (commctrl.h/ComCtl32.dll)
 
wo hast du die Werte her? Im PSDK hab ich nix dazu gefunden.

Delphi-Freak 15. Apr 2006 20:05

Re: DrawShadowText in Delphi (commctrl.h/ComCtl32.dll)
 
Oder sind das gleich die Werte von DrawText mit DT_ (DT_LEFT, DT_CENTER, DT_RIGHT AND DT_TOP, DT_VCENTER, DT_BOTTOM)?

LG, ich

turboPASCAL 15. Apr 2006 20:11

Re: DrawShadowText in Delphi (commctrl.h/ComCtl32.dll)
 
Guckt mal Post #21. :mrgreen:

Und kein roter Kasten nicht ... :gruebel:

Delphi-Freak 15. Apr 2006 20:40

Re: DrawShadowText in Delphi (commctrl.h/ComCtl32.dll)
 
Nein, irgendwie kein roter Kasten :gruebel: (ich glaube dazu kann man nicht zu blöd sein, oder doch :mrgreen: )
Aber danke, jedenfalls...

LG, ich

turboPASCAL 29. Apr 2006 08:53

Re: DrawShadowText in Delphi (commctrl.h/ComCtl32.dll)
 
So, ich habe noch ein wenig an einer Unit gebastelt um die Funktion DrawShadowText ein
wenig Kompatibler / komfortabler zu machen.

Ich bitte mal darum die Unit zu testen und wer Vorschläge oder Verbesserungen hat, her damit.

Um die Funktion DrawShadowText zu nutzen ist Windows XP oder höher erforderlich,
weiterhin ist es notwendig das Windows XP Manifest mit in das Delphiprojekt einzubinden.
An sonnten gibt es nur einen Ersatzschatten. ;)

Delphi-Quellcode:
{
  Unit ShadowText by Matthias G. aka turboPASCAL (tP)
  Version 1.0

  Diese Unit stellt die Funktion DrawShadowText aus der ComCtl32.dll
  zur Verfügung.

  Bei Windowsversionen unter XP oder ohne Windows XP Manifest wird eine
  Ersatzfunktion zum Darstellen des Schattens verwendet.
}

unit ShadowText;

interface

uses
  Windows, SysUtils, Graphics;

  var
    UseLQShadow : Boolean = True; // legt fest ob der alternative Schatten
                                  // verwendet werden soll wenn die Funktion
                                  // aus der ComCtl32.dll nicht zur Verfügung
                                  // steht

  // Ausgabe eines Textes mit Schatten über angabe von X und Y - Koordinaten
  function DrawShadowText(ACanvas: TCanvas; x, y: Integer; AText: string;
    TextColor, ShadowColor: TColor; ShadowSpaceX, ShadowSpaceY: Integer): Integer;

  // Ausgabe eines Textes mit Schatten über eine TRect- Struktur mit
  // angabe der Textformatierung (Textflags siehe Delphi-Hilfe "DrawText")
  function DrawShadowTextR(ACanvas: TCanvas; TextRect: TRect; x, y: Integer;
    AText: string; TextColor, ShadowColor: TColor;
    ShadowSpaceX, ShadowSpaceY: Integer; TextFlags: DWord): Integer;

implementation

type
  TDrawShadowTextI = function(hdc: HDC;
    pszText: LPCWSTR;
    cch: UINT;
    const pRect: PRect;
    dwFlags: DWORD;
    crText: COLORREF;
    crShadow: COLORREF;
    ixOffset: Integer;
    iyOffset: Integer): Integer; stdcall;

var
  hComCtl32DLL: THandle = 0;
  DrawShadowTextI: TDrawShadowTextI;
  OldCanvasColor: TColor;
  OldBkModeColor: Integer;

(*
// DrawShadowText aus der ComCtl32.dll ( erfordert das WindowsXP-Manifest! )
//////////////////////////////////////////////////////////////////////////////

function DrawShadowText_(hdc: HDC; pszText: LPCWSTR; cch: UINT;
   const pRect: PRect; dwFlags: DWORD; crText: COLORREF;
   crShadow: COLORREF; ixOffset: Integer;
   iyOffset: Integer): Integer; stdcall; external 'ComCtl32.dll' name 'DrawShadowText';
*)


// IsWindowsXPAndUp ermittelt ob eine Windowsversion ab WinXP vorhanden ist
// Verwendung intern der Unit
//////////////////////////////////////////////////////////////////////////////

function IsWindowsXPAndUp: Boolean;
begin
  Result := ((Win32MajorVersion = 5) and (Win32MinorVersion >= 1)) or (Win32MajorVersion > 5);
end;


// Rect - Die Funktion Rect erstellt aus Koordinaten eine TRect-Struktur
// Verwendung intern der Unit - no Unit Classes used
//////////////////////////////////////////////////////////////////////////////

function Rect(ALeft, ATop, ARight, ABottom: Integer): TRect;
begin
  With Result do
  begin
    Left  := ALeft;
    Top   := ATop;
    Right := ARight;
    Bottom := ABottom;
  end;
end;

// DrawShadowTextL (L - Low Quality)
// Verwendung intern der Unit
//////////////////////////////////////////////////////////////////////////////

function DrawShadowTextL(ACanvas: TCanvas; TextRect: TRect; AText: string;
  TextColor, ShadowColor: TColor; ShadowSpaceX,
  ShadowSpaceY: Integer; TextFlags: DWORD): Integer;
begin
  OldBkModeColor := SetBKMode(ACanvas.Handle, TRANSPARENT);
  OldCanvasColor := ACanvas.Font.Color;

  if UseLQShadow then
  begin
    inc(TextRect.Left, ShadowSpaceX);
    inc(TextRect.Top, ShadowSpaceY);
    inc(TextRect.Right, ShadowSpaceX);
    inc(TextRect.Bottom, ShadowSpaceY);

    ACanvas.Font.Color := ShadowColor;

    Result :=
      DrawText(ACanvas.Handle, PChar(AText), length(AText), TextRect, TextFlags);

    dec(TextRect.Left, ShadowSpaceX);
    dec(TextRect.Top, ShadowSpaceY);
    dec(TextRect.Right, ShadowSpaceX);
    dec(TextRect.Bottom, ShadowSpaceY);
  end else
    Result := 1;

  ACanvas.Font.Color := TextColor;

  Result := Result and
    DrawText(ACanvas.Handle, PChar(AText), length(AText), TextRect, TextFlags);

  ACanvas.Font.Color := OldCanvasColor;
  SetBKMode(ACanvas.Handle, OldBkModeColor);
end;

// DrawShadowText: für einfache Ausgabe
// Verwendung: export aus Unit
//////////////////////////////////////////////////////////////////////////////

function DrawShadowText(ACanvas: TCanvas; x, y: Integer; AText: string;
  TextColor, ShadowColor: TColor; ShadowSpaceX, ShadowSpaceY: Integer): Integer;
var TextRect: TRect;
begin
  TextRect := RECT(x, y, x + ACanvas.TextWidth(AText),
    y + ACanvas.TextHeight(AText));

  if @DrawShadowTextI <> nil then
  begin
    Result := DrawShadowTextI(ACanvas.Handle, PWideChar(WideString(AText)),
      length(AText), @TextRect, 0,
      COLORREF(TextColor), COLORREF(ShadowColor),
      ShadowSpaceX, ShadowSpaceY);
  end else
  begin
    Result := DrawShadowTextL(ACanvas, TextRect, AText,
      TextColor, ShadowColor, ShadowSpaceX, ShadowSpaceY, 0);
  end;
end;

// DrawShadowTextR: für formatierte Ausgabe (R - Text[R]ect)
// Verwendung: export aus Unit
//////////////////////////////////////////////////////////////////////////////

function DrawShadowTextR(ACanvas: TCanvas; TextRect: TRect; x, y: Integer;
  AText: string; TextColor, ShadowColor: TColor;
  ShadowSpaceX, ShadowSpaceY: Integer; TextFlags: DWord): Integer;
begin
  if @DrawShadowTextI <> nil then
  begin
    Result := DrawShadowTextI(ACanvas.Handle, PWideChar(WideString(AText)),
      length(AText), @TextRect, TextFlags,
      COLORREF(TextColor), COLORREF(ShadowColor),
      ShadowSpaceX, ShadowSpaceY);
  end else
  begin
    Result := DrawShadowTextL(ACanvas, TextRect, AText,
      TextColor, ShadowColor, ShadowSpaceX, ShadowSpaceY, TextFlags);
  end;
end;


// Initialization der Unit
//////////////////////////////////////////////////////////////////////////////
initialization
  if IsWindowsXPAndUp then
  begin
    hComCtl32DLL := LoadLibrary('ComCtl32.dll');
    @DrawShadowTextI := GetProcAddress(hComCtl32DLL, 'DrawShadowText');
  end;

// Finalization der Unit
//////////////////////////////////////////////////////////////////////////////
finalization
  if hComCtl32DLL <> 0 then FreeLibrary(hComCtl32DLL);

end.

turboPASCAL 7. Mai 2006 12:36

Re: DrawShadowText in Delphi (commctrl.h/ComCtl32.dll)
 
So, und damit man die Funktion auch ohne die VCL nutzen kann hab ich schnell noch eine
nonVLC - Version geschrieben. ( für die Tippfaulen ;) )

Delphi-Quellcode:
{
  Unit ShadowTextN by Matthias G. aka turboPASCAL (tP)
  Version 1.0 (nonVCL)

  Diese Unit stellt die Funktion DrawShadowText aus der ComCtl32.dll
  zur Verfügung.

  Bei Windowsversionen unter XP oder ohne Windows XP Manifest wird eine
  Ersatzfunktion zum Darstellen des Schattens verwendet.
}

unit ShadowTextN;

interface

uses
  Windows;

  var
    UseLQShadow : Boolean = TRUE; // legt fest ob der alternative Schatten
                                  // verwendet werden soll wenn die Funktion
                                  // aus der ComCtl32.dll nicht zur Verfügung
                                  // steht

  // Ausgabe eines Textes mit Schatten über angabe von X und Y - Koordinaten
  function DrawShadowText(DC: HDC; x, y: Integer; AText: string;
    TextColor, ShadowColor: COLORREF; ShadowSpaceX, ShadowSpaceY: Integer): Integer;

  // Ausgabe eines Textes mit Schatten über eine TRect- Struktur mit
  // angabe der Textformatierung (Textflags siehe Delphi-Hilfe "DrawText")
  function DrawShadowTextR(DC: HDC; TextRect: TRect; x, y: Integer;
    AText: string; TextColor, ShadowColor: COLORREF;
    ShadowSpaceX, ShadowSpaceY: Integer; TextFlags: DWord): Integer;

implementation

type
  TDrawShadowTextI = function(HDC: HDC;
    pszText: LPCWSTR;
    cch: UINT;
    const pRect: PRect;
    dwFlags: DWORD;
    crText: COLORREF;
    crShadow: COLORREF;
    ixOffset: Integer;
    iyOffset: Integer): Integer; stdcall;

var
  hComCtl32DLL: THandle = 0;
  DrawShadowTextI: TDrawShadowTextI;

(*
// Declaration der Funktion DrawShadowText aus der ComCtl32.dll
// ( erfordert das WindowsXP-Manifest! )
//////////////////////////////////////////////////////////////////////////////

function DrawShadowText_(HDC: HDC; pszText: LPCWSTR; cch: UINT;
   const pRect: PRect; dwFlags: DWORD; crText: COLORREF;
   crShadow: COLORREF; ixOffset: Integer;
   iyOffset: Integer): Integer; stdcall; external 'ComCtl32.dll' name 'DrawShadowText';
*)


// IsWindowsXPAndUp ermittelt ob eine Windowsversion ab WinXP vorhanden ist
// Verwendung intern der Unit
//////////////////////////////////////////////////////////////////////////////

function IsWindowsXPAndUp: Boolean;
var
  dwWindowsMajorVersion,
  dwWindowsMinorVersion,
  dwVersion: DWORD;
begin
  dwVersion := GetVersion;
  dwWindowsMajorVersion := LOBYTE(LOWORD(dwVersion));
  dwWindowsMinorVersion := HIBYTE(LOWORD(dwVersion));

  Result := ((dwWindowsMajorVersion = 5) and
             (dwWindowsMinorVersion >= 1)) or (dwWindowsMajorVersion > 5);
end;


// Rect - Die Funktion Rect erstellt aus Koordinaten eine TRect-Struktur
// Verwendung intern der Unit - no Unit Classes used
//////////////////////////////////////////////////////////////////////////////

function Rect(ALeft, ATop, ARight, ABottom: Integer): TRect;
begin
  With Result do
  begin
    Left  := ALeft;
    Top   := ATop;
    Right := ARight;
    Bottom := ABottom;
  end;
end;

// DrawShadowTextL (L - Low Quality)
// Verwendung intern der Unit
//////////////////////////////////////////////////////////////////////////////

function DrawShadowTextL(DC: HDC; TextRect: TRect; AText: string;
  TextColor, ShadowColor: longint; ShadowSpaceX,
  ShadowSpaceY: Integer; TextFlags: DWORD): Integer;
var
  OldTextColor: COLORREF;
  OldBkMode: Integer;
begin
  OldBkMode   := SetBKMode(DC, TRANSPARENT);
  OldTextColor := GetTextColor(DC);

  if UseLQShadow then
  begin
    inc(TextRect.Left, ShadowSpaceX);
    inc(TextRect.Top, ShadowSpaceY);
    inc(TextRect.Right, ShadowSpaceX);
    inc(TextRect.Bottom, ShadowSpaceY);

    SetTextColor(DC, ShadowColor);

    Result :=
      DrawText(DC, PChar(AText), length(AText), TextRect, TextFlags);

    dec(TextRect.Left, ShadowSpaceX);
    dec(TextRect.Top, ShadowSpaceY);
    dec(TextRect.Right, ShadowSpaceX);
    dec(TextRect.Bottom, ShadowSpaceY);
  end else
    Result := 1;

  SetTextColor(DC, TextColor);

  Result := Result and
    DrawText(DC, PChar(AText), length(AText), TextRect, TextFlags);

  SetBKMode(DC, OldBkMode);
  SetTextColor(DC, OldTextColor);
end;

// DrawShadowText: für einfache Ausgabe
// Verwendung: export aus Unit
//////////////////////////////////////////////////////////////////////////////

function DrawShadowText(DC: HDC; x, y: Integer; AText: string;
  TextColor, ShadowColor: COLORREF; ShadowSpaceX, ShadowSpaceY: Integer): Integer;
var
  TextSize: TSize;
  TextRect: TRect;
begin
  GetTextExtentPoint(DC, PChar(AText), Length(AText), TextSize);
  TextRect := RECT(x, y, x + TextSize.cx, y + TextSize.cy);

  // TextColor-Bug umgehen
  if TextColor = $00000000 then TextColor := $00010101;

  if @DrawShadowTextI <> nil then
  begin
    Result := DrawShadowTextI(DC, PWideChar(WideString(AText)),
      length(AText), @TextRect, 0,
      TextColor, ShadowColor,
      ShadowSpaceX, ShadowSpaceY);
  end else
  begin
    Result := DrawShadowTextL(DC, TextRect, AText,
      TextColor, ShadowColor, ShadowSpaceX, ShadowSpaceY, 0);
  end;
end;

// DrawShadowTextR: für formatierte Ausgabe (R - Text[R]ect)
// Verwendung: export aus Unit
//////////////////////////////////////////////////////////////////////////////

function DrawShadowTextR(DC: HDC; TextRect: TRect; x, y: Integer;
  AText: string; TextColor, ShadowColor: COLORREF;
  ShadowSpaceX, ShadowSpaceY: Integer; TextFlags: DWord): Integer;
begin
  // TextColor-Bug umgehen
  if TextColor = $00000000 then TextColor := $00010101;

  if @DrawShadowTextI <> nil then
  begin
    Result := DrawShadowTextI(DC, PWideChar(WideString(AText)),
      length(AText), @TextRect, TextFlags,
      TextColor, ShadowColor,
      ShadowSpaceX, ShadowSpaceY);
  end else
  begin
    Result := DrawShadowTextL(DC, TextRect, AText,
      TextColor, ShadowColor, ShadowSpaceX, ShadowSpaceY, TextFlags);
  end;
end;

// Initialization der Unit
//////////////////////////////////////////////////////////////////////////////
initialization
  if IsWindowsXPAndUp then
  begin
    hComCtl32DLL := LoadLibrary('ComCtl32.dll');
    @DrawShadowTextI := GetProcAddress(hComCtl32DLL, 'DrawShadowText');
  end;

// Finalization der Unit
//////////////////////////////////////////////////////////////////////////////
finalization
  if hComCtl32DLL <> 0 then FreeLibrary(hComCtl32DLL);

end. // End of Unit ShadowTextN


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:14 Uhr.

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