На счет висты. Оказалось, что сделать дырку в форме не так уж и просто даже в D2007/2009. У меня получилось приблизительно так:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Buttons, uxtheme, dwmapi;
type
TForm1 = class(TForm)
SpeedButton1: TSpeedButton;
procedure FormCreate(Sender: TObject);
private
procedure wmpaint(var m:TWMPaint); message wm_paint;
protected
procedure PaintWindow(DC: HDC); override;
public
end;
var
Form1: TForm1;
implementation
procedure TForm1.FormCreate(Sender: TObject);
var
bb: TDWMBlurBehind;
begin
if DwmCompositionEnabled then
begin
bb.dwFlags := DWM_BB_ENABLE or DWM_BB_BLURREGION;
bb.fEnable := True;
bb.hRgnBlur := CreateRectRgn(0, 0, -1, -1);
DwmEnableBlurBehindWindow(Handle, bb);
DeleteObject(bb.hRgnBlur);
end;
end;
procedure TForm1.PaintWindow(DC: HDC);
begin
if not DwmCompositionEnabled then
inherited;
end;
procedure TForm1.wmpaint(var m: TWMPaint);
var
DC, MemDC: HDC;
PaintBuffer: HPAINTBUFFER;
PS: TPaintStruct;
procedure drawrect(c:Tcolor; r:Trect);
var
SaveIndex: Integer;
begin
Canvas.Lock;
try
Canvas.Handle := m.DC;
try
SaveIndex := SaveDC(m.DC);
try
canvas.Brush.Color:=c;
canvas.FillRect(r);
finally
RestoreDC(m.DC, SaveIndex);
end;
finally
Canvas.Handle := 0;
end;
finally
Canvas.Unlock;
end;
end;
begin
if DwmCompositionEnabled then
begin
DC := BeginPaint(Handle, PS);
try
PaintBuffer := BeginBufferedPaint(DC, PS.rcPaint, BPBF_COMPOSITED, nil, MemDC);
if PaintBuffer <> 0 then
try
m.DC:=memdc;
drawrect(color, clientrect);
inherited;
BufferedPaintMakeOpaque(PaintBuffer, PS.rcPaint);
drawrect(clblack, rect(10, 10, 50, 50));
finally
EndBufferedPaint(PaintBuffer, True);
end;
finally
EndPaint(Handle, PS);
end;
end
else
inherited;
end;
end. |