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 异形窗体可半透明的更多相关文章

  1. DELPHI 异形窗体

    一定有很多人看到过一些奇形怪状的窗体,例如一些屏幕精灵.其实实现起来非常容易,做到三点就好啦.下面我使用Delphi做了一个VCL控件(TBmpShape),你只需要指定一幅图片就可以将窗体变成你的图 ...

  2. Qt绘制异形窗体

    异形窗体即不规则窗体,一般采用png图片,一般绘制异形窗体分两步: 1.设置遮罩区 2.绘制图片   使用png图片的透明部分作为遮罩区,然后绘制图片,这样我们就看到一个只绘制了非透明部分的图形,废话 ...

  3. FireMonkey下的异形窗体拖动(句柄转换)

    DelphiXE2 Firemoney FMX 的窗体不只是为windows的, 所以很多功能都没有了. 最常见的就是拖拽了 先看 VCL时代 一个经典拖动代码 ReleaseCapture(); S ...

  4. DSAPI显示PNG异形窗体

    使用DSAPI实现PNG异形窗体,注意,该窗体为层样式窗体,以PNG或32位带透明通道的图像合成到屏幕,此方法不会触发窗体的重绘,故原窗体(包括其子控件)均不会显示,如果需要更新画面,需要重新用代码等 ...

  5. FireMonkey下的异形窗体拖动(需要使用FmxHandleToHwnd函数转化一下句柄)

    DelphiXE2 Firemoney FMX 的窗体不只是为windows的, 所以很多功能都没有了. 最常见的就是拖拽了 先看 VCL时代 一个经典拖动代码 ReleaseCapture(); S ...

  6. delphi实现窗体闪烁功能

    delphi实现窗体闪烁功能 以前做窗口闪动时都没有考虑到让任务栏上的按钮闪动的问题, 现在一个客户需要任务栏按钮闪动,发现以前使用的flashwindow不能达到要求了, 查找了一下,找到flash ...

  7. Delphi中窗体的事件

    Delphi中窗体的事件 Form窗体可以响应各种各样的时间,在Object Inspector的Events页面中罗列了一大堆,如下图: 下面将要列出一些常用的事件. 1.OnActivate 当窗 ...

  8. Qt 实现 异形 窗体&按钮

    //关键部分代码如下//设置异形窗体 //setWindowOpacity(0.5);//设置窗体透明度 0完全透明,1完全不透明 this->setWindowFlag(Qt::Framele ...

  9. Delphi下创建异形窗体

    procedure TForm1.FormCreate(Sender: TObject);var  pt: array [0 .. 4] of TPoint;  m_rgn: HRGN;begin   ...

随机推荐

  1. 神经网络 fann 教程 英文 以及 翻译 参考

    http://fann.sourceforge.net/fann_en.pdf http://blog.csdn.net/fengshuiyue/article/details/41446257

  2. Vim 8.0 版本安装方法及添加Python支持

    利用Git安装 最简单也是最有效的方法 1. 获取Vim仓库: git clone https://github.com/vim/vim.git 2. 升级到最新的版本: cd vim git pul ...

  3. Vue Cli 3:vue.config.js配置文件

    Vue Cli 3生成的项目结构,没有build.config目录,而是使用vue.config.js来进行配置. vue.config.js 是一个可选的配置文件,如果项目的 (和 package. ...

  4. 手撸红黑树-Red-Black Tree 入门

    一.学习红黑树前的准备: 熟悉基础数据结构 了解二叉树概念 二.红黑树的规则和规则分析: 根节点是黑色的 所有叶子节点(Null)是黑色的,一般会认定节点下空节点全部为黑色 如果节点为红色,那么子节点 ...

  5. Using Tensorflow SavedModel Format to Save and Do Predictions

    We are now trying to deploy our Deep Learning model onto Google Cloud. It is required to use Google ...

  6. JS动态添加Easyui的HTML时样式丢失

    解决办法: $.parser.parse($("#creatLi").html(<li>xxxxxx</li>)); ------------------- ...

  7. [CF643E]Bear and Destroying Subtrees(期望,忽略误差)

    Description: ​ 给你一棵初始只有根为1的树 ​ 两种操作 ​ 1 x 表示加入一个新点以 x为父亲 ​ 2 x 表示以 x 为根的子树期望最深深度 ​ 每条边都有 \(\frac{1}{ ...

  8. 20、numpy——IO

    NumPy IO Numpy 可以读写磁盘上的文本数据或二进制数据. NumPy 为 ndarray 对象引入了一个简单的文件格式:npy. npy 文件用于存储重建 ndarray 所需的数据.图形 ...

  9. CSV的规范与使用

    CSV可以通过Excel打开,数据格式比较小,通过记事本打开一个CSV文件, 便知道在csv里面,每一个单元格的数据都是通过逗号来分割的.所以在csv里面切记:单元格数据不要出现逗号 格式: 第一行: ...

  10. 使用Anaconda3安装tensorflow,opencv,使其可以在spyder中运行

    使用Anaconda5.0.0 1.首选无论你是在cmd键入python,还是在Anaconda Prompt键入python,显示的都是Python3.6.然而在Spyder(tensorflow) ...