2017-03-22 2 views
2

Diese Frage ist sehr einfach aussieht, mit VCL dies funktioniert gut (Bild ist TImage auf VCL):Zeichnung auf FMX Leinwand mit WinApi Funktionen

procedure TFormMain.btnDrawBackgroundClick(Sender: TObject); 
var 
    theme: HTHEME; 
begin 
    theme := OpenThemeData(0, 'TASKDIALOG'); 
    if theme <> 0 then 
    try 
    DrawThemeBackground(theme, 
         Image.Canvas.Handle, 
         TDLG_SECONDARYPANEL, 
         0, 
         Image.ClientRect, 
         nil); 
    finally 
    CloseThemeData(theme); 
    end; 
end; 

Frage: was sollte ich den gleichen Effekt mit FMX erhalten ändern (unter Windows)

Antwort

3

Basierend auf this answer können Sie das einfach nicht tun.

Das Problem ist, dass mit Firemonkey, Sie haben nur einen einzigen Gerät Kontext für die Form und nicht einen für jede Komponente. Wenn eine Komponente neu gezeichnet werden muss, wird sie an die Forms-Zeichenfläche übergeben, aber mit dem Ausschnitt und den Koordinaten, die dem Standort der Komponente zugeordnet sind.

Aber es gibt immer ein Workaround und Sie können so etwas versuchen.

procedure TFormMain.btnDrawBackgroundClick(Sender: TObject); 
var 
    theme: HTHEME; 
    stream: TMemoryStream; 
    bitmap: Vcl.Graphics.TBitmap; 
begin 
    theme := OpenThemeData(0, 'TASKDIALOG'); 
    if theme <> 0 then 
    try 
    bitmap := Vcl.Graphics.TBitmap.Create; 
    try 
     bitmap.Width := Round(Image.Width); 
     bitmap.Height := Round(Image.Height); 
     DrawThemeBackground(theme, bitmap.Canvas.Handle, TDLG_SECONDARYPANEL, 0, 
          Rect(0, 0, bitmap.Width, bitmap.Height), nil); 
     stream := TMemoryStream.Create; 
     try 
     bitmap.SaveToStream(stream); 
     Image.Bitmap.LoadFromStream(stream); 
     finally 
     stream.Free; 
     end; 
    finally 
     Bitmap.Free; 
    end; 
    finally 
    CloseThemeData(theme); 
    end; 
end; 
+0

Diese Werke, danke –

+1

Und das ist Hilfe von mir, diese Frage zu lösen: http://stackoverflow.com/questions/42928717/colors-of-the-tdialogservice-messagedialog –

+0

Warum diese Antwort wird mit VCLs TBitmap, wenn die Frage stattdessen von FireMonkey gestellt wird? VCL und FMX sind nicht dazu gedacht, miteinander gemischt zu werden. Die 'TBitmap' von FMX hat keine' HDC', auf die Sie mit der Win32-API zurückgreifen können. Allerdings hat FMX 'TImage' ein 'OnPaint'-Event, und Sie können die' HDC' des Forms nutzen, um darauf zu zeichnen. Oder zeichnen Sie zuerst ein Win32 'HBITMAP' und dann ein FMX' Canvas' in den entsprechenden Nachkomme ein, um auf das zugrundeliegende GDI +/Direct2D Objekt zuzugreifen und zeichnen Sie dann 'HBITMAP' darauf. –