Почему окно меньше, чем фактическая ширина? - PullRequest
0 голосов
/ 11 апреля 2019

Я хочу захватить окно, но фактический размер окна кажется меньше, чем цифра.

это код

<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);
    }
}

результат image result image

Всегда есть разница примерно в 15 баллов .: https://i.stack.imgur.com/1YTvy.png

помогите мнепожалуйста.

введите описание изображения здесь

1 Ответ

0 голосов
/ 11 апреля 2019

Причиной вашей проблемы является то, что размер окна включает область, которую рисует ОС, которая называлась «не клиентской областью», обычно включает в себя эффект рамки, границы, отбрасывания. И ваш расчет не учел этого. Правильный код понравится

    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");
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...