Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获取表格';客户规模最大化而不最大化?_C#_Winforms - Fatal编程技术网

C# 如何获取表格';客户规模最大化而不最大化?

C# 如何获取表格';客户规模最大化而不最大化?,c#,winforms,C#,Winforms,当一个表单在没有最大化的情况下被最大化时,如何获得它的客户端大小 例如,我想创建一个与最大化的表单客户端大小相同的位图,我该怎么做?尝试以下链接 尝试以下链接 试试看 Screen.FromControl(this).GetWorkingArea(); 计算大小(不带任务栏) 然后减去ClientSize/Size表单之间的差异。 希望它能起作用,但还没有测试过 更新: 有点黑,但我试过了,效果很好 var frm = new Form(); frm.Opaci

当一个
表单在没有最大化的情况下被最大化时,如何获得它的客户端大小


例如,我想创建一个与最大化的
表单
客户端大小相同的
位图
,我该怎么做?

尝试以下链接


尝试以下链接

试试看

Screen.FromControl(this).GetWorkingArea();
计算大小(不带任务栏) 然后减去ClientSize/Size表单之间的差异。 希望它能起作用,但还没有测试过

更新:

有点黑,但我试过了,效果很好

        var frm = new Form();
        frm.Opacity = 100;
        frm.WindowState = FormWindowState.Maximized;
        frm.Show();

        while (!frm.IsHandleCreated)
            System.Threading.Thread.Sleep(1);

        var result = frm.ClientSize;
        frm.Close();
        return result;
更新2:

这是一个更好的解决方案。 我禁用表单的绘制,将其最大化,获取客户端区域,将其设置回正常状态并返回结果。工作正常,没有闪烁或其他东西

    private static Size GetMaximizedClientSize(Form form)
    {
        var original = form.WindowState;
        try
        {
            BeginUpdate(form);

            form.WindowState = FormWindowState.Maximized;
            return form.ClientSize;

        }
        finally
        {
            form.WindowState = original;   
            EndUpdate(form);
        }
    }

    [DllImport("User32.dll")]
    private extern static int SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

    private enum Message : int
    {
        WM_SETREDRAW = 0x000B, // int 11
    }

    /// <summary>
    /// Calls user32.dll SendMessage(handle, WM_SETREDRAW, 0, null) native function to disable painting
    /// </summary>
    /// <param name="c"></param>
    public static void BeginUpdate(Control c)
    {
        SendMessage(c.Handle, (int)Message.WM_SETREDRAW, new IntPtr(0), IntPtr.Zero);
    }

    /// <summary>
    /// Calls user32.dll SendMessage(handle, WM_SETREDRAW, 1, null) native function to enable painting
    /// </summary>
    /// <param name="c"></param>
    public static void EndUpdate(Control c)
    {
        SendMessage(c.Handle, (int)Message.WM_SETREDRAW, new IntPtr(1), IntPtr.Zero);
    }
私有静态大小GetMaximizedClientSize(表单)
{
var original=form.WindowState;
尝试
{
开始更新(表格);
form.WindowState=FormWindowState.Maximized;
返回form.ClientSize;
}
最后
{
form.WindowState=原件;
(表格);;
}
}
[DllImport(“User32.dll”)]
私有外部静态int SendMessage(IntPtr hWnd、uint msg、IntPtr wParam、IntPtr lParam);
私有枚举消息:int
{
WM_SETREDRAW=0x000B,//int 11
}
/// 
///调用user32.dll SendMessage(handle,WM_SETREDRAW,0,null)本机函数以禁用绘制
/// 
/// 
公共静态无效开始更新(控制c)
{
SendMessage(c.Handle,(int)Message.WM_SETREDRAW,new IntPtr(0),IntPtr.Zero);
}
/// 
///调用user32.dll SendMessage(handle,WM_SETREDRAW,1,null)本机函数以启用绘制
/// 
/// 
公共静态void EndUpdate(控件c)
{
SendMessage(c.Handle,(int)Message.WM_SETREDRAW,new IntPtr(1),IntPtr.Zero);
}
试试看

计算大小(不带任务栏) 然后减去ClientSize/Size表单之间的差异。 希望它能起作用,但还没有测试过

更新:

有点黑,但我试过了,效果很好

        var frm = new Form();
        frm.Opacity = 100;
        frm.WindowState = FormWindowState.Maximized;
        frm.Show();

        while (!frm.IsHandleCreated)
            System.Threading.Thread.Sleep(1);

        var result = frm.ClientSize;
        frm.Close();
        return result;
更新2:

这是一个更好的解决方案。 我禁用表单的绘制,将其最大化,获取客户端区域,将其设置回正常状态并返回结果。工作正常,没有闪烁或其他东西

    private static Size GetMaximizedClientSize(Form form)
    {
        var original = form.WindowState;
        try
        {
            BeginUpdate(form);

            form.WindowState = FormWindowState.Maximized;
            return form.ClientSize;

        }
        finally
        {
            form.WindowState = original;   
            EndUpdate(form);
        }
    }

    [DllImport("User32.dll")]
    private extern static int SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

    private enum Message : int
    {
        WM_SETREDRAW = 0x000B, // int 11
    }

    /// <summary>
    /// Calls user32.dll SendMessage(handle, WM_SETREDRAW, 0, null) native function to disable painting
    /// </summary>
    /// <param name="c"></param>
    public static void BeginUpdate(Control c)
    {
        SendMessage(c.Handle, (int)Message.WM_SETREDRAW, new IntPtr(0), IntPtr.Zero);
    }

    /// <summary>
    /// Calls user32.dll SendMessage(handle, WM_SETREDRAW, 1, null) native function to enable painting
    /// </summary>
    /// <param name="c"></param>
    public static void EndUpdate(Control c)
    {
        SendMessage(c.Handle, (int)Message.WM_SETREDRAW, new IntPtr(1), IntPtr.Zero);
    }
私有静态大小GetMaximizedClientSize(表单)
{
var original=form.WindowState;
尝试
{
开始更新(表格);
form.WindowState=FormWindowState.Maximized;
返回form.ClientSize;
}
最后
{
form.WindowState=原件;
(表格);;
}
}
[DllImport(“User32.dll”)]
私有外部静态int SendMessage(IntPtr hWnd、uint msg、IntPtr wParam、IntPtr lParam);
私有枚举消息:int
{
WM_SETREDRAW=0x000B,//int 11
}
/// 
///调用user32.dll SendMessage(handle,WM_SETREDRAW,0,null)本机函数以禁用绘制
/// 
/// 
公共静态无效开始更新(控制c)
{
SendMessage(c.Handle,(int)Message.WM_SETREDRAW,new IntPtr(0),IntPtr.Zero);
}
/// 
///调用user32.dll SendMessage(handle,WM_SETREDRAW,1,null)本机函数以启用绘制
/// 
/// 
公共静态void EndUpdate(控件c)
{
SendMessage(c.Handle,(int)Message.WM_SETREDRAW,new IntPtr(1),IntPtr.Zero);
}

当表单未最大化时,表单大小中有边框大小,当表单最大化时,表单边框消失。所以这是不对的。你是对的,我添加了另一个解决方案,该解决方案创建了一个隐藏表单,并在假设值与表单相同的情况下返回客户端大小。您可以存储结果,因此只需执行一次。当窗体未最大化时,窗体大小中有边框大小,当窗体最大化时,窗体边框消失。所以这是不对的。你是对的,我添加了另一个解决方案,该解决方案创建了一个隐藏表单,并在假设值与表单相同的情况下返回客户端大小。您可以存储结果,因此只需执行一次。虽然此链接可以回答问题,但最好包含答案的基本部分并提供链接供参考。如果链接页面更改,仅链接的答案可能会无效。这是更好的答案。虽然此链接可以回答问题,但最好包含答案的基本部分并提供链接供参考。如果链接页面更改,仅链接的答案可能会无效。这是更好的答案。