一个最简单的Delphi2010的PNG异形窗口方法
同事演示了一个.NET的的PNG异形窗口.挺漂亮.于是也想用Delphi显摆一个.
关于Delphi用PNG做异形窗口的资料有不少.都是用GDIPlus或者TPNGImage组件加载PNG图像做的.但是我很懒,不想引用的GDIPlus,也不想去找PNGImage下载.
好在从Delphi2009开始Delphi中就收购了PNGImage,并集成到后继的版本中.Delphi2010又包装了微软的IWICImagingFactory接口,这样处理PNG的工作就交给操作系统去做了.
函数很简单一共就几行,关键就是UpdateLayeredWindow.
发现CodeGear真让我上火.他们收工了PNGImage以后搞的东西居然改出了问题.透明盒渐变都有问题.做异形窗口该渐变部分居然是透明的.该透明的部分居然是不透明的.看了一下被收购前的PNGImage一点问题都没有.CodeGear真实的.
只好用Delphi2010提供的IWICImagingFactory接口的包装了,这次PNG的处理交给微软的操作系统了,一点问题也没有.其他版本的Delphi只要能对IWICImagingFactory进行包装,也一样能处理.但还是Delphi2010最方便.什么控件也不用,多余的东西都不要.
代码如下,很简单吧:)
{*******************************************************}
{ }
{ 异形窗口 }
{ }
{ 2009.12.4 王 锐 }
{ }
{*******************************************************}
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就可以了.
效果如下:
转载于:https://www.cnblogs.com/MaxWoods/p/3295871.html
一个最简单的Delphi2010的PNG异形窗口方法相关推荐
- Centos 6.5下一个SNMP简单配置(snmp protocol v3,监控宝)
Centos 6.5下一个SNMP简单配置(snmp protocol v3.监控宝) jom_ch@2014/7/25 1,安装 >yum -y install net-snmp net-sn ...
- php 自定义超全局,一个超级简单的 PHP 超全局变量管理扩展
一个超级简单的 PHP 超全局变量管理扩展(自卖自夸) 介绍 SG 全称 Superglobals,它的诞生为了方便快捷操作 PHP 预定义的超全局变量,用户定义的超全局变量. 如果在非 CLI 模式 ...
- html制作nba网页,NBA篮球_实用电脑小技巧:通俗解答html 自己动手建一个非常简单的网页_沪江英语...
沪江小编:对于很多人来说,电脑应该算是使用频率最高的工具了,可是你真的会用电脑么?实用电脑小技巧,用最简单明了的方式给你无比有趣的电脑使用新体验. html是什么,什么是html通俗解答: 通俗的讲h ...
- 欢迎大家讨论:只想要一个最简单的XXX系统,功能最简化的XXX系统
我们国人总有一种思想,能简化的简化,但是往往我们把真正应该简单化的东西反而没简单化,例如我们的人际关系.一些比较传统的封建思想,往往这些最应该简化的东西是更加搞得深入.复杂. 其实很多东西是简化不来的 ...
- 教师节html源码,教师节_实用电脑小技巧:通俗解答html 自己动手建一个非常简单的网页_沪江英语...
沪江小编:对于很多人来说,电脑应该算是使用频率最高的工具了,可是你真的会用电脑么?实用电脑小技巧,用最简单明了的方式给你无比有趣的电脑使用新体验. html是什么,什么是html通俗解答: 通俗的讲h ...
- 一步一步SharePoint 2007之二十三:编写一个最简单的WebPart(1)——创建工程
摘要 在前面的文章中,我们讲解了很多基础的内容,主要包括安装配置.Form认证等.可能这些对很多朋友来说,是太容易了.那么,从下一篇文章开始,就让我们进入SharePoint的高级课题之旅吧. 本篇文 ...
- 自己实现一个最简单的数据库
自己实现一个最简单的数据库 July 4th , 2016 转载 codeceo 原文连接:http://www.codeceo.com/article/most-simple-database.ht ...
- 安装汇编环境,写一个最简单的窗口程序
用汇编写一个窗口程序 1.安装汇编所需的环境 1.下载masm32 下载地址 可以安装到D:\masm32目录下 2.配置环境变量 include = D:\masm32\include lib = ...
- Dubbo入门介绍---搭建一个最简单的Demo框架
Dubbo入门---搭建一个最简单的Demo框架 置顶 2017年04月17日 19:10:44 是Guava不是瓜娃 阅读数:320947 标签: dubbo zookeeper 更多 个人分类: ...
- 一个就简单的数学题 NYOJ 330
1 #include<stdio.h>//一个就简单的数学题(330) 2 #include<string.h> 3 int a[100010]; 4 int main() 5 ...
最新文章
- 北师大刘嘉:认知神经科学如何打开 AI 黑箱?
- 物理理论发展放缓?这是一种认知误判
- Android之ViewHolder用法
- 为什么`malloc`出来的内存也能当成对象正常使用
- 英语语法---分词短语详解
- js获取元素节点对象
- 手动挡五个档位示意图_汽车档位越多越好?听听专业回答
- centos7安装rabbitmq简单方式
- es6 Object.is()方法
- jquery实现app开发闹钟功能_一款让你真正摆脱懒觉的“闹钟APP软件”
- 吴恩达新书手稿完工,现在开放免费下载 | 资源
- 如何实现vue前端跨域,proxyTable解决开发环境前端跨域问题
- 系统学习机器学习之增强学习(四)--马尔可夫决策过程策略MC求解
- 全网营销干货:物联网时代,为什么要关注线下大数据?
- DBUtils详细介绍+实例
- [全国十大城市火车票售票点、订票电话(买票再也不用去火车站排队)] – [旅游] – [校内论坛]
- 网络安全求职该怎么写简历?
- QQ聊天机器人 Delphi代码
- 信息学奥赛一本通:1135:配对碱基链
- 如何过滤好的和坏的价格交易信号
热门文章
- 作用域和作用域链 精解
- 第一次学游泳技巧_第一次学游泳怎么浮起来
- 【内核调度、负载均衡】【find_busiest_queue】
- IDEA中 Maven name group、artifact、package区别
- STM32F107VCTx HAL库 USART通信 DMA通信 友善串口调试助手 PL2303驱动安装
- 大数据给交通行业带来的五大变革 | 交通数据的深度应用
- Monash call:什么是生物识别安全 - 定义,系统以及设备
- Tableau 空难统计分析(十)人类历史上的事故数和死亡人数
- linux基本权限例子,Linux-3 文件权限-基本权限
- 2022年镇海夏令营组合数学和数论班 —— 数学作业 1