AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Header Übersetzung (von C++ nach Delphi)
Thema durchsuchen
Ansicht
Themen-Optionen

Header Übersetzung (von C++ nach Delphi)

Ein Thema von Prototypjack · begonnen am 28. Jan 2008 · letzter Beitrag vom 1. Feb 2008
Antwort Antwort
Prototypjack

Registriert seit: 2. Feb 2003
611 Beiträge
 
Delphi 2009 Professional
 
#1

Header Übersetzung (von C++ nach Delphi)

  Alt 28. Jan 2008, 14:20
Moin,

Ich arbeite ja, wie jemand vielleicht aus dem OpenDialog-Thread weiß, an einer Möglichkeit, das Arbeiten mit dem BDS 2006 unter Vista zu optimieren.

Ich habe mittlerweile die Möglichkeit eine Form Glass-mäßig darzustellen und das funktioniert auch soweit, nur habe ich das Problem, dass alle Controls die über diesem Bereich sind in ihren schwarzen Elementen (Schrift, zb.) ebenfalls aus Glass bestehen. Daniel zeigt in seinen Videos, dass man nur DoubleBuffered auf True setzen muss, nur scheint das unter Delphi 2006 nicht zu funktionieren, also machte ich mich auf die Suche (in C++, denn in Delphi existiert sehr wenig zu dem Thema). Ich fand 2 Möglichkeiten, die erste hat mit Layered Windows zu tun und die zweite mit einem Offscreen Bitmap. Also gut, das zweite hört sich ja schon schwer nach DoubleBuffered an und Layered Windows sind für diesen Zweck imho ein wenig übertrieben.

Ich bin mittlerweile (auch auf Basis eines C++ Codes) so weit (der folgende Code wird per Hook auf die Zeichenroutine des Button1 aufgerufen):

Delphi-Quellcode:
var
  DC, MemDC: HDC;
  PS: TPaintStruct;
  PaintBuffer: HPAINTBUFFER;
begin
  if (Message.Msg = WM_PAINT) then
  begin
    DC := BeginPaint(Button1.Handle, PS);
    try
      PaintBuffer := BeginBufferedPaint(DC, PS.rcPaint, BPBF_COMPOSITED, nil, MemDC);
      Perform(WM_ERASEBKGND, MemDC, MemDC);
      Perform(WM_PRINTCLIENT, MemDC, PRF_CLIENT);
      BufferedPaintMakeOpaque(PaintBuffer, @PS.rcPaint);
      EndBufferedPaint(PaintBuffer, True);
    finally
      EndPaint(Button1.Handle, PS);
    end;
  end;
end;
Also gut, das sollte irgendwie funktionieren, aber ich brauche ja noch die korrekten Header für die Funktionen, und die (und ich denke dort hapert es) habe ich so realisiert:

Delphi-Quellcode:
  HPAINTBUFFER = LongWord;

  BP_BUFFERFORMAT = (BPBF_COMPATIBLEBITMAP, BPBF_DIB, BPBF_TOPDOWNDIB,
    BPBF_TOPDOWNMONODIB);

  BP_PAINTPARAMS = packed record
    cbSize: DWORD;
    dwFlags: DWORD;
    prcExclude: PRect;
    pBlendFunction: PBLENDFUNCTION;
  end;

  TBeginBufferedPaint = function(hdcTarget: HDC; const prcTarget: TRECT;
    dwFormat: BP_BufferFORMAT; pPaintParams: Pointer; phdc: HDC): HPAINTBUFFER; stdcall;

  TBufferedPaintMakeOpaque = procedure(fParam: HPAINTBUFFER; sParam: PRECT); stdcall;

  TEndBufferedPaint = function(hBufferedPaint: HPAINTBUFFER; fUpdateTarget: Boolean): HRESULT; stdcall;
Die Funktionen bekomme ich so (in der Form-Create Routine):

Delphi-Quellcode:
  huxTheme := LoadLibrary('uxtheme.dll');
  if huxTheme <> 0 then
  begin
    BeginBufferedPaint := GetProcAddress(huxTheme, 'BeginBufferedPaint');
    BufferedPaintMakeOpaque := GetProcAddress(huxTheme, 'BufferedPaintMakeOpaque');
    EndBufferedPaint := GetProcAddress(huxTheme, 'EndBufferedPaint');
  end;
Ich bekomme irgendwann (leider sagt mir der Debugger nicht wann und Breakpoints nutzen irgendwie auch nicht wirklich was) eine Acess Violation. Jetzt ergeben sich folgende Fragen:
  • Ist die Übersetzung der Funktionen überhaupt korrekt (Ich hatte keine *.h Datei, sondern habe mich aus dem MSDN bedient, bei dem 1. der Modus BP_BUFFERFORMAT - BPBF_COMPOSITED nicht existiert und 2. eben so wenig die komplette Beschreibung der BufferedPaintMakeOpaque Funktion (ich habe da einfach geraten -.-))
  • Kann es Probleme geben, wenn ich die uxTheme.dll zwei Mal im Programm geladen habe (Ich denke Delphi lädt sie von selbst schon einmal, wegen der Themes, oder?)?
  • Kann es sein, das ich beim Laden oder in der gehookten WindowProc (siehe Oben) etwas versemmelt habe?
  • Kann das überhaupt so funktionieren?

Danke schonmal!

Grüße,
ein, etwas verwirrter , Max
Max
„If you have any great suggestions, feel free to mail me, and I'll probably feel free to ignore you.“ . Linus Torvalds
  Mit Zitat antworten Zitat
Prototypjack

Registriert seit: 2. Feb 2003
611 Beiträge
 
Delphi 2009 Professional
 
#2

Re: Header Übersetzung (von C++ nach Delphi)

  Alt 1. Feb 2008, 14:08
Moin,

Der Vollständigkeit halber gebe ich mir jetzt mal selbst die Antwort(en).

Zitat von Prototypjack:
Ich bekomme irgendwann (leider sagt mir der Debugger nicht wann und Breakpoints nutzen irgendwie auch nicht wirklich was) eine Acess Violation. Jetzt ergeben sich folgende Fragen:
  • Ist die Übersetzung der Funktionen überhaupt korrekt (Ich hatte keine *.h Datei, sondern habe mich aus dem MSDN bedient, bei dem 1. der Modus BP_BUFFERFORMAT - BPBF_COMPOSITED nicht existiert und 2. eben so wenig die komplette Beschreibung der BufferedPaintMakeOpaque Funktion (ich habe da einfach geraten -.-))
  • Kann es Probleme geben, wenn ich die uxTheme.dll zwei Mal im Programm geladen habe (Ich denke Delphi lädt sie von selbst schon einmal, wegen der Themes, oder?)?
  • Kann es sein, das ich beim Laden oder in der gehookten WindowProc (siehe Oben) etwas versemmelt habe?
  • Kann das überhaupt so funktionieren?
  • Ist die Übersetzung der Funktionen überhaupt korrekt? - Fast, siehe unten.
  • Kann es Probleme geben, wenn ich die uxTheme.dll zwei Mal im Programm geladen habe? - Scheinbar nicht.
  • Kann es sein, das ich beim Laden oder in der gehookten WindowProc (siehe Oben) etwas versemmelt habe? - Ein wenig, siehe unten.
  • Kann das überhaupt so funktionieren? - Ja.

Folgende Änderungen sind dem obigen Code hinzuzufügen:

Delphi-Quellcode:
      Button1.Perform(WM_ERASEBKGND, MemDC, MemDC);
      Button1.Perform(WM_PRINTCLIENT, MemDC, PRF_CLIENT);
Delphi-Quellcode:
  HPAINTBUFFER = THandle; // Irgendwie "richtiger"
  TBeginBufferedPaint = function(hdcTarget: HDC; const prcTarget: TRECT;
    dwFormat: BP_BufferFORMAT; pPaintParams: Pointer; out phdc: HDC): HPAINTBUFFER; stdcall; // Blöder Fehler.. Wegen "out".
Dann sollte es funktionieren. Achja, BufferedPaintMakeOpaque ist gleichbedeutend mit BufferedPaintSetTransparent (nur mit dem Startvalue 255 bei Alpha). Also stattdessen diese Methode benutzen, dabei spart man sich etwas Arbeit.

Grüße,
Max
Max
„If you have any great suggestions, feel free to mail me, and I'll probably feel free to ignore you.“ . Linus Torvalds
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:27 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