png图片做窗口
2015-09-14 18:54
253 查看
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.
相关文章推荐
- 最简单实现跨域的方法----使用nginx反向代理
- MongoDB(三)——CRUD
- 最新版本的mysql安装步骤
- http://www.yesky.com/424/163424.shtml http://www.yesky.com/424/163424.shtml
- BitmapShader初步认识
- hdu 5444 Elven Postman(二叉搜索树)
- fontconfig
- 多线程处理图片,bmp不支持,png支持
- java-Transient关键字、Volatile关键字介绍和序列化、反序列化机制、单例类序列化
- 集成百度地图时报错、使用百度地图画两条颜色不一样的线
- jquery的tree table(树表)
- linux 中/proc 详解 http://blog.csdn.net/kevinx_xu/article/details/8178746
- Jq_选择器、效果函数
- 为什么只有在用Visual Studio启动程序时会抛出InvalidOperationException异常
- 跨平台客户端Socket 二 接口定义
- 【iOS】APP实现检测更新
- WinAPI: DrawTextEx - 多功能文本绘制 Delphi需要把&替换成&&才可以
- 一字节anti创建进程线程等回调
- Matlab基础
- Java中的常用类