Подтвердить что ты не робот

Является ли размер формы в дизайнере Visual Studio ограниченным разрешением экрана?

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

EDIT: Моя основная проблема заключается в том, что мне нужно иметь возможность проектировать форму размером 1440x900 на ноутбуке с экраном (например) 1360x768.

4b9b3361

Ответ 1

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

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

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

Я знаю, это не особенно приятное обходное решение...

ИЗМЕНИТЬ:

Похоже, это намеренно и по дизайну:

MSDN

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

и снова в Отслеживание ошибок Microsoft Connect/Public:

Отправлено Microsoft на 10/9/2008 в 12:18

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

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

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

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

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

Это поведение определено в измененной форме. 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? Я не пробовал, если он работает, хотя...

Ответ 2

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

Ответ 3

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

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

Это работа и боль. Специально для меня, когда я был в поле с помощью всего лишь ноутбука.

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

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

Ответ 4

Спасибо всем, особенно Бен Швен! С приведенной выше информацией, если ваше приложение использует базовую форму, вы можете внести следующие изменения (в С#), которые удаляют ограничение из всех унаследованных от него форм.

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

Ответ 5

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

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

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

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

Ответ 6

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

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

}

Ответ 7

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