{*******************************************************************************
半透明窗体控件
版本: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. SHELL脚本里执行的东西需要多次回车确认,怎么实现自动回车确认?

    写了个自动配置的shell脚本,其中有几行是 …… ./build-key-server ./build-key-client …… 在执行build-key-server和build-key-cli ...

  2. MySQL 查询语句--------------进阶6:连接查询

    #进阶6:连接查询 /* 含义:多个表格连接,当查询的字段来自于多个表时候,就会用到连接查询 我觉得这里类似于excel中的vlookup函数 笛卡尔乘积现象:表1有m行,表2有n行,结果有m*n行 ...

  3. Decision Tree Algorithm

    Decision Tree算法的思路是,将原始问题不断递归地细分为子问题,直到子问题直接可获得答案为止.在模型训练的过程中,根据训练集去做树的生长(Grow the tree),生长所有可能的Bran ...

  4. Apache Shiro简单介绍

    1. 概念 Apache Shiro 是一个开源安全框架,提供身份验证.授权.密码学和会话管理.Shiro 框架具有直观.易用等特性,同时也能提供健壮的安全性,虽然它的功能不如 SpringSecur ...

  5. php的优势与缺点

    PHP即“超文本预处理器”,是一种通用开源脚本语言.PHP是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言.PHP独特的语法混合了C.Java.Perl以及 PHP 自创的语法.利于学习 ...

  6. MySQL-第N篇杂记

    1.数据的导入导出 2.查询结果的重定向 3.ON DUPLICATE KEY UPDATE对于指定的主键或者唯一键,insert时发生冲突则进行update操作. 4.解决MySQL中问乱码问题,分 ...

  7. python安装numpy

    命令介绍: D:\computerSoft\python3.6.4\Scripts>python36 pip3.6.exe install numpy # 通过pip下载对应版本的numpy,然 ...

  8. 虚拟机VMware,安装中标麒麟系统,64位的,版本6.0,并安装qt

    为了使用qt开发,安装中标麒麟系统. 虚拟机中安装,本来安装的是32位麒麟系统,结果发现qt无法安装(官网提供的是64位的run程序). qt安装的是qt-opensource-linux-x64-5 ...

  9. 洛谷 P1892 [BOI2003]团伙(种类并查集)

    传送门 解题思路 用并查集f存朋友关系,一个数组e存的是敌人关系,是一个辅助数组,所以叫做种类并查集. 当p和q是朋友时,直接合并,但是当是敌人时,需要一些操作. 当p还没有敌人时(即p的敌人是自己) ...

  10. yum安装时出现No more mirrors to try.

    可能原因:可能是不正常删除造成的 解决方法: yum clean allyum makecacheyum -y update 然后重新安装