同事演示了一個.NET的的PNG異形視窗.挺漂亮.於是也想用Delphi顯擺一個. 關於Delphi用PNG做異形視窗的資料有不少.都是用GDIPlus或者TPNGImage組件載入PNG圖像做的. 好在Delphi包裝了微軟的IWICImagingFactory介面,這樣處理PNG的工作就交給操作
同事演示了一個.NET的的PNG異形視窗.挺漂亮.於是也想用Delphi顯擺一個.
關於Delphi用PNG做異形視窗的資料有不少.都是用GDIPlus或者TPNGImage組件載入PNG圖像做的.
好在Delphi包裝了微軟的IWICImagingFactory介面,這樣處理PNG的工作就交給操作系統去做了.
函數很簡單一共就幾行,關鍵就是UpdateLayeredWindow.
用Delphi2010提供的IWICImagingFactory介面的包裝了,這次PNG的處理交給微軟的操作系統了,一點問題也沒有.其他版本的Delphi只要能對IWICImagingFactory進行包裝,也一樣能處理.但還是Delphi2010最方便.什麼控制項也不用,多餘的東西都不要.
代碼如下,很簡單吧:)
unit YXForm;
interface
uses
Windows, Forms, Classes, Graphics;
//從文件載入PNG
procedure YXFromFile(AForm : TForm; AFileName : String);
//從資源載入PNG
procedure YXFromResource(AForm : TForm; ResName : String; ResType : PWideChar; Instance : HINST = 0);
//從圖像對象載入
procedure YXFromGraphic(AForm : TForm; AGraphic : TGraphic);
implementation
procedure YXFromFile(AForm : TForm; AFileName : String);
var
wic : TWICImage;
begin
wic := TWICImage.Create;
wic.LoadFromFile(AFileName);
YXFromGraphic(AForm, wic);
wic.Free;
end;
procedure YXFromResource(AForm : TForm; ResName : String;ResType : PWideChar; Instance : HINST);
var
wic : TWICImage;
r : TResourceStream;
begin
if Instance = 0 then
Instance := HInstance;
r := TResourceStream.Create(Instance, ResName, ResType);
wic := TWICImage.Create;
wic.LoadFromStream(r);
YXFromGraphic(AForm, wic);
wic.Free;
r.Free;
end;
procedure YXFromGraphic(AForm : TForm; AGraphic : TGraphic);
var
ptDst, ptSrc: TPoint;
Size: TSize;
BlendFunction: TBlendFunction;
bmp : TBitmap;
begin
bmp := TBitmap.Create;
bmp.Assign(AGraphic);
ptDst := Point(AForm.Left, AForm.Top);
ptSrc := Point(0, 0);
Size.cx := AGraphic.Width;
Size.cy := AGraphic.Height;
BlendFunction.BlendOp := AC_SRC_OVER;
BlendFunction.BlendFlags := 0;
BlendFunction.SourceConstantAlpha := $FF; // 透明度
BlendFunction.AlphaFormat := AC_SRC_ALPHA;
SetWindowLong(AForm.Handle, GWL_EXSTYLE, GetWindowLong(AForm.Handle,GWL_EXSTYLE) or WS_EX_LAYERED);
UpdateLayeredWindow(AForm.Handle,
AForm.Canvas.Handle,
@ptDst,
@Size,
bmp.Canvas.Handle,
@ptSrc,
0,
@BlendFunction,
ULW_ALPHA);
bmp.Free();
end;
end.
想要用的時候很簡單,舉個例子:
ff:=TForm2.Create(Self);//這裡的form2指新建的視窗,請酌情修改。
YXFromFile(ff, 'c:/a.png');
ff.Show;
實現動畫也很容易.只要不停地YXFromFile(ff, 'c:/a.png');調用一套動作PNG就可以了.
效果如下: