GDI+用PNG图片做半透明异型窗口

  1. {*******************************************************}
  2. {                                                       }
  3. {       GDI+用PNG图片做半透明异型窗口                   }
  4. {                                                       }
  5. {       版权所有 (C) 2008 QQ:3150379                    }
  6. {                                                       }
  7. {*******************************************************}
  8. unit Unit1;
  9. interface
  10. uses
  11.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  12.   Dialogs,
  13.   GDIPAPI, GDIPOBJ, Menus, StdCtrls;
  14. type
  15.   TForm1 = class(TForm)
  16.     PopupMenu1: TPopupMenu;
  17.     mniClose: TMenuItem;
  18.     mniChangeSkin: TMenuItem;
  19.     About1: TMenuItem;
  20.     Stayontop1: TMenuItem;
  21.     procedure FormCreate(Sender: TObject);
  22.     procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
  23.       Shift: TShiftState; X, Y: Integer);
  24.     procedure About1Click(Sender: TObject);
  25.     procedure Stayontop1Click(Sender: TObject);
  26.     procedure mniChangeSkinClick(Sender: TObject);
  27.     procedure mniCloseClick(Sender: TObject);
  28.   private
  29.     m_Blend: BLENDFUNCTION;
  30.     procedure SetTransparent(lpSkinFile: WideString; nTran: integer);
  31.           {   Private   declarations   }
  32.   public
  33.           {   Public   declarations   }
  34.   end;
  35. var
  36.   Form1: TForm1;
  37. implementation
  38. {$R   *.dfm}
  39. procedure TForm1.FormCreate(Sender: TObject);
  40. begin
  41.   BorderStyle := bsNone;
  42.   m_Blend.BlendOp := AC_SRC_OVER; //   the   only   BlendOp   defined   in   Windows   2000
  43.   m_Blend.BlendFlags := 0//   Must   be   zero
  44.   m_Blend.AlphaFormat := AC_SRC_ALPHA; //This   flag   is   set   when   the   bitmap   has   an   Alpha   channel
  45.   m_Blend.SourceConstantAlpha := 255;
  46.   if (FileExists(ExtractFilePath(ParamStr(0)) + 'Security - Alert.png')) then
  47.     SetTransparent(WideString(ExtractFilePath(ParamStr(0)) + 'Security - Alert.png'), 100);
  48.   //   Stay   on   top
  49.   SetWindowPos(Handle, HWND_TOPMOST, 0000, SWP_NOMOVE or SWP_NOSIZE);
  50. end;
  51. procedure TForm1.SetTransparent(lpSkinFile: WideString; nTran: integer);
  52. var
  53.   GPImage: TGPImage;
  54.   GPGraph: TGPGraphics;
  55.   m_Image: TGPImage;
  56.   m_hdcMemory: HDC;
  57.   hdcScreen: HDC;
  58.   hBMP: HBITMAP;
  59.   sizeWindow: SIZE;
  60.   rct: TRECT;
  61.   ptSrc: TPOINT;
  62. begin
  63.   //   Use   GDI+   load   image
  64.   GPImage := TGPImage.Create();
  65.   m_Image := GPImage.FromFile(lpSkinFile);
  66.   //   Create   Compatible   Bitmap
  67.   hdcScreen := GetDC(0);
  68.   m_hdcMemory := CreateCompatibleDC(hdcScreen);
  69.   hBMP := CreateCompatibleBitmap(hdcScreen, m_Image.GetWidth(), m_Image.GetHeight());
  70.   SelectObject(m_hdcMemory, hBMP);
  71.   //   Alpha   Value
  72.   if (nTran < 0or (nTran > 100then
  73.     nTran := 100;
  74.   m_Blend.SourceConstantAlpha := round(nTran * 2.55); //   1~255
  75.   GetWindowRect(Handle, rct);
  76.   GPGraph := TGPGraphics.Create(m_hdcMemory);
  77.   GPGraph.DrawImage(m_Image, 00, m_Image.GetWidth(), m_Image.GetHeight());
  78.   sizeWindow.cx := m_Image.GetWidth();
  79.   sizeWindow.cy := m_Image.GetHeight();
  80.   ptSrc.x := 0;
  81.   ptSrc.y := 0;
  82.   //   Set   Window   style
  83.   SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
  84.   //   perform   the   alpha   blend
  85.   UpdateLayeredWindow(Handle, hdcScreen, nil,@sizeWindow, m_hdcMemory, @ptSrc, 0, @m_Blend, ULW_ALPHA);
  86.   //Release   resources
  87.   GPGraph.ReleaseHDC(m_hdcMemory);
  88.   ReleaseDC(0, hdcScreen);
  89.   hdcScreen := 0;
  90.   DeleteObject(hBMP);
  91.   DeleteDC(m_hdcMemory);
  92.   m_hdcMemory := 0;
  93.   m_Image.Free;
  94.   GPGraph.Free;
  95. end;
  96. procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  97.   Shift: TShiftState; X, Y: Integer);
  98. begin
  99.   if (Button = mbLeft) then
  100.   begin
  101.     ReleaseCapture();
  102.     Perform(WM_SYSCOMMAND, SC_MOVE or HTCAPTION, 0);
  103.   end;
  104. end;
  105. procedure TForm1.About1Click(Sender: TObject);
  106. begin
  107.   MessageDlg('效果还不行吧!'#13+'QQ:3150379', mtInformation, [mbOK], 0);
  108. end;
  109. procedure TForm1.Stayontop1Click(Sender: TObject);
  110. var
  111.   mi: TMenuItem;
  112.   WindowPos: HWND;
  113. begin
  114.   mi := Sender as TMenuItem;
  115.   mi.Checked := not mi.Checked;
  116.   if mi.Checked then
  117.     WindowPos := HWND_TOPMOST
  118.   else
  119.     WindowPos := HWND_NOTOPMOST;
  120.   SetWindowPos(Handle, WindowPos,0000, SWP_NOMOVE or SWP_NOSIZE);
  121. end;
  122. procedure TForm1.mniChangeSkinClick(Sender: TObject);
  123. var
  124.   dlgOpen: TOpenDialog;
  125. begin
  126.   dlgOpen := TOpenDialog.Create(Self);
  127.   dlgOpen.Filter := 'PNG   file(*.png)|*.png';
  128.   if (dlgOpen.Execute()) then
  129.   begin
  130.     SetTransparent(WideString(dlgOpen.FileName), 100);
  131.     Invalidate();
  132.   end;
  133.   dlgOpen.Free;
  134. end;
  135. procedure TForm1.mniCloseClick(Sender: TObject);
  136. begin
  137.   Close;
  138. end;
  139. end.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/449824.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java Spring Boot中使用Swagger2构建API文档

1、添加Swagger2的依赖 在pom.xml中加入Swagger2的依赖 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.2.2</version> </dependency> <dependency><groupId&g…

什么是 FreeMarker

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 转自官方文档&#xff0c;只是记录下官方在线手册地址&#xff1a;http://freemarker.foofun.cn/ FreeMarker 是一款 模板引擎&#xff…

TP函数

U方法用于完成对URL地址的组装&#xff0c;特点在于可以自动根据当前的URL模式和设置生成对应的URL地址&#xff0c;格式为&#xff1a;U(地址,参数,伪静态,是否跳转,显示域名);在模板中使用U方法而不是固定写死URL地址的好处在于&#xff0c;一旦你的环境变化或者参数设置改变…

爬虫——————爬取中金所,深交所,上交所期权数据

先从深交所开始&#xff1a;直接上传源码&#xff1a; from bs4 import BeautifulSoup from lxml import etree import pandas as pd import akshare as ak import datetime import requests import csv from contextlib import closing import time from urllib.request impo…

linux下的C语言开发

linux下的C语言开发&#xff08;开篇&#xff09; 在很多人的眼里&#xff0c;C语言和linux常常是分不开的。这其中的原因很多&#xff0c;其中最重要的一部分我认为是linux本身就是C语言的杰出作品。当然&#xff0c;linux操作系统本身对C语言的支持也是相当到位的。作为一个…

sql语法学习

本人数据库目前使用的是sql&#xff0c;主要是使用python语言&#xff0c;然后用pandas调用&#xff08;真的很方便&#xff09;。所以就总结一下&#xff0c;也为自己以后调用数据查找方便使用。 导入包 from sqlalchemy import create_engine import pymssql连接数据库 con…

C 温故知新 之 指针:数组指针、字符串指针、函数指针

一、数组指针 1.指向数组元素的指针 1、定义&#xff1a;还是那句话通俗的说指针就是地址   数组指针 &#xff1a;数组的起始地址 数组元素指针&#xff1a;数组元素的地址 2、定义一个指向数组元素的指针变量的方法&#xff0c;与之前介绍的指针变量相同。 例如&#…

mysql 查找配置文件 my.ini 位置方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 个人备注&#xff1a;不显示文件类型时&#xff0c;my.ini 文件名就叫作 my&#xff0c; 文件属性才显示 ini。 找到 my 文件看属性就知…

嵌入式操作系统内核原理和开发

嵌入式操作系统内核原理和开发&#xff08;开篇&#xff09; 操作系统是很多人每天必须打交道的东西&#xff0c;因为在你打开电脑的一刹那&#xff0c;随着bios自检结束&#xff0c;你的windows系统已经开始运行了。如果问大家操作系统是什么&#xff1f;可能有的人会说操作…

Java中对象比较

在Java之中不仅仅存在两个数字与两个字符串之间的比较&#xff0c;还存在两个对象之间的比较。 众所周知&#xff0c;两个数字之间的比较我们使用“”&#xff0c;两个字符串之间的比较我们使用“equals()”&#xff0c;那么两个对象之间如何进行比较呢&#xff1f;既然要进行两…

如何安装pfbprophet

最近facebook出来了一个软件包&#xff0c;可以用于时序数据预测&#xff0c;但是安装上&#xff0c;遇到问题不小&#xff0c;本人也在安装中遇到大大小小各种问题&#xff0c;然后查了各种资料&#xff0c;进行研究&#xff0c;终于找到一个最简单的办法。 不废话&#xff0…

JeeSite 4.0 (1.0)开发环境部署运行

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 环境要求 1、Java SDK 1.8 下载 2、Eclipse IDE for Java EE Mars 2 (4.5.2) 下载&#xff08;依Eclipse举例&#xff0c;IDEA雷同。&…

dojo 七 DOM dojo/dom

官方教程&#xff1a;Dojo DOM Functions对dom的使用&#xff0c;需要引用包dojo/dom。1.获取节点&#xff0c;dom.byIdbyId中既可以传递一个字符串&#xff0c;也可以传递一个节点对象 require(["dojo/dom", "dojo/domReady!"], function(dom) {function …

quantaxis中使用docker安装,出现的问题

本人在使用docker安装quantaxis时&#xff0c;经常发生docker报错&#xff0c;原因是与 wsl2冲突。之前不知道原因&#xff0c;直接就是卸载重装&#xff0c;累死我了。现在知道后&#xff0c;将解决方案记下&#xff0c;帮助后来者继续前行。 管理员打开cmd&#xff0c;输入 …

并发编程(多进程1)

一 multiprocessing模块介绍 python中的多线程无法利用多核优势&#xff0c;如果想要充分地使用多核CPU的资源&#xff08;os.cpu_count()查看&#xff09;&#xff0c;在python中大部分情况需要使用多进程。Python提供了multiprocessing。 multiprocessing模块用来开启子进…

LInux 下文件包的使用

1 .deb   http://wiki.ubuntu.org.cn/MySQL%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97 2 .rpm

@RequiresPermissions 注解说明

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 RequiresAuthentication 验证用户是否登录&#xff0c;等同于方法subject.isAuthenticated() 结果为true时。 RequiresUser 验证用户…

千位分隔符转换为数字

最近下载了akshare里面的数据&#xff0c;然后发现有些数据格式为1,300这种格式&#xff0c;为str格式&#xff0c;但是又无法直接强制转换之类方式&#xff0c;特地寻求答案&#xff0c;并做笔记&#xff0c;留待自己与后来者一起避坑。 from locale import * atof(123,456)…

一本通1629聪明的燕姿

1629&#xff1a;聪明的燕姿 时间限制: 1000 ms 内存限制: 524288 KB【题目描述】 城市中人们总是拿着号码牌&#xff0c;不停寻找&#xff0c;不断匹配&#xff0c;可是谁也不知道自己等的那个人是谁。 可是燕姿不一样&#xff0c;燕姿知道自己等的人是谁&#xff0c;…

IT职场人生系列之二十四:程序员如何增加收入

这是IT职场人生系列的第二十四篇。&#xff08;序言&#xff0c;专栏目录&#xff09; 程序员的收入是广受关注的问题&#xff0c;很多人从业3&#xff5e;5年之后就会遇到这个收入瓶颈。尽管物价不断上涨&#xff0c;程序员尤其是初、中级程序员的收入不升反降。即使上次在某…