delphi 半透明窗体类
来源:互联网 发布:世界简史 知乎 编辑:程序博客网 时间:2024/06/11 06:12
{******************************************************************************* 半透明窗体控件 版本: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 := 255 ; 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, 0); 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(0,0,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(0,0,FGpBitmap.Width,FGpBitmap.Height),0,0,FBmp.Width,FBmp.Height,utPixel); FreeAndNil(gd); FreeAndNil(FBmp); except Exit; end; end; hdcScreen := GetDC(0); m_hdcMemory := CreateCompatibleDC(hdcScreen); hBMP := CreateCompatibleBitmap(hdcScreen, FGpBitmap.Width, FGpBitmap.Height); SelectObject(m_hdcMemory, hBMP); GPGraph := TGPGraphics.Create(m_hdcMemory); try GPGraph.DrawImage(FGpBitmap, 0, 0, FGpBitmap.Width, FGpBitmap.Height); zsize.cx := FGpBitmap.Width; zsize.cy := FGpBitmap.Height; zpoint := Point(0, 0); with zbf do begin BlendOp := AC_SRC_OVER; BlendFlags := 0; SourceConstantAlpha := TransparentValue; AlphaFormat := AC_SRC_ALPHA; end; GetWindowRect(FOverlayerForm.Handle, WR); TopLeft := WR.TopLeft; UpdateLayeredWindow(FOverlayerForm.Handle, 0, @TopLeft, @zsize, GPGraph.GetHDC, @zpoint,0, @zbf, 2); finally GPGraph.ReleaseHDC(m_hdcMemory); ReleaseDC(0, 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.
0 0
- delphi 半透明窗体类
- DIY Delphi 半透明窗体 (1)
- DIY Delphi 半透明窗体(2)
- delphi 异形窗体可半透明
- 半透明窗体
- 半透明窗体
- C# 制作半透明等待窗体的类
- 半透明窗体的制作
- 制作半透明窗体
- 半透明的窗体
- 透明,半透明窗体
- WPF 半透明窗体
- 半透明溅显窗体
- QT绘制半透明窗体
- 窗体重绘,半透明
- 14半透明窗体
- VC半透明窗体
- (WPF) 半透明窗体
- DevExpress VCL for Delphi 各版本收集下载(最新支持Delphi XE 7)
- 作死向之C++告别演出——课程设计(银行储蓄系统(大BUG+功能不完整版))
- Delphi 自带了 Base64 编解码的单元
- linux编译动态库和静态库的makefile示例
- delphi 一个关于xml文件导入数据库的问题
- delphi 半透明窗体类
- 关于java String的“==”和equals()比较、引用的小问题
- 苹果电脑的标志为什么被咬了一口?
- 耿建玲视频总结
- sizeWithFont方法_自定义cell高度
- 推荐系统评测指标—准确率(Precision)、召回率(Recall)、F值(F-Measure)
- 检测新版本
- Sublime Text主题皮肤安装与切换使用方法
- C++实现简单的对象池