{*******************************************************************************
半透明窗体控件
版本: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. day17—Flex弹性布局详解(一)

    转行学开发,代码100天——2018-04-02 今天看到一篇大神的文章,关于flex布局的详解,对flex用法介绍的相当详细,非常有助于我等初学者更深入了解这种布局方式. 文章链接 [基础知识]Fl ...

  2. python实现压缩文件成zip格式

    实现代码如下: #压缩文件 import time,zipfile class zip: def get_zip(self,files,zip_name): zp=zipfile.ZipFile(zi ...

  3. 牛顿迭代法理论推导及python代码实现

    公式不便于在这里编辑,所以在word中编辑好了,截图过来. 用python+牛顿迭代法   求 y =(x-2)**3的解 import numpy as np import matplotlib.p ...

  4. 学习ECMAScript标准和具体实现-JavaScript

    在NDN的JavaScript Guide里,Array和Map,Set都属于collections of data.它们的区别就是,Array是ordered by an index value,  ...

  5. python学习第十五天集合的创建和基本操作方法

    集合是python独有的数据列表,集合可以做数据分析,集合是一个无序的,唯一的的数据类型,可以确定列表的唯一性,说一下集合的创建和基本常见操作方法 1,集合的创建 s={1,2,4} 也可以用set( ...

  6. ADC(简易的DMA传输)的认识

    ADC(简易的DMA传输)的认识 首先看到是ADC的特性 1.ADC的12位分辨率.不能直接测量负电压,然后是最小量程化单位是LSB=Vref+/212 2.单次和转换模式的使用 3. 从通道0到通道 ...

  7. adb shell常用命令总结

    一.文件操作相关命令 1.文件操作命令 子命令 参数 说明 cd 无 进入目录 cat [-beflnstuv] [-B bsize] [file...] 查看文件内容-n:显示行号-b:显示行号,但 ...

  8. JS的video获取时长,出现问题汇总

    <video id="my_video_1" controls="controls" style=" width: 700px; height: ...

  9. 下载了包在node_modules中,但没有在package.json中保存该包信息。

    发现安装了包,但没有在package.json中保存该包信息,而且没有创建package-lock.json. 经过测试,发现是使用cnpm的原因,使用npm安装不会出现这样的问题,(与cnpm版本无 ...

  10. mpvue中的平台状态判断(H5网页 or 小程序)

    在开发微信小程序或者微信网页H5的时候,有时我们利用外部组件可能不兼容这两者,需要区分开来,可以在对应的mainjs中配置如下 let platform: try{ if(wx){ platform= ...