web-dev-qa-db-fra.com

La taille d'un formulaire dans Visual Studio Designer est-elle limitée à la résolution d'écran?

Pourquoi, dans le concepteur Visual Studio WinForms, je ne peux pas augmenter la taille de mon formulaire au-dessus de la résolution de l'écran sur lequel je travaille actuellement? Je pense qu'il devrait être possible de développer une application destinée à des résolutions plus élevées sur un système de résolution inférieure. Le fait que cela écrase le formulaire pendant le débogage ne devrait pas être un problème. Existe-t-il un paramètre dans Visual Studio que je n'arrive pas à trouver?

EDIT: Mon problème principal est que je dois être capable de concevoir un formulaire de format 1440x900 (par exemple) sur un ordinateur portable avec un écran de 1360x768 (par exemple).

18
Edwin de Koning

Malheureusement (j'espère que quelqu'un publiera une meilleure solution!), La seule solution de contournement à ma connaissance est de placer un panneau dans le formulaire. 

Définissez les propriétés Autoscroll et AutoSize du formulaire parent sur true. Augmentez ensuite la taille du panneau à la taille souhaitée. Le formulaire lui-même ne dépassera toujours pas la résolution de votre écran, mais il affichera des barres de défilement. Vous pourrez donc au moins utiliser le concepteur pour supprimer les contrôles, etc., au-delà de vos limites de taille, dans le panneau plus grand. 

Ensuite, vous devrez peut-être ajouter du code pour ajuster la taille des formulaires au moment de l'exécution afin qu'elle soit suffisamment grande pour afficher le panneau sans barres de défilement (et peut-être aussi désactiver la propriété Autoscroll). 

Je sais, ce n'est pas une solution de contournement particulièrement agréable ...

EDIT

On dirait que c'est intentionnel et par conception:

MSDN

Property Form.Size: La valeur maximale de cette propriété est limitée à La résolution de l'écran sur lequel le formulaire est exécuté. La valeur Ne peut pas dépasser 12 pixels sur chaque dimension de l'écran (horizontal + 12 Et vertical + 12).

et encore à l'adresse Microsoft Connect/Suivi des bogues public :

_ {Écrit par Microsoft le 09/10/2008 à 00:18

Merci pour vos commentaires Sur le .NET Framework!

Le problème que vous avez signalé est en réalité une conception.

Dans MSDN à l'adresse http://msdn.Microsoft.com/en-us/library/25w4thew.aspx , vous pouvez Trouver les informations suivantes à la rubrique Propriété Form.Size:

La valeur maximale de cette propriété est limitée par la résolution de l'écran Sur lequel le formulaire est exécuté. La valeur ne peut pas dépasser 12 Pixels sur chaque dimension de l'écran (horizontal + 12 et vertical + 12).

Par conséquent, nous ne pouvons pas agrandir nos formulaires indéfiniment. Ce comportement est Cohérent avec d'autres logiciels, tels que le Bloc-notes et Microsoft Paint.

Ce comportement est défini dans Form.SetBoundsCore (...) avec le code suivant: :

Size max = SystemInformation.MaxWindowTrackSize;

si (hauteur> hauteur max.) {

height = max.Height; }

si (largeur> largeur maximale) {

width = max.Width; }

[...]

Merci, équipe UIFx

EDIT2 :

Comme la vérification est codée en dur dans Forms.SetBoundsCore, comme (en utilisant ILSpy comme décompilateur):

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

et SetBoundsCore est une fonction protégée. Vous pourriez peut-être essayer de dériver une classe à partir de Windows.Forms.Form, remplacer SetBoundsCore et ne pas appliquer cette vérification dans votre version de SetBoundsCore? Je n'ai pas essayé si ça marche bien ...

24
Ben Schwehn

Dériver à partir du formulaire, remplacer certaines propriétés et utiliser interop. 

En utilisant le formulaire dérivé, vous pouvez utiliser les propriétés "SizeDesign" et "SizeRuntime" pour la conception et l'exécution.

 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

UN J.

4
A.J.Bauer

Cela a fonctionné pour moi, copié de

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

J'ai trouvé une solution de rechange stupide qui me permet de visualiser et d'utiliser les tailles de formulaire plus grandes dans l'espace de conception.

Je travaille sur un moniteur 1440x900 pour un moniteur 1240x1024, donc je ne peux pas atteindre le composant vertical. Ce que j'ai fait était simplement de cliquer avec le bouton droit sur mon bureau, de changer la résolution en 1240x1024, d'ajuster la taille du formulaire, puis de rétablir la résolution. Lors du changement de retour, il conservera la taille de formulaire donnée, même si elle se situe en dehors de la limite acceptable.

Le seul problème que cela pose vraiment est que si vous souhaitez exécuter le formulaire dans votre première résolution, il sera trop volumineux pour être visualisé correctement.

Je sais que c'est une vieille question, j'ai pensé partager ce que j'avais trouvé. La solution rapide pourrait aider quelqu'un.

2
clb9355

J'ai trouvé un moyen de contourner ce problème. Dans mon cas, j'avais besoin d'une solution de conception.

J'ai constaté qu'en utilisant un système multi-écrans avec le bureau étendu à chaque écran, cela indique effectivement au système que votre affichage maximum est la combinaison des affichages.

Ceci est un travail autour et est une douleur. Especialy pour moi alors que j'étais sur le terrain avec juste un ordinateur portable.

La mise à l'échelle au moment de l'exécution est acceptable si vous ciblez plusieurs systèmes. Mais s'il ne s'agit que d'un système cible unique (affichage taille unique), il s'agit d'un temps système inutile pour le codage de la conception et l'exécution.

Microsoft aurait dû se rendre compte que c’était une mauvaise idée ou au moins donner le choix de remplacer cette "caractéristique de conception".

2
Greg

Merci à tous, surtout à Ben Schwehn! Avec les informations fournies ci-dessus, si votre application utilise un formulaire de base, vous pouvez apporter les modifications suivantes (en C #), ce qui supprimera la limitation de tous les formulaires qui en ont été hérités.

[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

Comme Neil N mentionné, vous pouvez le spécifier au code. Toutefois, si vous souhaitez obtenir la taille de l'écran ou la résolution, puis définir le formulaire à cette taille, vous pouvez l'obtenir par Screen.PrimaryScreen.Bounds et Screen.PrimaryScreen.BitsPerPixel...

1
Jalal Said