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. HTML5移动应用——小心代码注入风险

    近日在加州举行的移动安全技术大会上,Syracuse大学的研究者的研究报告显示HTML5移动应用可能会给企业带来新的安全风险.开发者的错误可能导致HTML5应用自动执行攻击者通过Wifi蓝牙或短信发送 ...

  2. 【ABAP系列】SAP ABAP基础-SQL的嵌套使用

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP基础-SQL的嵌 ...

  3. Recurrent Neural Network(1):Architecture

    Recurrent Neural Network是在单个神经元上,除了输入与输出外,添加了一条Recurrent回路.也就是说,节点当前的状态将会影响其未来的状态.下式可以表征此关系: st= f(s ...

  4. C# 文件、byte相互转换

    文件转byte数组: /// <summary> /// 将文件转换为byte数组 /// </summary> /// <param name="path&q ...

  5. selenium python 报错“ unable to find binary in default location”

    selenium python 报错如下: raise exception_class(message, screen, stacktrace)selenium.common.exceptions.W ...

  6. 那些年很脑残的bugs

    1.老师给了前端界面,我们用java写后台. 我改了表单form的action属性,让它跳到自己写的servlet上面去.自己在servlet里面对数据库一顿操作猛如虎,然后让servlet跳回原来页 ...

  7. spring boot 配置文件优先级

    项目中可能存在多个配置文件,那么优先级定义如下: 1.同一目录,application.properties优先级高于application.yml 2.同一目录,config文件夹下的配置文件高于根 ...

  8. 如何在linux命令行无界面下使用selenium

    1.安装Xvfb和pyvirtualdisplay sudo apt-get install xvfbpip install pyvirtualdisplay 2.安装chrome, chromedr ...

  9. 分析abex'crackme#2

    文件地址:https://www.wocloud.com.cn/webclient/share/sindex.action?id=i9K_Br6TgE4gbyGIlYkffWKcRy5TUdZ8U6_ ...

  10. js的label标签语句与with语句的用法

    /** * label标签语句 * - 语法: * 标签名: 语句 * 如:start: n = 1; * 上面标签start可以被之后的break或continue语句引用 * - label标签语 ...