如何在不最大化表单的情况下获得表单的最大化客户端大小

本文关键字:表单 最大化 客户端 情况下 | 更新日期: 2023-09-27 18:36:57

如何在最大化Form时获取客户端大小而不最大化它?

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

如何在不最大化表单的情况下获得表单的最大化客户端大小

试试

Screen.FromControl(this).GetWorkingArea();

计算大小(不带任务栏)然后减去表单客户端大小/大小之间的差异。希望有效,尚未测试。

更新:

有点笨拙,但我试过了,它有效。

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

尝试以下链接,

http://msdn.microsoft.com/en-us/library/system.windows.forms.screen.workingarea%28VS.71%29.aspx