wpf 为什么窗口小于实际宽度?

xam8gpfp  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(171)

我想捕捉窗口,但实际窗口大小似乎比图小.
这是代码

<Window x:Class="FileRead.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Width="620" Height="340" >
<Grid>

    <StackPanel>
        <StackPanel Orientation="Horizontal">
            <Button x:Name="ReadImageButton" Width="100" Height="30" Margin="10" Click="ReadImage_Click">
                LoadImage
            </Button>

            <Button x:Name="ReadTextButton" Width="100" Height="30" Margin="10" Click="ReadText_Click">
                LoadText
            </Button>

            <Button x:Name="CaptueScreenButton" Width="80" Height="30" Margin="10" Click="CaptueScreenButton_Click">
                ScreenCapture
            </Button>

            <Button x:Name="CaptuerWindowButton" Width="80" Height="30" Margin="10" Click="CaptuerWindowButton_Click">
                WindowCapture
            </Button>

我没发现问题。

private void CaptuerWindowButton_Click(object sender, RoutedEventArgs e)
{
    int width = (int)this.ActualWidth;
    int height = (int)this.ActualHeight;

    Point point = this.PointToScreen(new Point(0, 0)); 

    CheckLable.Content = string.Format("{0} / {1}", this.Width, this.ActualWidth);

    using (Bitmap bmp = new Bitmap(width, height))
    {
        using (Graphics gr = Graphics.FromImage(bmp))
        {
            gr.CopyFromScreen( (int)point.X, (int)this.Top, 0, 0, bmp.Size);

        }

        bmp.Save(ImagePath + "/WindowCapture.png", ImageFormat.Png);
    }
}

结果图像

总有15分左右的差距。:

请帮帮我。
enter image description here

dwbf0jvd

dwbf0jvd1#

你的问题的原因是窗口的大小包括了操作系统绘制的区域,这被称为“非客户区”,通常包括边框,边框,下拉显示效果。你的计算没有考虑到这点。正确的代码将像

var clientTopLeft = this.PointToScreen(new System.Windows.Point(0, 0));
    // calculate the drop show effect offset. 
    var shadowOffset = SystemParameters.DropShadow ? clientTopLeft.X - Left - 
        ((WindowStyle == WindowStyle.None && ResizeMode < ResizeMode.CanResize) ? 0 : SystemParameters.BorderWidth) : 0;

    // exclude left and right drop shadow area
    int width = (int)(Width - 2 * shadowOffset);
    // exclude bottom drop shadow area
    int height = (int)(Height - shadowOffset);

    using (Bitmap bmp = new Bitmap(width, height))
    {
        using (Graphics gr = Graphics.FromImage(bmp))
        {
            gr.CopyFromScreen((int)(Left + shadowOffset),
                (int)Top, 0, 0, bmp.Size);
        }

        bmp.Save("WindowCapture.png");
    }
tzcvj98z

tzcvj98z2#

假设你的窗口的Content属性是一个元素,它可以拉伸以使用可用的大小,例如。a Grid,窗口的“客户端大小”可以这样计算:

public Size GetClientSize(Window w)
{
    var content = w.Content as FrameworkElement;
    return new Size(content.ActualWidth, content.ActualHeight);
}

相关问题