unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IGDIPlus, ExtCtrls, Menus, StdCtrls, PngImage, Unit2;
type
TForm1 = class(TForm)
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure FormCanResize(Sender: TObject; var NewWidth, NewHeight: Integer;
var Resize: Boolean);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure Timer1Timer(Sender: TObject);
private
function UpdateDisplayInit(XTransparent: Integer = 100):Boolean;
public
FPng: TPNGObject;
LImage: IGPImage; //使用这个类来创建和操作GDI+图像
LLogo: IGPImage;
LGraphics: IGPGraphics; //封装一个 GDI+ 绘图图面
LHdcScreen,LHdcMemory: HDC;
LhBitMap: Windows.HBITMAP;
LBlend: BLENDFUNCTION; //这种结构的混合控制通过指定源和目标位图的混合功能
LRct: TRect;
LPtWinPos,LPtSrc: TPoint;
LSizeWindow: SIZE;
LSrcPos: TPoint;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function TForm1.UpdateDisplayInit(XTransparent: Integer):Boolean;
begin
//---------------------开始:初始化操作--------------------------------------
LHdcScreen := GetDC(Self.Handle);
LHdcMemory := CreateCompatibleDC(LHdcScreen);
LhBitMap := CreateCompatibleBitmap(LHdcScreen, Width, Height);
SelectObject(LHdcMemory, LhBitMap);
if (XTransparent < 0) or (XTransparent > 100) then
XTransparent := 100;
LBlend.BlendOp := AC_SRC_OVER; //把源图片覆盖到目标之上
LBlend.BlendFlags := 0;
LBlend.AlphaFormat := AC_SRC_ALPHA;//每个像素有各自的alpha通道
LBlend.SourceConstantAlpha :=Trunc(XTransparent * 2.55); //源图片的透明度
GetWindowRect(Self.Handle, LRct);
LPtWinPos := Point(LRct.Left, LRct.Top);
LGraphics := TGPGraphics.Create(LHdcMemory);
// LImage := TGPImage.Create('3.png'); //背景图片
LSrcPos.X := (Integer(LImage.GetWidth) - Width) div 2;
//LSrcPos.Y := (Integer(LImage.GetHeight) - Height) div 2;
LGraphics.DrawImage(LImage, MakeRect(0, 0, Width, Height), LSrcPos.X, 0, Width, Height, UnitPixel);
LGraphics.DrawImage(LLogo, 0, 0, LLogo.GetWidth, LLogo.GetHeight);
LSizeWindow.cx := Width;
LSizeWindow.cy := Height;
LPtSrc := Point(0,0);
//---------------------开始:更新一个分层的窗口的位置,大小,形状,内容和半透明度---
Result := UpdateLayeredWindow(Self.Handle, //分层窗口的句柄
LHdcScreen, //屏幕的DC句柄
@LPtWinPos, //分层窗口新的屏幕坐标
@LSizeWindow, //分层窗口新的大小
LHdcMemory, //用来定义分层窗口的表面DC句柄
@LPtSrc, //分层窗口在设备上下文的位置
0, //合成分层窗口时使用指定颜色键值
@LBlend, //在分层窗口进行组合时的透明度值
ULW_ALPHA); //使用pblend为混合功能
end;
(*
function TForm1.UpdateDisplay(XTransparent: Integer):Boolean;
var
LHdcScreen,LHdcMemory: HDC;
LhBitMap: Windows.HBITMAP;
LBlend: BLENDFUNCTION; //这种结构的混合控制通过指定源和目标位图的混合功能
LRct: TRect;
LPtWinPos,LPtSrc: TPoint;
LSizeWindow: SIZE;
LSrcPos: TPoint;
begin
//---------------------开始:初始化操作--------------------------------------
LHdcScreen := GetDC(Self.Handle);
LHdcMemory := CreateCompatibleDC(LHdcScreen);
LhBitMap := CreateCompatibleBitmap(LHdcScreen, Width, Height);
SelectObject(LHdcMemory, LhBitMap);
if (XTransparent < 0) or (XTransparent > 100) then
XTransparent := 100;
LBlend.BlendOp := AC_SRC_OVER; //把源图片覆盖到目标之上
LBlend.BlendFlags := 0;
LBlend.AlphaFormat := AC_SRC_ALPHA;//每个像素有各自的alpha通道
LBlend.SourceConstantAlpha :=Trunc(XTransparent * 2.55); //源图片的透明度
GetWindowRect(Self.Handle, LRct);
LPtWinPos := Point(LRct.Left, LRct.Top);
LGraphics := TGPGraphics.Create(LHdcMemory);
// LImage := TGPImage.Create('3.png'); //背景图片
LSrcPos.X := (Integer(LImage.GetWidth) - Width) div 2;
//LSrcPos.Y := (Integer(LImage.GetHeight) - Height) div 2;
LGraphics.DrawImage(LImage, MakeRect(0, 0, Width, Height), LSrcPos.X, 0, Width, Height, UnitPixel);
LGraphics.DrawImage(LLogo, 0, 0, LLogo.GetWidth, LLogo.GetHeight);
LSizeWindow.cx := Width;
LSizeWindow.cy := Height;
LPtSrc := Point(0,0);
//---------------------开始:更新一个分层的窗口的位置,大小,形状,内容和半透明度---
Result := UpdateLayeredWindow(Self.Handle, //分层窗口的句柄
LHdcScreen, //屏幕的DC句柄
@LPtWinPos, //分层窗口新的屏幕坐标
@LSizeWindow, //分层窗口新的大小
LHdcMemory, //用来定义分层窗口的表面DC句柄
@LPtSrc, //分层窗口在设备上下文的位置
0, //合成分层窗口时使用指定颜色键值
@LBlend, //在分层窗口进行组合时的透明度值
ULW_ALPHA); //使用pblend为混合功能
//---------------------开始:释放和删除--------------------------------------
ReleaseDC(Self.Handle,LHdcScreen);
DeleteObject(LhBitMap);
DeleteDC(LHdcMemory);
end;
*)
procedure TForm1.Button1Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.FormCanResize(Sender: TObject; var NewWidth,
NewHeight: Integer; var Resize: Boolean);
begin
if NewWidth > 2000 then
NewWidth := 2000;
if NewWidth < 1024 then
NewWidth := 1024;
if NewHeight > 1100 then
NewHeight := 1100;
if NewHeight < 734 then
NewHeight := 734;
Resize := True;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
LImage := TGPImage.Create('3.png'); //背景图片
IInterface(LImage)._AddRef;
LLogo := TGPImage.Create('Logo.png');
IInterface(LLogo)._AddRef;
DoubleBuffered := True;
FPng := TPNGObject.Create;
FPng.LoadFromFile('3.png');
SetWindowLong(Self.Handle,
GWL_EXSTYLE,
GetWindowLong(Self.Handle,GWL_EXSTYLE)
or WS_EX_LAYERED
);
UpdateDisplayInit();
//Form2.Show;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
IInterface(LImage)._Release;
IInterface(LLogo)._Release;
FreeAndNil(FPng);
//---------------------开始:释放和删除--------------------------------------
ReleaseDC(Self.Handle,LHdcScreen);
DeleteObject(LhBitMap);
DeleteDC(LHdcMemory);
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
Canvas.TextOut(0, 0, 'Key = ' + Char(Key));
end;
procedure TForm1.FormResize(Sender: TObject);
begin
//UpdateDisplay();
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
LRect: TGPRect;
begin
//UpdateDisplay;
LRect := MakeRect(100, 100, LLogo.Width, LLogo.Height);
LGraphics.DrawImage(LImage, LRect, LSrcPos.X + LRect.X, 0 + LRect.Y, LRect.Width, LRect.Height, UnitPixel);
LGraphics.DrawImage(LLogo, LRect);
GetWindowRect(Self.Handle, LRct);
LPtWinPos := Point(LRct.Left, LRct.Top);
//---------------------开始:更新一个分层的窗口的位置,大小,形状,内容和半透明度---
UpdateLayeredWindow(Self.Handle, //分层窗口的句柄
LHdcScreen, //屏幕的DC句柄
@LPtWinPos, //分层窗口新的屏幕坐标
@LSizeWindow, //分层窗口新的大小
LHdcMemory, //用来定义分层窗口的表面DC句柄
@LPtSrc, //分层窗口在设备上下文的位置
0, //合成分层窗口时使用指定颜色键值
@LBlend, //在分层窗口进行组合时的透明度值
ULW_ALPHA); //使用pblend为混合功能
end;
end.
png图片做窗口
最新推荐文章于 2019-11-27 07:42:44 发布