{*******************************************************************************
半透明窗体控件
版本:1.0
功能说明 :
1.支持颜色和图片半透明
2.暂时只能手动指定背景图片
3.可调透明度(0..255)
4.可控制是否可移动窗体 联系方式: Email: mdejtoz@163.com
*******************************************************************************}
unit uTranslucentForm; interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ActiveX, Gdiplus,GdipUtil,StdCtrls, XPMan, ExtCtrls;
type
TTranslucentForm = class(TComponent)
private
FAlpha : Byte;
FOverlayerForm : TForm;
FBackground : TFileName;
FOwner : TForm;
FFirstTime : Boolean;
FMouseEvent : TMouseEvent;
FOldOnActive : TNotifyEvent;
FOldOverlayWndProc : TWndMethod;
FMove : Boolean;
procedure SetAlpha(const value : Byte) ;
procedure SetBackground(const value : TFileName);
procedure RenderForm(TransparentValue: Byte);
procedure OverlayWndMethod(var Msg : TMessage);
procedure InitOverForm;
procedure OnOwnerMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
procedure OnOwnerActive(Sender : TObject);
procedure SetMove(const value : Boolean);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property AlphaValue : Byte read FAlpha write SetAlpha;
property Background : TFileName read FBackground write SetBackground;
property Move : Boolean read FMove write SetMove;
end;
procedure Register;
implementation procedure Register;
begin
RegisterComponents('MyControl', [TTranslucentForm]);
end;
{ TTranslucentForm } constructor TTranslucentForm.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FOwner := TForm(AOwner);
FAlpha := ;
FMove := True;
if (csDesigning in ComponentState) then Exit;
InitOverForm;
SetWindowLong(FOverlayerForm.Handle,GWL_EXSTYLE,GetWindowLong(FOverlayerForm.Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
RenderForm(FAlpha);
end; destructor TTranslucentForm.Destroy;
begin
if not (csDesigning in ComponentState) then
begin
if Assigned(FOverlayerForm) then
begin
FOverlayerForm.WindowProc := FOldOverlayWndProc;
FreeAndNil(FOverlayerForm);
end;
end;
inherited Destroy;
end; procedure TTranslucentForm.InitOverForm;
begin
FOverlayerForm := TForm.Create(nil);
with FOverlayerForm do
begin
Left := FOwner.Left ;
Top := FOwner.Top;
Width := FOwner.Width ;
Height := FOwner.Height ;
BorderStyle := bsNone;
color := FOwner.Color;
Show;
FOldOverlayWndProc := FOverlayerForm.WindowProc;
FOverlayerForm.WindowProc := OverlayWndMethod;
end;
with FOwner do
begin
Left := FOwner.Left ;
Top := FOwner.Top ;
Color := clOlive;
TransparentColorValue := clOlive;
TransparentColor := True;
BorderStyle := bsNone;
FMouseEvent := OnMouseDown;
FOldOnActive := OnActivate;
OnActivate := OnOwnerActive;
OnMouseDown := OnOwnerMouseDown;
Show;
end;
FFirstTime := True;
RenderForm(FAlpha);
end; procedure TTranslucentForm.OnOwnerActive(Sender: TObject);
begin
with FOverlayerForm do
begin
Left := FOwner.Left ;
Top := FOwner.Top ;
Width := FOwner.Width ;
Height := FOwner.Height ;
end;
RenderForm(FAlpha);
if Assigned(FOldOnActive) then FOldOnActive(FOwner);
end; procedure TTranslucentForm.OnOwnerMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if Assigned(FOverlayerForm) and FMove then
begin
ReleaseCapture;
SendMessage(FOverlayerForm.Handle,WM_SYSCOMMAND, SC_MOVE or HTCAPTION, );
FOwner.Show;
if Assigned(FMouseEvent) then FMouseEvent(Sender,Button,Shift, X, Y);
end;
end; procedure TTranslucentForm.OverlayWndMethod(var Msg: TMessage);
begin
if (Msg.Msg = WM_MOVE) and FMove then
begin
if Assigned(FOverlayerForm) then
begin
FOwner.Left := FOverlayerForm.Left ;
FOwner.Top := FOverlayerForm.Top ;
end;
end;
if Msg.Msg = CM_ACTIVATE then
begin
if FFirstTime then FOwner.Show;
FFirstTime := False;
end;
FOldOverlayWndProc(Msg);
end; procedure TTranslucentForm.RenderForm(TransparentValue: Byte);
var
zsize: TSize;
zpoint: TPoint;
zbf: TBlendFunction;
TopLeft: TPoint;
WR: TRect;
GPGraph: TGPGraphics;
m_hdcMemory: HDC;
hdcScreen: HDC;
hBMP: HBITMAP;
FGpBitmap , FBmp: TGpBitmap;
gd : TGpGraphics;
gBrush : TGpSolidBrush;
begin
if (csDesigning in ComponentState) then Exit;
if not FileExists(FBackground) then //如果背景图不存在
begin
FGpBitmap := TGpBitmap.Create(FOwner.Width,FOwner.Height);
gd := TGpGraphics.Create(FGpBitmap);
//颜色画刷
gBrush := TGpSolidBrush.Create(ARGBFromTColor(FOverlayerForm.Color));
//填充
gd.FillRectangle(gBrush,GpRect(,,FGpBitmap.Width,FGpBitmap.Height));
FreeAndNil(gd);
FreeAndNil(gBrush);
end
else
begin
try
//读取背景图
FBmp := TGpBitmap.Create(FBackground);
FGpBitmap := TGpBitmap.Create(FOwner.Width,FOwner.Height);
gd := TGpGraphics.Create(FGpBitmap);
gd.DrawImage(FBmp,GpRect(,,FGpBitmap.Width,FGpBitmap.Height),,,FBmp.Width,FBmp.Height,utPixel);
FreeAndNil(gd);
FreeAndNil(FBmp);
except
Exit;
end;
end;
hdcScreen := GetDC();
m_hdcMemory := CreateCompatibleDC(hdcScreen);
hBMP := CreateCompatibleBitmap(hdcScreen, FGpBitmap.Width, FGpBitmap.Height);
SelectObject(m_hdcMemory, hBMP);
GPGraph := TGPGraphics.Create(m_hdcMemory);
try
GPGraph.DrawImage(FGpBitmap, , , FGpBitmap.Width, FGpBitmap.Height);
zsize.cx := FGpBitmap.Width;
zsize.cy := FGpBitmap.Height;
zpoint := Point(, );
with zbf do
begin
BlendOp := AC_SRC_OVER;
BlendFlags := ;
SourceConstantAlpha := TransparentValue;
AlphaFormat := AC_SRC_ALPHA;
end; GetWindowRect(FOverlayerForm.Handle, WR);
TopLeft := WR.TopLeft;
UpdateLayeredWindow(FOverlayerForm.Handle, , @TopLeft, @zsize, GPGraph.GetHDC, @zpoint,, @zbf, );
finally
GPGraph.ReleaseHDC(m_hdcMemory);
ReleaseDC(, hdcScreen);
DeleteObject(hBMP);
DeleteDC(m_hdcMemory);
GPGraph.Free;
end;
FreeAndNil(FGpBitmap);
end; procedure TTranslucentForm.SetAlpha(const value : Byte);
begin
FAlpha := Value;
RenderForm(FAlpha);
end; procedure TTranslucentForm.SetBackground(const value: TFileName);
begin
FBackground := value;
RenderForm(FAlpha);
end; procedure TTranslucentForm.SetMove(const value: Boolean);
begin
FMove := value;
end; end.

delphi 半透明窗体类的更多相关文章

  1. Delphi 半透明窗体,窗体以及控件透明度

    很简单了 现在,适用所有控件和窗体: delphi设置窗口透明 form1.AlphaBlend :=true; //透明form1.AlphaBlendValue :=180; //透明度form1 ...

  2. DIY Delphi 半透明窗体(2)

    写文章的时候 脑子有点乱 unit uMainForm; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics ...

  3. 转:学习笔记: Delphi之线程类TThread

    学习笔记: Delphi之线程类TThread - 5207 - 博客园http://www.cnblogs.com/5207/p/4426074.html 新的公司接手的第一份工作就是一个多线程计算 ...

  4. 学习笔记: Delphi之线程类TThread

    新的公司接手的第一份工作就是一个多线程计算的小系统.也幸亏最近对线程有了一些学习,这次一接手就起到了作用.但是在实际的开发过程中还是发现了许多的问题,比如挂起与终止的概念都没有弄明白,导致浪费许多的时 ...

  5. 谈谈Delphi中的类和对象3---抽象类和它的实例

    四.抽象类和它的实例 Delphi中有一个类称为是抽象类,你不能天真的直接为它创建一个实例,如 var StrLst: TString; begin StrLst:= TString.Create; ...

  6. Delphi中TStringList类常用属性方法详解

    TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的. 常规的用法大家都知道,现在来讨论它的一些高级的用法. 先把要讨论的几个属性列出来: 1.CommaText 2.Delim ...

  7. Qt窗体关闭时,如何自动销毁窗体类对象

    Qt窗体关闭时,如何自动销毁窗体类对象     要对你的窗口设置WA_DeleteOnClose属性,默认的情况下关闭窗口仅仅意味着隐藏它 ImgWindow1->setAttribute(Qt ...

  8. duilib底层机制剖析:窗体类与窗体句柄的关联

    转载请说明原出处,谢谢~~ 看到群里朋友有人讨论WTL中的thunk技术,让我联想到了duilib的类似技术.这些技术都是为了解决c++封装的窗体类与窗体句柄的关联问题. 这里是三篇关于thunk技术 ...

  9. 【Demo 0025】注册/反注册窗体类RegisterClassEx/UnregisterClass

    所有窗体在创建前都必须注册窗体类,只有注册的窗体类才被系统认知并允许实例化,换句话说通过注册告诉进程窗体管理器此类窗体的属性如: 背景色,窗体上的鼠标样式以及窗体事件处理函数等;  有一些控件类系统自 ...

随机推荐

  1. Python的Django框架中的URL配置与松耦合

    Python的Django框架中的URL配置与松耦合 用 python 处理一个文本时,想要删除其中中某一行,常规的思路是先把文件读入内存,在内存中修改后再写入源文件. 但如果要处理一个很大的文本,比 ...

  2. 聊聊redis的监控工具

    序 本文主要研究一下redis的监控工具 redis-stat redis-stat是一个比较有名的redis指标可视化的监控工具,采用ruby开发,基于redis的info命令来统计,不影响redi ...

  3. Learn Python the hard way, ex35 分支和函数

    #!/usr/bin/python #coding:utf-8 from sys import exit def gold_room(): print "this room is full ...

  4. 【ABAP系列】SAP ABAP模块-ABAP动态指针写法的精髓部分

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP模块-ABAP动 ...

  5. Dp状态设计与方程总结

    1.不完全状态记录<1>青蛙过河问题<2>利用区间dp 2.背包类问题<1> 0-1背包,经典问题<2>无限背包,经典问题<3>判定性背包问 ...

  6. 厉害了,Google大神每天写多少行代码?

    文章转自开源中国社区,编译自:Quora Quora上有个有趣的问题:Google工程师们每天写多少行代码? Google 的 AdMob 全栈工程师 Raymond Farias 在 Quora 发 ...

  7. Linux学习之文件搜索命令

    一.文件搜索命令locate locate 文件名 在后台数据库中按文件名搜索,搜索速度最快 /var/lib/mlocate #locate命令所搜索的后台数据库(数据库不会实时刷新,所以新建的文件 ...

  8. axios 如何获取下载文件的进度条

    exportFun(){         let _that = this         const instance = this.axios.create({           onDownl ...

  9. 高阶函数map,filter,reduce的用法

    1.filter filter函数的主要用途是对数组元素进行过滤,并返回一个符合条件的元素的数组 let nums = [10,20,30,111,222,333] 选出nums中小于100的数: l ...

  10. Error: Chunk.entrypoints: Use Chunks.groupsIterable and filter by instanceof Entrypoint instead

    一.extrack-tex-webpack-plugin作用:为了抽离css样式,防止将样式打包在js中引起页面样式加载错乱的现象二.使用 npm install extract-webpack-pl ...