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