制作半透明窗口
松本电工实业有限公司电脑部 舒嵩嵩
用过金山词霸的朋友,一定会为其半透明的翻译提示窗口而称奇。究竟这种窗口是如何做出来的呢?下面我们将探讨这种半透明窗口的制作方法。
我们可归纳出实现半透明窗口的步骤:在窗口显示前获取背景图像→ 对背景图像进行滤镜效果处理 → 将处理过的背景图像显示在窗口前面。
1.获取背景图像
要获取背景图像,先用GetDC(0)函数获取整个屏幕设备场景(DC),再用CopyRect函数拷贝窗口的背景到指定的Tbitmap,该Tbitmap就是我们所要的图像了。其中函数GetDC(0)取得的DC可用TCanvas.Handle保存;而CopyRect 是TCancas类的成员函数,作用是从一个Canvas中拷贝一指定区域(Rect)到另一个Canvas 的指定区域。
2.对背景图像进行滤镜效果处理
用循环的方法遍历图像的每一点,将各点的某些频段的光波滤除。其实,滤镜种类繁多,所以算法亦很多,读者可参考相关资料,选择您满意的方法。本文的滤镜是灰色的,实现方法见
TranslucentBmp(Bmp:TBitmap;AColor:TColor;
ATransparent:Longint)。其中,参数Bmp是要处理的图像,AColor是滤镜的颜色,ATransparent是透明度。
完整的源代码如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs,StdCtrls, ExtCtrls, Buttons;
type
TForm1 = class(TForm)
Label1: TLabel;
Shape1: TShape;
Shape2: TShape;
Shape3: TShape;
Shape4: TShape;
Image1: TImage;
SpeedButton1: TSpeedButton;
procedure FormCreate(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
private
{ Private declarations }
//截获背景图像
function GetBackgroundBmp:TBitmap;
//对背景图像进行滤镜处理
procedure TranslucentBmp(Bmp:TBitmap;
AColor:TColor;ATransparent:Longint);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
//以下截获背景图像
function TForm1.GetBackgroundBmp:TBitmap;
var Scn:TCanvas;
h,w:Integer;
begin
Scn:=TCanvas.Create; //建立整个屏幕的画布
h:=ClientHeight; //窗口的高
w:=ClientWidth; //窗口的宽
Result.Height:=h; //设返回位图的高就是窗口的高
Result.Width:=w; //设返回位图的宽就是窗口的宽
try
Scn.Handle:=GetDC(0);//取得整个屏幕的DC
//以下一行将窗口的背景部分复制到指定的
//画布中,也就是本函数的返回值
Result.Canvas.CopyRect(Rect(0,0,w,h),
Scn,Rect(Left,Top,Left+w,Top+h));
ReleaseDC(0, Scn.handle);
finally
Scn.Free;
end;
end;
//以下函数对背景图像进行滤镜处理,
//Bmp是要处理的位图;ATransparent是透明度
procedure TForm1.TranslucentBmp
(Bmp:TBitmap;AColor:TColor;ATransparent:Longint);
var BkColor:COLORREF;
ForeColor:Longint;
R,G,B:Int64;
i,j:Integer;
begin
ForeColor:=ColorToRGB(AColor);
with Bmp.Canvas do
for i:=ClientHeight-1 downto 0 do
for j:=ClientWidth-1 downto 0 do
begin
BkColor:=GetPixel(Handle,j,i); //取得每一像素
R:=Byte(ForeColor)+(Byte(BkColor)
-Byte(ForeColor))*ATransparent;
G:=Byte(ForeColor shr 8)+(Byte
(BkColor shr 8)-Byte(ForeColor shr 8))
*ATransparent;
B:=Byte(ForeColor shr 16)+(Byte
(BkColor shr 16)
-Byte(ForeColor shr 16))*ATransparent;
SetPixelV(Handle,j,i,RGB(R,G,B));//合成像素
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var BackgroundBmp:TBitmap;
begin
try
BackgroundBmp:=Tbitmap.Create;
//建立窗口背景图
BackgroundBmp.PixelFormat:=pf24bit;
//指定该图是24位真彩色
BackgroundBmp:=GetBackgroundBmp;
//取得窗口背景图
TranslucentBmp(BackgroundBmp,clBlack,50);
//对该图像进行滤镜处理
Image1.Picture.Bitmap:=BackgroundBmp;
//将处理过的图像显示出来
finally
BackgroundBmp.Free;
end;
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
Close;
end;
end.
程序的运行效果如图2所示。
以上程序在中文Windows 98、Delphi 4 C/S环境下编译通过。