Visual Studio设计器中Form的大小是否仅限于屏幕分辨率?

Edw*_*ing 19 c# visual-studio winforms

为什么在Visual Studio WinForms设计器中我不能将我的表单大小增加到我目前正在处理的屏幕分辨率之上?我认为应该以某种方式开发一种针对较低分辨率系统的更高分辨率的应用程序.这将在调试期间剪切窗体这一事实应该不是问题.在Visual Studio中是否可能有一些设置,我似乎找不到?

编辑:我的主要问题是我需要能够在具有(例如)1360x768屏幕的笔记本电脑上设计(例如)1440x900大小的表格.

Ben*_*ehn 24

不幸的是(我希望其他人会发布一个更好的解决方案!),我知道的唯一解决方法是在表单中放置一个面板.

将父窗体的AutoscrollAutoSize属性设置为true.然后将面板尺寸增加到所需的尺寸.表单本身仍然不会比屏幕分辨率大,但它会显示滚动条,所以至少你可以使用设计器将控制等超出你的尺寸限制放到更大的面板上.

然后,您可能需要添加一些代码以在运行时调整表单大小,以便它足够大以显示没有滚动条的面板(也可能还禁用Autoscroll属性).

我知道,这不是一个特别好的解决方法......

编辑:

看起来这是故意的和设计:

MSDN

Property Form.Size:此属性的最大值受表单运行的屏幕分辨率的限制.每个屏幕尺寸上的值不能超过12个像素(水平+ 12和垂直+ 12).

并再次在Microsoft Connect/Public Bug Tracking:

由Microsoft于2008年10月9日上午12:18发布

感谢您对.NET Framework的反馈!

您报告的问题实际上是By Design.

在MSDN(http://msdn.microsoft.com/en-us/library/25w4thew.aspx)中,您可以在Form.Size属性主题中找到以下信息:

此属性的最大值受表单运行的屏幕分辨率的限制.每个屏幕尺寸上的值不能超过12个像素(水平+ 12和垂直+ 12).

因此,我们无法无限扩大我们的形式.此行为与其他软件(如记事本和Microsoft Paint)一致.

此行为在mothed Form.SetBoundsCore(...)中定义,代码如下:

Size max = SystemInformation.MaxWindowTrackSize;

if(height> max.Height){

height = max.Height; }
Run Code Online (Sandbox Code Playgroud)

if(width> max.Width){

width = max.Width; }
Run Code Online (Sandbox Code Playgroud)

[...]

谢谢,UIFx团队

编辑2:

由于支票在Forms.SetBoundsCore中是硬编码的(使用ILSpy作为反编译器):

if (this.WindowState == FormWindowState.Normal && (base.Height != height || base.Width != width))
    {
        Size maxWindowTrackSize = SystemInformation.MaxWindowTrackSize;
        if (height > maxWindowTrackSize.Height)
        {
            height = maxWindowTrackSize.Height;
        }
        if (width > maxWindowTrackSize.Width)
        {
            width = maxWindowTrackSize.Width;
        }
    }
Run Code Online (Sandbox Code Playgroud)

和SetBoundsCore是一个受保护的函数,也许您可​​以尝试从Windows.Forms.Form派生一个类,覆盖SetBoundsCore并且不要在您的SetBoundsCore版本中强制执行此检查?我没试过,如果它有效...


小智 5

谢谢大家,特别是本·施韦恩!根据上面提供的信息,如果您的应用程序使用基本表单,您可以进行以下更改(在 C# 中),这将消除从其继承的所有表单的限制。

[DllImport("user32.dll", EntryPoint = "MoveWindow")]
private static extern bool MoveWindow(IntPtr hWnd, int x, int y, int w, int h, bool repaint);

protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified)
{
    base.SetBoundsCore(x, y, width, height, specified);
    MoveWindow(Handle, x, y, width, height, true);
}
Run Code Online (Sandbox Code Playgroud)


小智 5

这对我有用,复制

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;

public class Form1 : Form
{
    [DllImport("User32.dll", CharSet = CharSet.Ansi, SetLastError = true,    ExactSpelling = true)]
    private static extern bool MoveWindow(IntPtr hWnd, int x, int y, int w, int h, bool Repaint);

    private void Form1_Load(System.Object sender, System.EventArgs e)
    {
        this.MaximumSize = new Size(5000, 800);
        bool Result = MoveWindow(this.Handle, this.Left, this.Top, 5000, 500, true);
    }
    public Form1()
    {
        Load += Form1_Load;
    }

}
Run Code Online (Sandbox Code Playgroud)