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

时间:2011-07-11 13:51:03

标签: c# winforms visual-studio

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

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

8 个答案:

答案 0 :(得分:24)

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

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

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

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

编辑

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

MSDN

  

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

再次在Microsoft Connect/Public Bug Tracking

  

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

     

感谢您的反馈   在.NET Framework上!

     

您报告的问题实际上是“按设计”。

     

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

     

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

     

因此,我们无法无限扩大我们的形式。这种行为是   与其他软件一致,例如Notepad和Microsoft Paint。

     

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

     

尺寸max = SystemInformation.MaxWindowTrackSize;

     

if(height> max.Height){

height = max.Height; }
     

if(width> max.Width){

width = max.Width; }
     

[...]

     

谢谢,UIFx团队

<强> EDIT2

由于支票在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;
        }
    }

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

答案 1 :(得分:4)

从Form派生,覆盖一些属性并使用interop。 这是VB.NET抱歉,但你明白了。

使用派生表单,您可以分别使用“SizeDesign”和“SizeRuntime”属性进行设计和运行。

 Imports System.Windows.Forms
Imports System.ComponentModel

Public Class FormEx
    Inherits Form

    Private Declare Function MoveWindow Lib "User32.dll" (ByVal hWnd As IntPtr, ByVal x As Integer, ByVal y As Integer, ByVal w As Integer, ByVal h As Integer, ByVal Repaint As Boolean) As Boolean

    Private Const DEFAULTSIZE_X = 1024
    Private Const DEFAULTSIZE_Y = 768

    Protected Overrides Sub OnHandleCreated(e As System.EventArgs)
        MyBase.OnHandleCreated(e)

        If mSizeRuntime = System.Drawing.Size.Empty Then
            SizeRuntime = New System.Drawing.Size(DEFAULTSIZE_X, DEFAULTSIZE_Y)
        End If

        If mSizeDesign = System.Drawing.Size.Empty Then
            SizeDesign = New System.Drawing.Size(DEFAULTSIZE_X, DEFAULTSIZE_Y)
        End If
    End Sub

    <Browsable(False)> _
    Public Shadows Property Size As System.Drawing.Size

    Private mSizeDesign As System.Drawing.Size = System.Drawing.Size.Empty
    <Category("Layout"), _
    Description("Sets the size of the form at design time."), _
    RefreshProperties(RefreshProperties.All)> _
    Public Property SizeDesign As System.Drawing.Size
        Get
            Return mSizeDesign
        End Get
        Set(value As System.Drawing.Size)
            mSizeDesign = value
            If Me.DesignMode Then
                MoveWindow(Me.Handle, Me.Left, Me.Top, value.Width, value.Height, True)
            End If
        End Set
    End Property

    Private mSizeRuntime As System.Drawing.Size = System.Drawing.Size.Empty
    <Category("Layout"), _
    Description("Sets the size of the form at runtime."), _
    DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)> _
    Public Property SizeRuntime As System.Drawing.Size
        Get
            Return mSizeRuntime
        End Get
        Set(value As System.Drawing.Size)
            mSizeRuntime = value
            If Not Me.DesignMode Then
                MyBase.Size = value
            End If
        End Set
    End Property

End Class

A.J。

答案 2 :(得分:2)

我找到了解决这个问题的方法。就我而言,我需要一个设计时解决方案。

我发现使用多显示器系统将桌面扩展到每个显示器,这有效地告诉系统您的最大显示是显示组合。

这是一种解决方法并且很痛苦。特别是对我来说,只有一台笔记本电脑才能进入现场。

如果您的目标是多个系统,则可以在运行时进行缩放。但如果它只是一个目标系统(一个尺寸显示),那么它在设计编码和运行时是不必要的开销。

微软本应该意识到这是一个坏主意,或者至少可以选择覆盖这个“设计功能”。

答案 3 :(得分:2)

谢谢大家,特别是Ben Schwehn!使用上面提供的信息,如果您的应用使用基本表单,您可以进行以下更改(使用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);
}

答案 4 :(得分:2)

我找到了一种愚蠢的解决方法,让我可以在设计空间中查看和使用更大的表单。

我正在为1240x1024显示器使用1440x900显示器,因此无法到达垂直组件。我所做的只是右键单击我的桌面,将分辨率更改为1240x1024,调整表单大小,然后更改分辨率。更改后,它将保留给定的表单大小,即使它超出了可接受的限制。

这真正带来的唯一问题是,如果您想在第一个分辨率下运行表格,那么它太大而无法正常查看。

我知道这是一个老问题,我想我会分享我发现的东西。快速修复可能会帮助那些人。

答案 5 :(得分:2)

这对我有用,复制了from

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

}

答案 6 :(得分:1)

Neil N所述,您可以在代码中指定它。但是,如果您想获得屏幕尺寸或分辨率,然后将表单设置为该尺寸,则可以Screen.PrimaryScreen.BoundsScreen.PrimaryScreen.BitsPerPixel ...

答案 7 :(得分:0)

我正在设计使用1080x1920垂直屏幕的设计。有时我需要在没有垂直屏幕的另一台机器上处理主窗体。每次我在主窗体上工作时,窗体分辨率都被强制为1080x1109。真痛苦我唯一能做的就是进行更改,然后使用Windows多屏屏幕更改桌面,使一台显示器位于另一台显示器的上方。然后将设计窗口扩展到2个监视器,然后手动更改窗体的大小。这种“功能”绝不是错误。