透明窗体效果?(50分)

  • 主题发起人 主题发起人 nsj
  • 开始时间 开始时间
N

nsj

Unregistered / Unconfirmed
GUEST, unregistred user!
如题
用setlayeredwindowattributes这个API可以轻松的达到透明效果
可是程序一旦出错或者我弹出一个消息框(用messagebox)整个程序都不可用,也就是
不能点击按钮等,所有的操作都不可用。有其它的方法吗?
 
在win2000中,不是可以直接用
AlphaBlend
AlphaBlendValue
 
没用过,能不能通过重画窗体来实现?
 
那用右键菜单实现或者用热键
 
setlayeredwindowattributes在98下不可用的,有局限性.你可用下面的方法做:
procedure TForm1.DoInvisible;
var
AControl: TControl;
A, Margin, X, Y, CtlX, CtlY: Integer;
FullRgn, ClientRgn, CtlRgn: THandle;
begin
//得到边框宽度
Margin := (Width - ClientWidth) div 2;
//First, get form region
FullRgn := CreateRectRgn(0, 0, Width, Height);
X := Margin;
Y := Height - ClientHeight - Margin;
//得到除边框外的区域
ClientRgn := CreateRectRgn(X, Y, X + ClientWidth, Y + ClientHeight);
//FullRgn - ClientRgn 得到的区域
CombineRgn(FullRgn, FullRgn, ClientRgn, RGN_DIFF);
//加上窗体所有控件的区域
for A := 0 to ControlCount - 1 do //得到ControlCount控件个数
begin
AControl := Controls[A];
if (AControl is TWinControl) or (AControl is TGraphicControl)
then with AControl do begin
if Visible then begin
CtlX := X + Left;
CtlY := Y + Top;
CtlRgn := CreateRectRgn(CtlX, CtlY, CtlX + Width, CtlY + Height);
CombineRgn(FullRgn, FullRgn, CtlRgn, RGN_OR);
end;
end;
end;
SetWindowRgn(Handle, FullRgn, TRUE);
end;
{
//别忘了
procedure TForm1.FormDestroy(Sender: TObject);
begin
DeleteObject(ClientRgn);
DeleteObject(FullRgn);
DeleteObject(CtlRgn);
end;
}
 
接受答案了.
 

Similar threads

S
回复
0
查看
822
SUNSTONE的Delphi笔记
S
S
回复
0
查看
751
SUNSTONE的Delphi笔记
S
后退
顶部