如何从Control.PointToScreen补偿保证金?

时间:2011-02-15 15:18:12

标签: c# winforms coordinates

我正在使用.PointToScreen(Point.Empty);确定控件相对于整个屏幕的位置。我面临的唯一问题是,如果坐标位于表格内部,坐标总是稍微偏离。在我看来,正在发生的是表格的边距没有被考虑并导致这个错误。

http://min.us/mvnZhCJ

我正在使用它来截取表单内的整个表单或控件的屏幕截图。当我进行完整形式的截图时,会发生的是边距再次没有考虑。 .PointToScreen(Point.Empty)给出的坐标;是表单的左上角,但它在表单内部,所以当我从这一点截取屏幕截图时,它会经过右边和右边边框。

是否有自动内置方法来解决此问题,还是我必须手动补偿此保证金错误?

static public void PrintForm(Control form) {
    Bitmap image = new Bitmap(form.Width, form.Height);
    Graphics g = Graphics.FromImage(image);
    g.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
    g.CopyFromScreen(form.PointToScreen(Point.Empty).X, form.PointToScreen(Point.Empty).Y, 0, 0, new Size(form.Width, form.Height), CopyPixelOperation.SourceCopy);
    PrintDocument document = new PrintDocument();
    document.PrintPage += (sender, e) => Document_PrintImage(e, image);
    document.Print(); 
}

2 个答案:

答案 0 :(得分:2)

使用Forms Bounds属性。这提供了它在屏幕上占据的矩形。

对于单个控件,您可以使用Parent.RectangleToScreen(Bounds)来获取屏幕矩形。

这将包括控件范围内的所有内容。

答案 1 :(得分:0)

您应该可以使用表单的ClientRectangleClientSize属性来实现此目的。