Ограничен ли размер формы в конструкторе Visual Studio разрешением экрана? - PullRequest
18 голосов
/ 11 июля 2011

Почему в конструкторе Visual Studio WinForms я не могу увеличить размер моей формы выше разрешения экрана, над которым я сейчас работаю?Я думаю, что должно быть возможно разработать приложение, нацеленное на более высокие разрешения в системе с низким разрешением.Тот факт, что это может обрезать форму во время отладки, не должен быть проблемой.Возможно, в Visual Studio для этого есть какие-то настройки, которые я не могу найти?

РЕДАКТИРОВАТЬ: Моя главная проблема заключается в том, что мне нужно иметь возможность проектировать (например) форму размером 1440x900 на ноутбуке с(например) экран 1360x768.

Ответы [ 7 ]

24 голосов
/ 11 июля 2011

К сожалению (я надеюсь, что кто-то еще опубликует лучшее решение!), Единственный известный мне обходной путь - это поместить панель внутри формы.

Установите для свойств Autoscroll и AutoSize родительской формы значение true. Затем увеличьте размер панели до желаемого размера. Сама форма по-прежнему не будет больше вашего разрешения экрана, но будет отображать полосы прокрутки, так что вы, по крайней мере, можете использовать конструктор для перетаскивания элементов управления и т. Д. За пределы ограничений по размеру на большую панель.

Затем вам может понадобиться добавить некоторый код для настройки размера форм во время выполнения, чтобы он был достаточно большим, чтобы отображать панель без полос прокрутки (и, возможно, также отключить свойство Autoscroll).

Я знаю, это не очень хороший обходной путь ...

РЕДАКТИРОВАТЬ :

Похоже, это намеренно и по замыслу:

* 1018 MSDN *

Форма собственности. Размер: Максимальное значение этого свойства ограничено разрешение экрана, на котором работает форма. Значение не может быть больше 12 пикселей для каждого размера экрана (по горизонтали + 12 и вертикальный + 12).

и снова на Microsoft Connect / отслеживание общедоступных ошибок :

Опубликовано Microsoft 10.09.2008 в 00:18

Спасибо за ваш отзыв в .NET Framework!

Проблема, о которой вы сообщили, на самом деле является разработкой.

В MSDN на http://msdn.microsoft.com/en-us/library/25w4thew.aspx, вы можете найти следующую информацию в теме Form.Size Property:

Максимальное значение этого свойства ограничено разрешением экран, на котором работает форма. Значение не может быть больше 12 пикселей по каждому размеру экрана (по горизонтали + 12 и по вертикали + 12).

Поэтому мы не можем увеличивать наши формы до бесконечности. Такое поведение в соответствии с другими программами, такими как Блокнот и Microsoft Paint.

Это поведение определяется в mothed Form.SetBoundsCore (...) с следующий код:

Размер max = SystemInformation.MaxWindowTrackSize;

if (высота> максимальная высота) {

height = max.Height; }

if (ширина> макс. Ширина) {

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? Я не пробовал, если это работает, хотя ...

4 голосов
/ 14 февраля 2013

Получение из формы, переопределение некоторых свойств и использование взаимодействия.Это 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

AJ

2 голосов
/ 29 июля 2015

Это сработало для меня, скопировано из

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 голосов
/ 23 июля 2015

Я нашел тупой обходной путь, который позволяет мне просматривать и использовать большие размеры форм в области проектирования.

Я работаю над монитором 1440x900 для монитора 1240x1024, поэтому не могу достичь вертикальнойсоставная часть.Я просто щелкнул правой кнопкой мыши по своему рабочему столу, изменил разрешение на 1240x1024, отрегулировал размер формы, а затем снова изменил разрешение.При обратном изменении он сохранит заданный размер формы, даже если он находится за пределами приемлемого предела.

Единственная проблема, которую это действительно создает, заключается в том, что если вы хотите запустить форму в своем первом разрешении, онабыть слишком большим для правильного просмотра.

Я знаю, что это старый вопрос, я решил поделиться тем, что нашел.Быстрое решение может помочь кому-то там.

2 голосов
/ 31 января 2015

Спасибо всем, особенно Бену Швену!С помощью приведенной выше информации, если ваше приложение использует базовую форму, вы можете внести следующие изменения (в 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);
}
2 голосов
/ 27 июля 2012

Я нашел решение этой проблемы. В моем случае мне нужно было время разработки.

Я обнаружил, что при использовании системы с несколькими дисплеями с рабочим столом, расширенным для каждого дисплея, это фактически говорит системе, что ваш максимальный дисплей - это комбинация дисплеев.

Это обходной путь и боль. Особенно для меня, когда я был в поле только с ноутбуком.

Масштабирование во время выполнения хорошо, если вы ориентируетесь на несколько систем. Но если это всего лишь одна целевая система (один размер дисплея), то это ненужные накладные расходы при разработке кода и времени выполнения.

Microsoft должна была понять, что это плохая идея, или, по крайней мере, дать выбор переопределить эту "функцию дизайна".

1 голос
/ 11 июля 2011

Как упоминалось Neil N, вы можете указать его по коду.однако, если вы хотите получить размер экрана или разрешение, а затем установить форму на этот размер, вы можете получить это Screen.PrimaryScreen.Bounds и Screen.PrimaryScreen.BitsPerPixel ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...