gpt4 book ai didi

Delphi SelectClipRGN 隐藏绘制位图

转载 作者:行者123 更新时间:2023-12-03 15:49:57 26 4
gpt4 key购买 nike

我正在绘制带有边框的自定义背景(源自 TGraphicControl)。在 DrawBorderRect 函数中绘制边框后,我返回“客户”区域,并希望将 future 的绘制限制在这个新区域。如果我不使用 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;

上面的代码给了我这个:Output without ClipRGN

但是,我想使用 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;

我得到了这个(除非我单击鼠标左键,在这种情况下我会看到上面的内容) Output with ClipRGN

对正在发生的事情以及我错过了什么有什么见解吗?

最佳答案

SelectClipRgn 采用设备坐标。

TGraphicControl 后代拥有为其父窗口检索的设备上下文。视口(viewport)原点已移动,以便能够将客户端原点设置为 (0, 0),但它们是逻辑坐标。

简而言之,您需要偏移您的区域:

...
ClientRegion := CreateRectRgn(R.Left, R.top, R.Right, R.Bottom);
OffsetRgn(ClientRegion, Left, Top); // <--
SelectClipRgn(Canvas.Handle, ClientRegion);
...

关于Delphi SelectClipRGN 隐藏绘制位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27809840/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com