Ich versuche dies: Is it possible to Alpha Blend a VCL control on a TForm für ziehen & Drop ein Panel mit Steuerelementen drin. this answer von @TOndrej funktioniert gut, außer dass die Kontrollen wie TEdit
oder TMemo
mit der Standard-Nicht-themed Grenze gemalt werden.TWinControl.PaintTo funktioniert nicht gut für themenbezogene Steuerelemente mit Rahmen in D7
Das Ergebnis:
Mein Code:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, XPMan;
type
TPanel = class(ExtCtrls.TPanel)
protected
function GetDragImages: TDragImageList; override;
end;
TForm1 = class(TForm)
XPManifest1: TXPManifest;
Panel1: TPanel;
Edit1: TEdit;
Button1: TButton;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure Panel1StartDrag(Sender: TObject;
var DragObject: TDragObject);
private
FDragImages: TDragImageList;
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function TPanel.GetDragImages: TDragImageList;
begin
Result := (Owner as TForm1).FDragImages;
end;
type
TControlProc = procedure(Control: TControl);
procedure IterateControls(Control: TControl; Proc: TControlProc);
var
I: Integer;
begin
if Assigned(Control) then
Proc(Control);
if Control is TWinControl then
for I := 0 to TWinControl(Control).ControlCount - 1 do
IterateControls(TWinControl(Control).Controls[I], Proc);
end;
procedure DisplayDragImage(Control: TControl);
begin
Control.ControlStyle := Control.ControlStyle + [csDisplayDragImage];
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FDragImages := nil;
// set display drag image style
IterateControls(Self, DisplayDragImage);
end;
procedure TForm1.Panel1StartDrag(Sender: TObject;
var DragObject: TDragObject);
var
Image: TBitmap;
begin
if not (Sender is TPanel) then
Exit;
Image := TBitmap.Create;
try
Image.PixelFormat := pf32bit;
Image.Width := TControl(Sender).Width;
Image.Height := TControl(Sender).Height;
Image.Canvas.Lock; // must lock the canvas!
TPanel(Sender).PaintTo(Image.Canvas, 0, 0);
Image.Canvas.Unlock;
FDragImages := TDragImageList.Create(nil);
FDragImages.Width := Image.Width;
FDragImages.Height := Image.Height;
FDragImages.SetDragImage(FDragImages.Add(Image, nil), 0, 0);
FDragImages.ShowDragImage;
except
Image.Free;
FreeAndNil(FDragImages);
raise;
end;
end;
end.
Ich sah in TWinControl.PaintTo
aber ich weiß nicht, was es Arbeit zu tun zu machen. Ich weiß, es funktioniert für neuere Versionen, weil klar das Bild in der Antwort themed Grenze für die Edit1
Steuerelement erstellt, die in die Bitmap gemalt wurde.
Was kann ich dieses Problem beheben?