关于Delphi用PNG做异形窗口的资料有不少.都是用GDIPlus或者TPNGImage组件加载PNG图像做的.但是我很懒,不想引用的GDIPlus,也不想去找PNGImage下载.好在从Delphi2009开始Delphi中就收购了PNGImage,并集成到后继的版本中.Delphi2010又包装了微软的IWICImagingFactory接口,这样处理PNG的工作就交给操作系统去做了.函数很简单一共就几行,关键就是UpdateLayeredWindow.
发现CodeGear真让我上火.他们收购了PNGImage以后搞的东西居然改出了问题.透明盒渐变都有问题.做异形窗口该渐变部分居然是透明的.该透明的部分居然是不透明的.看了一下被收购前的PNGImage一点问题都没有.CodeGear真实的.
只好用Delphi2010提供的IWICImagingFactory接口的包装了,这次PNG的处理交给微软的操作系统了,一点问题也没有.其他版本的Delphi只要能对IWICImagingFactory进行包装,也一样能处理.但还是Delphi2010最方便.什么控件也不用,多余的东西都不要.
unit UnitYXForm;
interface
uses
Windows, Forms, Classes, Graphics;
//从文件加载PNG
procedure YXForm_FromFile(AForm : TForm; AFileName : String);
//从资源加载PNG
procedure YXForm_FromResource(AForm : TForm; ResName : String; ResType : PWideChar; Instance : HINST = 0);
//从图像对象加载
procedure YXForm_FromGraphic(AForm : TForm; AGraphic : TGraphic);
implementation
procedure YXForm_FromFile(AForm : TForm; AFileName : String);
var
wic : TWICImage;
begin
wic := TWICImage.Create;
wic.LoadFromFile(AFileName);
YXForm_FromGraphic(AForm, wic);
wic.Free;
end;
procedure YXForm_FromResource(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);
YXForm_FromGraphic(AForm, wic);
wic.Free;
r.Free;
end;
procedure YXForm_FromGraphic(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);
YXForm_FromFile(ff, 'c:/a.png');
ff.Show;
实现动画也很容易.只要不停地YXForm_FromFile(ff, 'c:/a.png');调用一套动作PNG就可以了.
分享到:
相关推荐
Delphi7可用的PngImage控件 PNG Delphi v.1.564,可用于D7显示Png图片。 使用方法:(Delphi 7 使用成功案例) 1、将本包中所有文件复制到开发文件保存的目录中 2、在USES单元中加入pngimage 3、窗体中插入image1...
使用方法:(Delphi 7 使用成功案例) 1、将本包中所有文件复制到开发文件保存的目录中 2、在USES单元中加入pngimage 3、窗体中插入image1控件 4、在调用位置,加入如下代码就OK啦! var png: tpngimage; begin ...
在做delphi UI界面的时候,经常会碰到需要用到透明背景的png图片,原生代码无法满足,这里写了一个例子供大家参考,安装完控件之后,dephi原来的Image控件就支持png了
Delphi实现的不规则窗体,异形窗体,透明窗体,PNG图片, 鼠标穿透窗口。还可以贴近屏幕边缘自动吸附隐藏。 DelphiXE , D10 下编译通过 。在Delphi 7环境下需要去掉uses 单元 Winapi.Windows 前面的 WinApi.xxx System....
desc=PNG Delphi组件是一个用Object Pascal实现的完全免费并且开源的代码库用以读取PNG(Portable Network Graphics)格式的图片。BCB6目录和BCB11目录是ccrun为大家生成好的C++Builder6和C++Builder2007的组件包,已...
我觉得这个窗体的样子很不错,窗体支持右键菜单,还可以设置窗口置顶和更换PNG图片,原来使用GDI+技术,用PNG就能实现这么漂亮、个性的半透明窗体,也让我对Delphi产生了信心,作者和时间:2008 赵述杰。 运行环境...
delphi控件PNGimage1.43,实现按钮加载PNG图片,实现透明效果
This is PNG Delphi version 1.56 documentation (this version is a major rewrite intended to replace the previous version, 1.2). Improvements in this new version includes: This new version allows the ...
delphi PNG透明窗体 控件不透明
PNGDelphi是一款操作PNG图像有关的Delphi控件,内含多个实例,含英文版的帮助文档,相信这东西对从事Delphi编程的朋友有用处。
桌面精灵的实现,异形窗口编写的技巧实现与运用
delphi2007之前支持PNG格式图片
针对delphi老版本不支持处理PNG,添加此组件可以轻松处理PNG图片,包括把PNG图片转成其他图片,也可以把PNG图片变成数组形式供嵌入式系统使用。
png图片读取方法delphi源码及控件,及各种图片格式判断函数
适合delphi7使用的第三方控件pngimage,带源码的.pas文件。
delphi的一个简单的窗口显示,就是点击按钮时产生不同的对话框
delphi 获取窗口信息 delphi 获取窗口信息
delphi bmp生成透明png gid+几个实例 半透等
GDI+用PNG图片做半透明异型窗口 Delphi源码 非常不错的源码哦。GDI+用PNG图片做半透明异型窗口 Delphi源码 非常不错的源码哦。
delphi 实现多个浮动透明窗口,多个窗口相互独立,可以自由拉动,模拟迅雷浮动窗口。程序启动时显示主窗口,关闭时显示5个浮动透明窗口