delphi 异形窗体可半透明
unit xDrawForm; interface
uses Windows, Messages, SysUtils, Classes, Controls, Forms, Menus,
Graphics,GDIPOBJ,GDIPAPI,GDIPUTIL; type TwwGDIImage = class
public
n_Pos_X : Integer;
n_Pos_Y : Integer;
n_Width : Integer;
n_Height : Integer;
GPImageNormal : TGPImage; procedure CreateImageNormal(wsFileName: WideString;nPosX,nPosY,nW,nH:Integer);
end; TwwGDIButton = class(TwwGDIImage)
public
GPImageHot : TGPImage;
GPImageDown : TGPImage;
end; TwwCanvas = class(TObject)
private
m_hdcMemory: HDC;
hdcScreen: HDC;
hBMP: HBITMAP;
m_Blend: BLENDFUNCTION;
// 事件
FGPGraph: TGPGraphics;
FOnDrawImage: TNotifyEvent; procedure BeginDraw(); // 绘图前置工作
procedure EndDraw(Handle:THandle); // 绘图收尾工作
public
sizeWindow: SIZE;
ptSrc: TPOINT;
n_Handle : THandle;
procedure RePaint(h:THandle);
procedure InitCanvas(nx,ny:Integer);
procedure wwDrawImage(wwGDIImage :TwwGDIImage);
property GPGraph: TGPGraphics read FGPGraph write FGPGraph;
property OnDrawImage: TNotifyEvent read FOnDrawImage write FOnDrawImage;
end; implementation { TwwCanvas } procedure TwwCanvas.BeginDraw;
begin
// 获取桌面屏幕设备
hdcScreen := GetDC();
// 创建一个与指定设备兼容的内存设备上下文环境(DC)
m_hdcMemory := CreateCompatibleDC(hdcScreen);
// 创建与指定的设备环境相关的设备兼容的位图
hBMP := CreateCompatibleBitmap(hdcScreen, sizeWindow.cx, sizeWindow.cy );
// 选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象
SelectObject(m_hdcMemory, hBMP);
// 创建画布
GPGraph := TGPGraphics.Create(m_hdcMemory);
end; procedure TwwCanvas.wwDrawImage(wwGDIImage: TwwGDIImage);
begin
GPGraph.DrawImage(
wwGDIImage.GPImageNormal,
wwGDIImage.n_Pos_X,
wwGDIImage.n_Pos_Y,
wwGDIImage.n_Width,
wwGDIImage.n_Height)
end; procedure TwwCanvas.EndDraw(Handle:THandle);
begin
// 设置窗体风格
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
// 执行透明混合
UpdateLayeredWindow(Handle, hdcScreen, nil,@sizeWindow, m_hdcMemory, @ptSrc, , @m_Blend, ULW_ALPHA);
// 设置窗体位置
SetWindowPos(Handle, HWND_TOPMOST, , , , , SWP_NOMOVE or SWP_NOSIZE); // 各种释放就对了.. 不然画起来会糊
GPGraph.ReleaseHDC(m_hdcMemory);
ReleaseDC(, hdcScreen);
hdcScreen := ;
DeleteObject(hBMP);
DeleteDC(m_hdcMemory);
m_hdcMemory := ;
GPGraph.Free;
end; procedure TwwCanvas.RePaint(h:THandle);
begin
if Assigned(FOnDrawImage) then
begin
BeginDraw();
FOnDrawImage(Self);
EndDraw(h);
end;
end; procedure TwwCanvas.InitCanvas(nx, ny: Integer);
begin
m_Blend.BlendOp := AC_SRC_OVER; // the only BlendOp defined in Windows 2000
m_Blend.BlendFlags := ; // Must be zero
m_Blend.AlphaFormat := AC_SRC_ALPHA; //This flag is set when the bitmap has an Alpha channel
m_Blend.SourceConstantAlpha := ; sizeWindow.cx := nx;
sizeWindow.cy := ny;
ptSrc := Point(,);
end; { TwwGDIImage } procedure TwwGDIImage.CreateImageNormal(wsFileName: WideString;nPosX,nPosY,nW,nH:Integer);
begin
Self.GPImageNormal := TGPImage.Create(wsFileName);
Self.n_Pos_X := nPosX;
Self.n_Pos_Y := nPosY;
Self.n_Width := nW;
Self.n_Height:= nH;
end; end. unit uMainForm; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, GDIPOBJ,GDIPAPI,GDIPUTIL; type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject); private
{ Private declarations }
public
procedure DrawImage(Sender: TObject);
{ Public declarations }
end; var
Form1: TForm1; implementation
uses xDrawForm;
var
wwCanvas : TwwCanvas = nil;
img_BackGround: TwwGDIImage= nil; // 背景图
// img_ProgressBar1: TwwGDIImage= nil; // 上滚动条
// img_ProgressBar2: TwwGDIImage= nil; // 下滚动条
// img_Lighting: TwwGDIImage= nil; // 闪光点 {$R *.dfm} procedure TForm1.DrawImage(Sender: TObject);
begin
TwwCanvas(Sender).wwDrawImage(img_BackGround);
end; procedure TForm1.FormCreate(Sender: TObject);
begin
DoubleBuffered := True;
BorderStyle := bsNone;
wwCanvas := TwwCanvas.Create();
wwCanvas.InitCanvas(,);
wwCanvas.OnDrawImage := Self.DrawImage; img_BackGround := TwwGDIImage.Create();
img_BackGround.CreateImageNormal('BackGround.png',,,,); end; procedure TForm1.FormShow(Sender: TObject);
begin
wwCanvas.RePaint(Self.Handle);
end; end.
delphi 异形窗体可半透明的更多相关文章
- DELPHI 异形窗体
一定有很多人看到过一些奇形怪状的窗体,例如一些屏幕精灵.其实实现起来非常容易,做到三点就好啦.下面我使用Delphi做了一个VCL控件(TBmpShape),你只需要指定一幅图片就可以将窗体变成你的图 ...
- Qt绘制异形窗体
异形窗体即不规则窗体,一般采用png图片,一般绘制异形窗体分两步: 1.设置遮罩区 2.绘制图片 使用png图片的透明部分作为遮罩区,然后绘制图片,这样我们就看到一个只绘制了非透明部分的图形,废话 ...
- FireMonkey下的异形窗体拖动(句柄转换)
DelphiXE2 Firemoney FMX 的窗体不只是为windows的, 所以很多功能都没有了. 最常见的就是拖拽了 先看 VCL时代 一个经典拖动代码 ReleaseCapture(); S ...
- DSAPI显示PNG异形窗体
使用DSAPI实现PNG异形窗体,注意,该窗体为层样式窗体,以PNG或32位带透明通道的图像合成到屏幕,此方法不会触发窗体的重绘,故原窗体(包括其子控件)均不会显示,如果需要更新画面,需要重新用代码等 ...
- FireMonkey下的异形窗体拖动(需要使用FmxHandleToHwnd函数转化一下句柄)
DelphiXE2 Firemoney FMX 的窗体不只是为windows的, 所以很多功能都没有了. 最常见的就是拖拽了 先看 VCL时代 一个经典拖动代码 ReleaseCapture(); S ...
- delphi实现窗体闪烁功能
delphi实现窗体闪烁功能 以前做窗口闪动时都没有考虑到让任务栏上的按钮闪动的问题, 现在一个客户需要任务栏按钮闪动,发现以前使用的flashwindow不能达到要求了, 查找了一下,找到flash ...
- Delphi中窗体的事件
Delphi中窗体的事件 Form窗体可以响应各种各样的时间,在Object Inspector的Events页面中罗列了一大堆,如下图: 下面将要列出一些常用的事件. 1.OnActivate 当窗 ...
- Qt 实现 异形 窗体&按钮
//关键部分代码如下//设置异形窗体 //setWindowOpacity(0.5);//设置窗体透明度 0完全透明,1完全不透明 this->setWindowFlag(Qt::Framele ...
- Delphi下创建异形窗体
procedure TForm1.FormCreate(Sender: TObject);var pt: array [0 .. 4] of TPoint; m_rgn: HRGN;begin ...
随机推荐
- Invalid bound statement (not found)--spring boot集成mybatis
问题: {"timestamp":"2019-07-02T10:21:32.379+0000","status":500,"err ...
- 【自动化测试】WebDriver使用
from selenium import webdriver from selenium.webdriver.common.keys import Keys from bs4 import Beaut ...
- Linux运维工程师需掌握的技能
笔者是运维工程师,对Linux方面有点心得,现在说一下需要掌握哪方面的工具吧.说到工具,在行外可以说是技能,在行内我们一般称之为工具,就是运维必须要掌握的工具.我就大概列出这几方面,这样入门就基本没有 ...
- Optimal Value Functions and Optimal Policy
Optimal Value Function is how much reward the best policy can get from a state s, which is the best ...
- Parentheses Sequence微软编程笔试
描述 You are given a sequence S of parentheses. You are asked to insert into S as few parentheses as p ...
- libOpenThreads库链接冲突错误
最近在linux 上安装了3.7.0版本的OpenSceneGraph,而在安装之前没有完全卸载之前安装的3.6.3版本,导致在编译程序链接时出现库引用冲突,在便以后出现以下警告信息: /usr/bi ...
- 12、numpy——数学函数
NumPy 数学函数 NumPy 包含大量的各种数学运算的函数,包括三角函数,算术运算的函数,复数处理函数等. 1.三角函数 NumPy 提供了标准的三角函数:sin().cos().tan(). i ...
- P3191 [HNOI2007]紧急疏散EVACUATE(费用流)
P3191 [HNOI2007]紧急疏散EVACUATE 费用流+卡常优化 我们只关心一个人通过门时的时间,在空地的行走时间可以分层维护 于是根据时间分层,到门的时候再计算代价,即代价$=$层数 每经 ...
- Identity MVC:UI
基于原来做的cookie认证的代码:MvcCookieAuthSample 增加登陆和退出的方法: 增加Login和SignIn这两个Action方法. 在Views下面创建Account文件夹,然后 ...
- 二进制部署k8s
一.二进制部署 k8s集群 1)参考文章 博客: https://blog.qikqiak.com 文章: https://www.qikqiak.com/post/manual-install-hi ...