填充区域将其从画布上拉下来

时间:2010-06-10 02:23:08

标签: delphi

在Delphi 2007中使用以下代码:


procedure TfrmTest.PaintBox1Paint(Sender: TObject);
const
  Rect_Size = 10;
begin
  PaintBox1.Canvas.Brush.Color := clYellow;
  PaintBox1.Canvas.FillRect(Rect(0, 0, PaintBox1.width, PaintBox1.height));

  PaintBox1.Canvas.Brush.Color := clRed;
  DrawARect(PaintBox1.Canvas, 0, 0, Rect_Size, Rect_Size);
end;

procedure TfrmTest.DrawARect(ACanvas: TCanvas; iLeft, iTop, iWidth, iHeight: Integer);
var
  rgnMain: HRGN;
begin
  rgnMain := CreateRectRgn(iLeft, iTop, iLeft + iWidth, iTop + iHeight);
  try
    SelectClipRgn(ACanvas.handle, rgnMain);
    ACanvas.FillRect(ACanvas.ClipRect);
    SelectClipRgn(ACanvas.handle, 0);
  finally
    DeleteObject(rgnMain);
  end;
end;

我明白了: (黄色区域显示PaintBox1的边界)。

alt text http://www.freeimagehosting.net/uploads/62cf687d29.jpg

(图片显示中间有一个带黄色方框[PaintBox1]的表格。但是我的红色矩形[rgnMain]已经在表格上的位置0,0处绘制)

我的期望是红色矩形位于PaintBox1画布的左上角,而不是表单的画布。为什么不呢?区域只能与具有Windows句柄的控件一起使用吗?

由于

1 个答案:

答案 0 :(得分:2)

设备上下文需要窗口句柄。 VCL对非窗口控件的作用是通过在TWinControl.PaintControls中使用SetWindowOrgEx来偏移为它们所在的TWinControl获取的DC的视口。新视图端口采用逻辑单元。因此对于不从TWinControl下降的'TGraphicControl',您可以使用在逻辑坐标上工作的GDI函数。请参阅SelectClipRgn的备注部分,其中说明坐标应以设备单位指定。你是offset the region或坐标。