Delphi SelectClipRGN隐藏绘制的位图

ss2*_*006 3 delphi clipping paint bitmap

我正在绘制带边框的自定义背景(从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;
Run Code Online (Sandbox Code Playgroud)

上面的代码给了我这个:没有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;
Run Code Online (Sandbox Code Playgroud)

我得到这个(除非我点击鼠标左键,在这种情况下我看到上面的内容) 使用ClipRGN输出

关于发生了什么以及我缺少什么的任何见解?

Ser*_*yuz 5

SelectClipRgn 假设设备坐标.

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

简而言之,您需要抵消您的地区:

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