【问题标题】:How To Compensate For Margin From Control.PointToScreen?如何从 Control.PointToScreen 补偿保证金?
【发布时间】:2011-02-15 15:18:11
【问题描述】:

我正在使用 .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(); 
}

【问题讨论】:

    标签: c# winforms coordinates


    【解决方案1】:

    使用表单边界属性。这提供了它在屏幕上占据的矩形。

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

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

    【讨论】:

    • +1 - 这行得通。此外,您可能只想使用LeftTop 而不是Bounds。不过,我不喜欢你需要一个特殊情况来判断Control 是否实际上是顶级Form。不知道有没有办法解决。
    • 我是否必须为子元素、大子元素、曾孙元素等创建特殊情况?
    • 如果您只是将像素从屏幕复制到图像,那么这将包括指定表单或控件中的任何可见元素。您不需要为子元素做任何特别的事情。
    【解决方案2】:

    您应该能够为此目的使用表单的ClientRectangleClientSize 属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多