作者:手机用户2602937913 | 来源:互联网 | 2023-05-28 09:05
我正在绘制带边框的自定义背景(从TGraphicControl派生).在DrawBorderRect函数中绘制边框后,我返回"客户端"区域,并希望将来的绘制限制在这个新区域.如果我不使用ClipRgn,一切正常.
工作守则:
var
R : TRect;
begin;
R := GetClientRect; //(R -> 0, 0, 300, 200)
R := DrawBorderRect(R); //(R -> 20, 20, 280, 180)
Canvas.StretchDraw(R, FBitmap); //FBitmap is a 3 pixel x 3 pixel square
end;
上面的代码给了我这个:
但是,我想使用ClipRgn,我尝试了以下内容.这次没有显示模式(但是,如果我单击该区域上的鼠标按钮,则模式显示.所以它正在工作,但由于某种原因会被覆盖?).
有问题的代码:
var
R : TRect;
ClientRegion: HRGN;
begin;
R := GetClientRect; //(R -> 0, 0, 300, 200)
R := DrawBorderRect(R); //(R -> 20, 20, 280, 180)
ClientRegion := CreateRectRgn(R.Left, R.top, R.Right, R.Bottom);
SelectClipRgn(Canvas.Handle, ClientRegion);
try
Canvas.StretchDraw(R, FBitmap); //FBitmap is a 3 pixel x 3 pixel square
finally
SelectClipRgn(Canvas.Handle, HRGN(nil));
DeleteObject(ClientRegion);
end;
end;
我得到这个(除非我点击鼠标左键,在这种情况下我看到上面的内容)
关于发生了什么以及我缺少什么的任何见解?
1> Sertac Akyuz..:
SelectClipRgn
假设设备坐标.
TGraphicControl
后代具有为其父窗口检索的设备上下文.移动视口原点以将客户端原点设置为(0,0),但它们是逻辑坐标.
简而言之,您需要抵消您的地区:
...
ClientRegion := CreateRectRgn(R.Left, R.top, R.Right, R.Bottom);
OffsetRgn(ClientRegion, Left, Top); // <--
SelectClipRgn(Canvas.Handle, ClientRegion);
...