如何实现控件半透明(50分)

  • 主题发起人 wubo830814
  • 开始时间
W

wubo830814

Unregistered / Unconfirmed
GUEST, unregistred user!
现在窗体是透明的,控件是不透明的,如何实现控件半透明,
用什么函数,或者有什么第三方控件可以实现,谢谢
 
H

hs-kill

Unregistered / Unconfirmed
GUEST, unregistred user!
。。。。。设置AlphaBlend和AlphaBlendValue就能实现全部半透明......
我到是很想知道你是怎么实现的只有窗体透明控件不透明的?
 
X

xuegaoyili

Unregistered / Unconfirmed
GUEST, unregistred user!
学习学习。楼主和一楼可以相互学习了
 

菜鸟黄

Unregistered / Unconfirmed
GUEST, unregistred user!
W

wubo830814

Unregistered / Unconfirmed
GUEST, unregistred user!
2楼,你把transparentcolor := true;transparentcolorvalue设成没有焦点的颜色,再把form的color设成此颜色,就可以实现窗体透明控件不透明了
有没有知道异形窗体的边缘锯齿怎么处理成光滑的
 

浪人情哥

Unregistered / Unconfirmed
GUEST, unregistred user!
就是哈,楼主说一说怎么实现窗体透明,控件不透明
 
H

hs-kill

Unregistered / Unconfirmed
GUEST, unregistred user!
哦......原来你做的是完全透明啊.......我还以为是半透明
异型窗体?看你是用什么方法做的了.......如果是用GDI+画png图片之类的就不会有锯齿
如果是用rgn来做的....那就要看你异型窗体的原形细致程度了,可以细致到1像素的
 
W

wubo830814

Unregistered / Unconfirmed
GUEST, unregistred user!
hs-kill
能不能说一下这两种方法具体的实现呀,我谢谢你了
我用的是png,怎么用GDI呢,我还没用过
rgn怎么设置成1像素呢,
 
H

hs-kill

Unregistered / Unconfirmed
GUEST, unregistred user!
GDI+ 我也不太懂......下面是个测试程序,最大的毛病就是显示不了普通控件了
RGN你是怎么做的? 我一般都是从一副图像里来获得窗口范围的
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,pngimage, StdCtrls, gdipapi, gdipobj, ExtCtrls;
type
TForm1 = class(TForm)
OpenDialog1: TOpenDialog;
procedure FormCreate(Sender: TObject);
procedure FormMouseDown(Sender: TObject;
Button: TMouseButton;
Shift: TShiftState;
X, Y: Integer);
procedure FormMouseMove(Sender: TObject;
Shift: TShiftState;
X,
Y: Integer);
procedure FormDblClick(Sender: TObject);
private
{ Private declarations }
ox,oy:integer;
public
{ Public declarations }
end;

const
WS_EX_LAYERED = $80000;
LWA_COLORKEY = 1;
LWA_ALPHA = 2;
ULW_COLORKEY = 1;
ULW_ALPHA = 2;
ULW_OPAQUE = 4;
var
Form1: TForm1;
dc:hdc;
Function UpdateLayeredWindow(hWnd : HWND;
hdcDst : HDC;
pptDst : PPoint;
psize : PSize;
hdcSrc : HDC;
pptSrc : PPoint;
crKey : COLORREF;
pblend : PBlendFunction;
dwFlags : DWORD): BOOL;
stdcall;
implementation
{$R *.dfm}
Function UpdateLayeredWindow;
external 'user32.dll';
procedure DrawAlphiPic(AHandle:HWND;Pic:string;ACanvas:TCanvas;var ARect:Trect);
var
pt1, pt2 : TPoint;
sz : TSize;
bf : TBlendFunction;
bmp : HBITMAP;
gpbmp:tgpbitmap;
begin
SetWindowLong(AHandle, GWL_EXSTYLE, GetWindowLong(AHandle, GWL_EXSTYLE) or WS_EX_LAYERED);
gpbmp:=tgpbitmap.Create(Pic);
try
pt1 := Point(ARect.Left, ARect.Top);
//窗口做上角的坐标
pt2 := Point(0, 0);
sz.cx := gpbmp.GetWidth;
sz.cy := gpbmp.GetHeight;
ARect.Right:=ARect.Left+sz.cx;
ARect.Bottom:=ARect.Top+sz.cy;
bf.BlendOp := AC_SRC_OVER;
bf.BlendFlags := 0;
bf.SourceConstantAlpha := $ff;
bf.AlphaFormat := AC_SRC_ALPHA;
//-----------------------------------
gpbmp.GetHBITMAP(0,bmp);
finally
gpbmp.Free;
end;
DC := CreateCompatibleDC(ACanvas.Handle);
SelectObject(DC, bmp);
UpdateLayeredWindow(AHandle, ACanvas.Handle, @pt1, @sz, DC, @pt2,0, @bf,ULW_ALPHA);
DeleteDC(dc);
DeleteObject(bmp);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
tmprect:trect;
w,h:integer;
begin
tmprect:=BoundsRect;
DrawAlphiPic(Handle,extractfilepath(application.ExeName)+'test.png',Canvas,tmprect);
w:=tmprect.Right-tmprect.Left;
h:=tmprect.Bottom-tmprect.Top;
SetBounds(tmprect.Left,tmprect.Top,w,h);
end;

procedure TForm1.FormMouseDown(Sender: TObject;
Button: TMouseButton;
Shift: TShiftState;
X, Y: Integer);
begin
ox:=mouse.CursorPos.X;
oy:=mouse.CursorPos.Y;
end;

procedure TForm1.FormMouseMove(Sender: TObject;
Shift: TShiftState;
X,
Y: Integer);
begin
if ssleft in shift then
begin
left:=left+mouse.CursorPos.X-ox;
top:=top+mouse.CursorPos.Y-oy;
ox:=mouse.CursorPos.X;
oy:=mouse.CursorPos.Y;
end;
end;

procedure TForm1.FormDblClick(Sender: TObject);
var
tmprect:trect;
w,h:integer;
begin
if OpenDialog1.Execute then
begin
tmprect:=BoundsRect;
DrawAlphiPic(Handle,OpenDialog1.FileName,Canvas,tmpRect);
w:=tmprect.Right-tmprect.Left;
h:=tmprect.Bottom-tmprect.Top;
SetBounds(tmprect.Left,tmprect.Top,w,h);
end;
end;

end.
 
W

wubo830814

Unregistered / Unconfirmed
GUEST, unregistred user!
var
FormUserBackground: TFormUserBackground;
implementation
uses HalfTransParentBackground;
{$R *.dfm}
procedure TFormUserBackground.FormCreate(Sender: TObject);
var
x, y: HRgn;
begin
SetWindowLong(Handle, GWL_STYLE, GetWindowLong(Handle, GWL_STYLE) and (not WS_CAPTION));
Left := 0;
Top := 0;
x := CreateEllipticRgn(7, 7, Width - 6, Height - 6);
y := CreateEllipticRgn(81, 81, Width - 80, Height - 80);
CombineRgn(y, x, y, RGN_XOR);
SetWindowRgn(Handle, y, True);
end;

procedure TFormUserBackground.FormMouseDown(Sender: TObject;
Button: TMouseButton;
Shift: TShiftState;
X, Y: Integer);
begin
MX := X;
MY := Y;
end;

procedure TFormUserBackground.FormMouseMove(Sender: TObject;
Shift: TShiftState;
X, Y: Integer);
begin
if ssleft in Shift then
begin
FormHalfTransParentBackground.Left := FormHalfTransParentBackground.Left + X - MX;
FormHalfTransParentBackground.Top := FormHalfTransParentBackground.Top + Y - MY;
end;
end;
 
W

wubo830814

Unregistered / Unconfirmed
GUEST, unregistred user!
我可以和你在qq上聊吗 qq:253817622
 
H

hs-kill

Unregistered / Unconfirmed
GUEST, unregistred user!
CreateEllipticRgn啊 锯齿没办法.....要想光滑点.....你自己写个生成椭圆型的函数吧.....
 
W

wubo830814

Unregistered / Unconfirmed
GUEST, unregistred user!
那我再问一下,怎么让主从窗体的透明度不一样,主窗体的透明度是200,我想让从窗体的透明度设为100,但是设置后从窗体的透明度是跟着主窗体的,怎么弄
 
H

hs-kill

Unregistered / Unconfirmed
GUEST, unregistred user!
?? 不会啊 自己窗体的透明不会影响到其他窗体啊,你看看是不是代码写错了
现在上不了QQ......
 
W

wubo830814

Unregistered / Unconfirmed
GUEST, unregistred user!
好的,多谢你了
 

Similar threads

顶部