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就可以了.

效果如下:

时间: 2024-10-19 13:22:57

Png异形窗口的相关文章

QT中异形窗口的绘制(winEvent处理WM_NCHITTEST消息)

这里讨论的只是Windows平台上的实现. 在QT中绘制异形窗口,只要设定 windowFlag 为 CustomizeWindowHint,再结合setMask()就可以做出各种奇形怪状的窗口.相对来说比较麻烦的, 是进行窗口拖动和缩放的处理. 在 Windows SDK 和 MFC 中比较容易,只要处理 WM_NCHITTEST,返回相应的测试值就可以了.幸运的是,QT中也提供了直接处理各平台消息的方法,在 Windows下只需要重载winEvent方法. 下面给出了示例代码: // inc

使用Unity3d做异形窗口

项目马上上线,因为之前的登录器是使用VS2010的MFC做的,在很多电脑上会提示缺失mfcXXXX.dll,中间找寻这种解决方案,最后确定将vcredist2010_x86和我的程序打包到安装包里面,每次安装的时候默认先安装vcredist2010_x86. 由此,经常被杀毒软件阻止,而且还有x64 or x86的区别. 同时,甲方想要一个精灵,类似于QQ宠物,于是PL决定使用精灵模型+异形窗口做一个桌面宠物.于是,异形窗口成了此物的基础. 首先,我们需要了解的是,异形窗口是什么.简单来说,即将

c# UpdateLayeredWindow异形窗口

#region UpdateLayeredWindow #region 重写窗体的 CreateParams 属性 protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ExStyle |= 0x00080000; // WS_EX_LAYERED 扩展样式 //无边框任务栏窗口最小化 const int WS_MINIMIZEBOX = 0x00020000; /

Delphi异形窗口之PNG

1 //1.单元内容 2 unit UnitAlienForm; 3 interface 4 uses 5 Windows, Forms, Classes, Graphics; 6 //从文件加载PNG 7 procedure AlienForm_PNGFromFile(AForm : TForm; AFileName : String); 8 //从资源加载PNG 9 procedure AlienForm_PNGFromResource(AForm : TForm; ResName : St

窗体的Alpha通道透明色支持(一旦 Form 被定义为利用 LayeredWindow ,窗口的绘图不再响应沿用多年的 WM_Paint 消息)

参考: http://www.delphibbs.com/delphibbs/dispq.asp?lid=2190768 Windows 2000后,为了支持类似MAC界面的Alpha通道混合效果,提供了GDI+,提供了很多的界面功能函数,可以实现很好的界面效果.例如可以使用UpdateLayeredWindow来实现窗体的颜色透明.但是一旦 Form 被定义为利用 LayeredWindow ,窗口的绘图不再响应沿用多年的 WM_Paint 消息. UpdateLayeredWindow(hw

【异形窗体】完美实现无毛边异形窗体

实现效果图1:实现效果图2:实现效果图3: 异形窗体的实现思路(一).采用UpdateLayeredWindow这个api函数基于Png图alpha通道绘制异形窗口           优点:真正意义上的异形窗口           缺点:用了WS_EX_LAYERED后当前窗体不处理paint事件,所以窗体上无法绘制控件,但这个控件确存在,而且可以响应事件 解决无法绘制控件方法:              1.思路:              采用双层窗口:底层背景窗口层与顶层控件层,用控件层

Windows界面编程第四篇 异形窗体(转)

原文转自 http://blog.csdn.net/morewindows/article/details/8451638 上一篇<Windows界面编程第三篇 异形窗体 普通版>介绍了异形窗口(异形窗体)的创建,其主要步骤为--先通过创建位图画刷来做窗口的背景画刷,再通过SetWindowLong为窗体加上WS_EX_LAYERED属性,然后使用SetLayeredWindowAttributes指定窗口的透明色来完成窗口形状的调整.并且为了使异形窗口支持鼠标的拖曳,在WM_LBUTTOND

MFC中无标题栏窗口的移动

原文链接: http://blog.sina.com.cn/s/blog_6288219501015dwa.html 移动标准窗口是通过用鼠标单击窗口标题条来实现的,但对于没有标题条的窗口,就需要用鼠标单击窗口标题条以外区域来移动窗口.有两种方法可以达到这一目标. 方法一:当窗口确定鼠标位置时,Windows向窗口发送WM_NCHITTEST消息,可以处理该消息,使得只要鼠标在窗口内,Windows便认为鼠标在标题条上.这需要重载CWnd类处理WM_NCHITTEST消息的OnNcHitTest

Windows 10 应用创建模糊背景窗口的三种方法

原文 Windows 10 应用创建模糊背景窗口的三种方法 现代的操作系统中创建一张图片的高斯模糊效果非常容易,不过如果要在窗口中获得模糊支持就需要操作系统的原生支持了.iOS/Mac 和 Windows 系统都对此有支持. 本文将介绍三种创建模糊背景窗口的方法.有人可能喜欢称之为毛玻璃窗口.亚克力窗口. This post is written in multiple languages. Please select yours: 最早我是在 StackOverflow 上回答一位网友的提问时