webentwicklung-frage-antwort-db.com.de

Ist die Größe eines Formulars in Visual Studio Designer auf die Bildschirmauflösung beschränkt?

Warum kann ich im Visual Studio WinForms-Designer die Größe meines Formulars nicht über die Auflösung des Bildschirms erhöhen, an dem ich gerade arbeite? Ich denke, es sollte irgendwie möglich sein, eine Anwendung für höhere Auflösungen auf einem System mit niedrigerer Auflösung zu entwickeln. Die Tatsache, dass dies das Formular während des Debuggens ausschneiden würde, sollte kein Problem sein. Gibt es vielleicht eine Einstellung in Visual Studio dafür, die ich anscheinend nicht finde?

BEARBEITEN: Mein Hauptproblem ist, dass ich in der Lage sein muss, ein Formular der Größe 1440 x 900 auf einem Laptop mit einem Bildschirm der Größe 1360 x 768 (zum Beispiel) zu entwerfen.

18
Edwin de Koning

Leider (ich hoffe, jemand anderes wird eine bessere Lösung veröffentlichen!), Ist die einzige Problemumgehung, die mir bekannt ist, ein Panel in das Formular einzufügen. 

Setzen Sie die Eigenschaften Autoscroll und AutoSize des übergeordneten Formulars auf true. Erhöhen Sie dann die Panelgröße auf die gewünschte Größe. Das Formular selbst wird zwar nicht größer als Ihre Bildschirmauflösung sein, aber es werden Bildlaufleisten angezeigt. Sie können also zumindest den Designer verwenden, um Steuerelemente usw. über Ihre Größenbeschränkungen hinaus in das größere Fenster zu ziehen. 

Anschließend müssen Sie möglicherweise etwas Code hinzufügen, um die Formulargröße zur Laufzeit anzupassen, sodass sie groß genug ist, um das Bedienfeld ohne Bildlaufleisten anzuzeigen (und möglicherweise auch die Autoscroll-Eigenschaft zu deaktivieren). 

Ich weiß, es ist kein besonders schöner Workaround ...

EDIT

Sieht aus, als wäre dies beabsichtigt und beabsichtigt:

MSDN

Eigenschaft Form.Size: Der Maximalwert dieser Eigenschaft wird durch Die Auflösung des Bildschirms begrenzt, auf dem das Formular ausgeführt wird. Der Wert darf nicht Größer als 12 Pixel pro Bildschirmgröße sein (horizontal + 12 Und vertikal + 12).

und nochmal unter Microsoft Connect/Public Bug Tracking :

Gepostet von Microsoft am 09.10.2008 um 00:18 Uhr

Vielen Dank für Ihr Feedback Zum .NET Framework!

Das von Ihnen gemeldete Problem ist eigentlich By Design.

In MSDN unter http://msdn.Microsoft.com/de-de/library/25w4thew.aspx finden Sie Folgende Informationen unter dem Thema Form.Size-Eigenschaft:

Der Maximalwert dieser Eigenschaft wird durch die Auflösung des Bildschirms Begrenzt, auf dem das Formular ausgeführt wird. Der Wert darf nicht größer als 12 Pixel pro Bildschirmgröße sein (horizontal + 12 und vertikal + 12).

Daher können wir unsere Formulare nicht unbegrenzt vergrößern. Dieses Verhalten ist Konsistent mit anderer Software, z. B. Notepad und Microsoft Paint.

Dieses Verhalten ist in der formatierten Form.SetBoundsCore (...) mit Dem folgenden Code definiert:

Größe max = SystemInformation.MaxWindowTrackSize;

if (Höhe> max.Höhe) {

height = max.Height; }

if (width> max.Width) {

width = max.Width; }

[...]

Danke, das UIFx-Team

EDIT2 :

Da die Prüfung in Forms.SetBoundsCore wie (mit ILSpy als Decompiler) fest codiert ist:

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

und SetBoundsCore ist eine geschützte Funktion. Vielleicht könnten Sie versuchen, eine Klasse von Windows.Forms.Form abzuleiten, SetBoundsCore zu überschreiben und diese Prüfung in Ihrer Version von SetBoundsCore nicht zu erzwingen? Ich habe es nicht versucht, wenn es funktioniert ...

24
Ben Schwehn

Ableitung von Form, Überschreiben einiger Eigenschaften und Verwendung von Interop. Dies ist VB.NET. 

Mit dem abgeleiteten Formular können Sie die Eigenschaften "SizeDesign" und "SizeRuntime" für das Design bzw. die Laufzeit verwenden.

 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.

4
A.J.Bauer

Das hat für mich funktioniert, kopiert aus

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

}
2
Sandwich

Ich habe eine dumme Problemumgehung gefunden, mit der ich die größeren Formulargrößen im Designbereich anzeigen und verwenden kann.

Ich arbeite an einem 1440x900-Monitor für einen 1240x1024-Monitor, kann also die vertikale Komponente nicht erreichen. Ich habe einfach mit der rechten Maustaste auf meinen Desktop geklickt, die Auflösung in 1240x1024 geändert, die Formulargröße angepasst und dann die Auflösung wieder geändert. Beim Zurücksetzen bleibt die angegebene Formgröße erhalten, selbst wenn sie außerhalb des zulässigen Grenzwerts liegt.

Das einzige Problem, das sich daraus ergibt, ist, dass das Formular in seiner ersten Auflösung ausgeführt werden kann, wenn es zu groß ist, um es richtig anzuzeigen.

Ich weiß, das ist eine alte Frage. Ich dachte, ich würde teilen, was ich gefunden hatte. Die schnelle Lösung könnte jemandem da draußen helfen.

2
clb9355

Ich habe eine Lösung für dieses Problem gefunden. In meinem Fall brauchte ich eine Entwurfszeitlösung.

Ich habe festgestellt, dass bei Verwendung eines Multi-Display-Systems, bei dem der Desktop auf jede Anzeige erweitert wurde, dies dem System effektiv signalisiert, dass Ihre maximale Anzeige die Kombination von Anzeigen ist.

Dies ist eine Umgehung und ein Schmerz. Besonders für mich, als ich gerade mit einem Laptop im Feld war.

Die Skalierung zur Laufzeit ist in Ordnung, wenn Sie auf mehrere Systeme zielen. Wenn es sich jedoch nur um ein einziges Zielsystem (Einheitsgröße) handelt, ist dies ein unnötiger Aufwand bei der Entwurfskodierung und der Laufzeit.

Microsoft hätte wissen müssen, dass dies eine schlechte Idee war oder zumindest die Wahl hatte, dieses "Design-Feature" zu überschreiben.

2
Greg

Danke an alle, besonders an Ben Schwehn! Mit den oben angegebenen Informationen können Sie, wenn Ihre App ein Basisformular verwendet, die folgenden Änderungen (in C #) vornehmen, wodurch die Einschränkung für alle Formulare aufgehoben wird, die davon übernommen wurden.

[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);
}
2
Eric Kassan

Wie Neil N erwähnt, können Sie es am Code angeben. Wenn Sie jedoch die Bildschirmgröße oder Auflösung erhalten möchten und das Formular dann auf diese Größe einstellen möchten, können Sie dies über Screen.PrimaryScreen.Bounds und Screen.PrimaryScreen.BitsPerPixel... erhalten.

1
Jalal Said