我在网上找到以代码,可以根据图形设置窗体形状,不管把指针放在image1上,还是放在image2上,总是闪烁,怎么解决这闪的总是。
代码如下
procedure TPointForm.Timer1Timer(Sender: TObject);
var
ox,oy,r:integer;
MyNow:TDatetime;
Hour,Min,Sec,MSec:word;
angle,anglem,angles,angleh:Real;
px,py:integer;
w1:TBitmap;
w2:TColor;
rgn: HRGN;
i:integer;
begin
ox:=76;
oy:=76;
r:=35;
MyNow:=Now;
DecodeTime(MyNow,Hour,Min,Sec,mSec);
Image1.Refresh;//.Repaint;
with PointForm.Image1.Canvas do
begin
Canvas.Brush.Style := bsDiagCross;
Canvas.Brush.Color := clAqua;
canvas.Pen.Width:=5;
canvas.Pen.Color:=clyellow;
//h
angleh:=2*3.14159*(Hour+min/60)/12;
py:=round(oy-5*cos(angleh));
px:=round(ox+5*sin(angleh));
canvas.Pen.Width:=4;
canvas.pen.Color:=clblack;
canvas.MoveTo(ox,oy);
canvas.LineTo(px,py);
py:=round(oy+20*cos(angleh));
px:=round(ox-20*sin(angleh));
canvas.MoveTo(ox,oy);
canvas.LineTo(px,py);
//m
anglem:=2*3.14159*min/60;
py:=round(oy-5*cos(anglem));
px:=round(ox+5*sin(anglem));
canvas.Pen.Width:=3;
canvas.pen.Color:=clGreen;
canvas.MoveTo(ox,oy);
canvas.LineTo(px,py);
py:=round(oy+30*cos(anglem));
px:=round(ox-30*sin(anglem));
canvas.MoveTo(ox,oy);
canvas.LineTo(px,py);
//s
angle:=2*3.14159*sec/60;
py:=round(oy-r*cos(angle));
px:=round(ox+r*sin(angle));
canvas.Pen.Width:=1;
canvas.pen.Color:=clRed;
canvas.MoveTo(ox,oy);
canvas.LineTo(px,py);
py:=round(oy+8*cos(angle));
px:=round(ox-8*sin(angle));
canvas.MoveTo(ox,oy);
canvas.LineTo(px,py);
end;
//设置窗体函数
function TPointForm.CreateRegion(wMask:TBitmap;wColor:TColor;hControl:THandle): HRGN;
var
dc, dc_c: HDC;
rgn: HRGN;
x, y: integer;
coord: TPoint;
line: boolean;
color: TColor;
begin
dc := GetWindowDC(hControl);
dc_c := CreateCompatibleDC(dc);
SelectObject(dc_c, wMask.Handle);
BeginPath(dc);
for x:=0 to wMask.Width-1 do
begin
line := false;
for y:=0 to wMask.Height-1 do
begin
color := GetPixel(dc_c, x, y);
if not (color = wColor) then
begin
if not line then
begin
line := true;
coord.x := x;
coord.y := y;
end;
end;
if (color = wColor) or (y=wMask.Height-1) then
begin
if line then
begin
line := false;
MoveToEx(dc, coord.x, coord.y, nil);
LineTo(dc, coord.x, y);
LineTo(dc, coord.x + 1, y);
LineTo(dc, coord.x + 1, coord.y);
CloseFigure(dc);
end;
end;
end;
end;
EndPath(dc);
rgn := PathToRegion(dc);
ReleaseDC(hControl, dc);
Result := rgn;
end;
procedure TPointForm.FormCreate(Sender: TObject);
var
w1:TBitmap;
w2:TColor;
rgn: HRGN;
i:integer;
begin
w1:=TBitmap.Create;
w1.Assign(image1.Picture.Bitmap);
w2:=w1.Canvas.Pixels[0,0];
rgn := CreateRegion(w1,w2,Handle);
if rgn<>0 then
begin
SetWindowRgn(Handle, rgn, true);
end;
w1.Free;
end;