http://hi.baidu.com/bluew/blog/item/2ecbe58bf93a937d9f2fb4de.html2007-08-09 00:52   我是用PNG图片Alpha透明的方式做的窗口,这种方法一个好处就是不用通过编程来控制窗口外观。Delphi7设置一下窗体的BorderStyle、Color、Transparent、TransparentColor属性就可以搞定异型窗口,但不是半透明的。UpdateLayeredWindow函数里设置Blend函数就可以实现半透明异型窗体。最近有个哥们网上弄来个老外用VC写的代码,他找人翻译成BCB的,因为BCB本身就支持GDI+,而Delphi不支持,所以我又找GDI+的类,我又改写成Delphi版的了,程序编译运行候效果很不错。需要两个pas文件:GDIPAPI, GDIPOBJ网上都有,唯一缺点是无法放VCL组件!放了也看不到,我真是晕啊,各位也帮忙看一下怎么解决??以下是全部源码:
//======================================
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,
GDIPAPI, GDIPOBJ, Menus, StdCtrls; //http://www.progdigy.com/modules.php?name=gdiplus

type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
Close1: TMenuItem;
ChangeSkin1: TMenuItem;
About1: TMenuItem;
N1: TMenuItem;
N2: TMenuItem;
Edit1: TEdit;
Button1: TButton;
Stayontop1: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Close1Click(Sender: TObject);
procedure ChangeSkin1Click(Sender: TObject);
procedure About1Click(Sender: TObject);
procedure Stayontop1Click(Sender: TObject);
private
m_Blend: BLENDFUNCTION;
procedure SetTransparent(lpSkinFile: WideString; nTran: integer);
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
BorderStyle := bsNone;
m_Blend.BlendOp := AC_SRC_OVER; // the only BlendOp defined in Windows 2000
m_Blend.BlendFlags := 0; // Must be zero
m_Blend.AlphaFormat := AC_SRC_ALPHA;//This flag is set when the bitmap has an Alpha channel
m_Blend.SourceConstantAlpha := 255;
if(FileExists(ExtractFilePath(ParamStr(0)) + 'test.png')) then
SetTransparent(WideString(ExtractFilePath(ParamStr(0)) + 'test.png'), 100);
// Stay on top
SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);
end;

procedure TForm1.SetTransparent(lpSkinFile: WideString; nTran: integer);
var
GPImage: TGPImage;
GPGraph: TGPGraphics;
m_Image: TGPImage;

m_hdcMemory: HDC;
hdcScreen: HDC;
hBMP: HBITMAP;

sizeWindow: SIZE;
rct: TRECT;
ptSrc: TPOINT;
begin
// Use GDI+ load image
GPImage:= TGPImage.Create();
m_Image:= GPImage.FromFile( lpSkinFile );

// Create Compatible Bitmap
hdcScreen := GetDC(0);
m_hdcMemory := CreateCompatibleDC(hdcScreen);
hBMP := CreateCompatibleBitmap(hdcScreen, m_Image.GetWidth(), m_Image.GetHeight());
SelectObject(m_hdcMemory, hBMP);

// Alpha Value
if (nTran<0) or (nTran >100) then
nTran := 100;
m_Blend.SourceConstantAlpha := round(nTran * 2.55); // 1~255
GetWindowRect(Handle, rct);

GPGraph:= TGPGraphics.Create(m_hdcMemory);
GPGraph.DrawImage(m_Image, 0, 0, m_Image.GetWidth(), m_Image.GetHeight());

sizeWindow.cx:= m_Image.GetWidth();
sizeWindow.cy:= m_Image.GetHeight();

ptSrc.x:= 0;
ptSrc.y:= 0;

// Set Window style
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);

// perform the alpha blend
UpdateLayeredWindow(Handle, hdcScreen, nil,
@sizeWindow, m_hdcMemory, @ptSrc, 0, @m_Blend, ULW_ALPHA);
//Release resources
GPGraph.ReleaseHDC(m_hdcMemory);
ReleaseDC(0, hdcScreen);
hdcScreen := 0;

DeleteObject(hBMP);

DeleteDC(m_hdcMemory);
m_hdcMemory := 0;

m_Image.Free;
GPGraph.Free;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if(Button = mbLeft) then
begin
ReleaseCapture();
Perform(WM_SYSCOMMAND, SC_MOVE or HTCAPTION, 0);
end;
end;

procedure TForm1.Close1Click(Sender: TObject);
begin
Close();
end;

procedure TForm1.ChangeSkin1Click(Sender: TObject);
var
dlgOpen: TOpenDialog;
begin
dlgOpen := TOpenDialog.Create(Self);
dlgOpen.Filter := 'PNG file(*.png)|*.png';
if(dlgOpen.Execute()) then
begin
SetTransparent(WideString(dlgOpen.FileName), 100);
Invalidate();
end;
dlgOpen.Free;
end;

procedure TForm1.About1Click(Sender: TObject);
begin
MessageDlg('GDI plus API by: http://www.progdigy.com '#13 +
'C++Builder example by: http://www.ccrun.com '#13 +
'Delphi example by: http://www.handsomesoft.com ',mtInformation, [mbOK], 0);
end;

procedure TForm1.Stayontop1Click(Sender: TObject);
var
mi: TMenuItem;
WindowPos: HWND;
begin
mi := Sender as TMenuItem;
mi.Checked := not mi.Checked;
if mi.Checked then
WindowPos:= HWND_TOPMOST
else
WindowPos:= HWND_NOTOPMOST;
SetWindowPos(Handle, WindowPos,
0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);
end;

end.

GDI+用PNG图片做半透明异型窗口的更多相关文章

  1. GDI+用PNG图片做半透明异型窗口

    {*******************************************************} {                                          ...

  2. 【C++自绘控件】如何用GDI+来显示图片

    在我们制作一个应用软件的时候往往需要在窗口或控件中添加背景图.而图片不仅有BMP格式的,还有JPEG.PNG.TIFF.GIF等其它的格式.那么如何用jpg格式的图片来当背景呢? 这里用到了GDI+, ...

  3. background-clip 背景图片做适当的裁剪

    background-clip 用来将背景图片做适当的裁剪以适应实际需要. 语法: background-clip : border-box | padding-box | content-box | ...

  4. 机器学习进阶-图像金字塔与轮廓检测-图像金字塔-(**高斯金字塔) 1.cv2.pyrDown(对图片做向下采样) 2.cv2.pyrUp(对图片做向上采样)

    1.cv2.pyrDown(src)  对图片做向下采样操作,通常也可以做模糊化处理 参数说明:src表示输入的图片 2.cv2.pyrUp(src) 对图片做向上采样操作 参数说明:src表示输入的 ...

  5. [翻译] MCProgressView 使用自定义图片做进度显示

    MCProgressView 使用自定义图片做进度显示 https://github.com/Baglan/MCProgressView Progress bar view with custom i ...

  6. python 对图片做垂直投影

    Python 对图片做垂直投影 本文利用opencv对图片进行垂直投影,做出垂直投影图,大体思路:打开图片,灰度化,二值化,按列进行统计,新建一个大小和原图一样的图片,按列进行填充: cv2.cv.G ...

  7. GDI+中GIF图片的显示

    某位网友曾经问过我GDI+中Gif图像显示的问题,一直没时间给你写,在此致歉.我把这篇文章送给他. 一.GIF格式介绍 1.概述 GIF(Graphics Interchange Format,图形交 ...

  8. IE6 png图片实现半透明的方法

    IE6中支持PNG半透明图片完美解决方法-divcss5亲測 从IE7及IE7以上版本号都支持PNG半透明格式图片,而只有IE6不支持png格式透明图片,而GIF半透明效果不及png半透明格式图片,由 ...

  9. GDI+ 支持的图片文件格式

    您可以使用许多标准格式将位图储存在磁盘文件中.GDI+ 支持以下各种图片文件格式. o 位图 (BMP) 位图是 Windows 用来储存设备无关和与应用程序无关的图片的标准格式.文件头决定了指定的位 ...

随机推荐

  1. eclipse启动Failed to load the JNI shared library

    由于安装jdk安装了多个版本,用其他开发工具,某天再打开eclipse时弹出“Failed to load the JNI shared library jvm.dll” 原因:eclipse的版本与 ...

  2. 浅谈异步上传插件 jquery-file-upload插件

    当我们需要异步上传文件的时候,我们倾向于在网上查找相关的JQuery插件,jquery-file-upload就是我们经常看到的,但是他的主页是英文的,对于我们这些英语比较差的同学来说,简直就是... ...

  3. python输入问题

    1.关于python的输入问题: 在2.x版本单行单输入input,单行多输入raw_input 在3.x版本中就已经没有raw_input,只有input,单行单输入多输入都可以. 类似2 3 4的 ...

  4. Clickhouse集群部署

    1.集群节点信息 10.12.110.201 ch201 10.12.110.202 ch202 10.12.110.203 ch203 2. 搭建一个zookeeper集群 在这三个节点搭建一个zo ...

  5. 【记录】spring boot 图片上传与显示

    问题:spring boot 使用的是内嵌的tomcat, 文件上传指定目录时不知道文件上传到哪个地方,不知道访问路径. //部署到服务器的tomcat上时通常使用这种方式request.getSer ...

  6. 函数计算工具链新成员 —— Fun Local 发布啦

    刚刚,我们发布了函数计算工具链的新成员,Fun Local.欢迎大家使用! 如果你还不了解 Fun 是什么,我们来简单解释下. Fun 是什么 Fun 是 have Fun with Serverle ...

  7. Android中的Service 与 Thread 的区别

    很多时候,你可能会问,为什么要用 Service,而不用 Thread 呢,因为用 Thread 是很方便的,比起 Service 也方便多了,下面我详细的来解释一下. 1). Thread:Thre ...

  8. 模拟+双指针——cf1244E

    排一遍序然后用l,r指针进行移动,每次移动的是靠1,或靠n更近的那个指针 #include<bits/stdc++.h> using namespace std; typedef long ...

  9. linux中CentOS、Ubuntu、Debian三个版本系统 差别

    Linux有非常多的发行版本,从性质上划分,大体分为由商业公司维护的商业版本与由开源社区维护的免费发行版本. 商业版本以Redhat为代表,开源社区版本则以debian为代表.这些版本各有不同的特点, ...

  10. Delphi 2010 XE 中使用 JSON 之 SuperObject68-6

    JSON之SuperObject(1):一直盼着Delphi能够直接支持"正则:Delphi2009刚来的时候,有了JSON,但:Delphi2010带了两个相关单元:DBXJS:我想不等了 ...