同事演示了一个.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异形窗口方法相关推荐

  1. 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 ...

  2. php 自定义超全局,一个超级简单的 PHP 超全局变量管理扩展

    一个超级简单的 PHP 超全局变量管理扩展(自卖自夸) 介绍 SG 全称 Superglobals,它的诞生为了方便快捷操作 PHP 预定义的超全局变量,用户定义的超全局变量. 如果在非 CLI 模式 ...

  3. html制作nba网页,NBA篮球_实用电脑小技巧:通俗解答html 自己动手建一个非常简单的网页_沪江英语...

    沪江小编:对于很多人来说,电脑应该算是使用频率最高的工具了,可是你真的会用电脑么?实用电脑小技巧,用最简单明了的方式给你无比有趣的电脑使用新体验. html是什么,什么是html通俗解答: 通俗的讲h ...

  4. 欢迎大家讨论:只想要一个最简单的XXX系统,功能最简化的XXX系统

    我们国人总有一种思想,能简化的简化,但是往往我们把真正应该简单化的东西反而没简单化,例如我们的人际关系.一些比较传统的封建思想,往往这些最应该简化的东西是更加搞得深入.复杂. 其实很多东西是简化不来的 ...

  5. 教师节html源码,教师节_实用电脑小技巧:通俗解答html 自己动手建一个非常简单的网页_沪江英语...

    沪江小编:对于很多人来说,电脑应该算是使用频率最高的工具了,可是你真的会用电脑么?实用电脑小技巧,用最简单明了的方式给你无比有趣的电脑使用新体验. html是什么,什么是html通俗解答: 通俗的讲h ...

  6. 一步一步SharePoint 2007之二十三:编写一个最简单的WebPart(1)——创建工程

    摘要 在前面的文章中,我们讲解了很多基础的内容,主要包括安装配置.Form认证等.可能这些对很多朋友来说,是太容易了.那么,从下一篇文章开始,就让我们进入SharePoint的高级课题之旅吧. 本篇文 ...

  7. 自己实现一个最简单的数据库

    自己实现一个最简单的数据库 July 4th , 2016 转载 codeceo 原文连接:http://www.codeceo.com/article/most-simple-database.ht ...

  8. 安装汇编环境,写一个最简单的窗口程序

    用汇编写一个窗口程序 1.安装汇编所需的环境 1.下载masm32 下载地址 可以安装到D:\masm32目录下 2.配置环境变量 include = D:\masm32\include lib = ...

  9. Dubbo入门介绍---搭建一个最简单的Demo框架

    Dubbo入门---搭建一个最简单的Demo框架 置顶 2017年04月17日 19:10:44 是Guava不是瓜娃 阅读数:320947 标签: dubbo zookeeper 更多 个人分类: ...

  10. 一个就简单的数学题 NYOJ 330

    1 #include<stdio.h>//一个就简单的数学题(330) 2 #include<string.h> 3 int a[100010]; 4 int main() 5 ...

最新文章

  1. 北师大刘嘉:认知神经科学如何打开 AI 黑箱?
  2. 物理理论发展放缓?这是一种认知误判
  3. Android之ViewHolder用法
  4. 为什么`malloc`出来的内存也能当成对象正常使用
  5. 英语语法---分词短语详解
  6. js获取元素节点对象
  7. 手动挡五个档位示意图_汽车档位越多越好?听听专业回答
  8. centos7安装rabbitmq简单方式
  9. es6 Object.is()方法
  10. jquery实现app开发闹钟功能_一款让你真正摆脱懒觉的“闹钟APP软件”
  11. 吴恩达新书手稿完工,现在开放免费下载 | 资源
  12. 如何实现vue前端跨域,proxyTable解决开发环境前端跨域问题
  13. 系统学习机器学习之增强学习(四)--马尔可夫决策过程策略MC求解
  14. 全网营销干货:物联网时代,为什么要关注线下大数据?
  15. DBUtils详细介绍+实例
  16. [全国十大城市火车票售票点、订票电话(买票再也不用去火车站排队)] – [旅游] – [校内论坛]
  17. 网络安全求职该怎么写简历?
  18. QQ聊天机器人 Delphi代码
  19. 信息学奥赛一本通:1135:配对碱基链
  20. 如何过滤好的和坏的价格交易信号

热门文章

  1. 作用域和作用域链 精解
  2. 第一次学游泳技巧_第一次学游泳怎么浮起来
  3. 【内核调度、负载均衡】【find_busiest_queue】
  4. IDEA中 Maven name group、artifact、package区别
  5. STM32F107VCTx HAL库 USART通信 DMA通信 友善串口调试助手 PL2303驱动安装
  6. 大数据给交通行业带来的五大变革 | 交通数据的深度应用
  7. Monash call:什么是生物识别安全 - 定义,系统以及设备
  8. Tableau 空难统计分析(十)人类历史上的事故数和死亡人数
  9. linux基本权限例子,Linux-3 文件权限-基本权限
  10. 2022年镇海夏令营组合数学和数论班 —— 数学作业 1