2011-07-11 114 views
17

爲什麼在Visual Studio WinForms設計器中我無法增加我的窗體的大小,超出了我目前正在處理的屏幕分辨率?我認爲應該以某種方式開發針對較低分辨率系統的更高分辨率的應用程序。在調試過程中這會剪切窗體的事實不應該成爲問題。是否有可能在Visual Studio中爲此設置了一些設置,我似乎無法找到它?Visual Studio設計器中窗體的大小是否限於屏幕分辨率?

編輯: 我的主要問題是,我需要能夠在(例如)1360x768屏幕的筆記本電腦上設計(例如)1440x900大小的窗體。

+1

像很多人,在我的筆記本電腦1360x768的我也代碼。我還沒有遇到這個問題,但是多虧了你,我已經有了一個解決方法! – Tipx

回答

24

不幸的是(我希望別人會發布更好的解決方案!),唯一的我知道的解決方法是在表單中放置一個面板。

將父表單的AutoscrollAutoSize屬性設置爲true。然後將面板尺寸增加到所需的尺寸。表單本身的大小仍然不會超過屏幕分辨率,但它會顯示滾動條,所以至少可以使用設計器將控件等超出尺寸限制放到較大的面板上。

然後,您可能需要添加一些代碼以在運行時調整窗體大小,以便它足夠大以顯示沒有滾動條的面板(也可能禁用Autoscroll屬性)。

我知道,這不是一個特別好的解決辦法...

編輯

看起來這是故意的,由設計:

MSDN

物業形態.Size: 該屬性的最大值受 窗體運行的屏幕的分辨率。在每個屏幕尺寸(水平+ 12 和垂直+ 12)上,值不能大於12像素。

Microsoft Connect/Public Bug Tracking

,並再次:

發佈Microsoft在10/9/2008在上午12時18

感謝您在.NET Framework反饋 !

您所報告的問題實際上是By Design。

在MSDN在http://msdn.microsoft.com/en-us/library/25w4thew.aspx,你 可以發現在主題Form.Size財產的下列信息:

此屬性的最大值由 屏幕上的形式運行的分辨率的限制。在每個屏幕尺寸(水平+12和垂直+12)上,該值不能大於12 像素。

因此,我們不能無限期地擴大我們的形式。此行爲是 與其他軟件(如記事本和Microsoft Paint)一致。

此行爲是在mothed Form.SetBoundsCore(...)與 下面的代碼來定義:

尺寸最大= SystemInformation.MaxWindowTrackSize;

如果(高度>最大高度){

height = max.Height; } 

如果(寬度>最大寬度){

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的派生類。窗體,重寫SetBoundsCore,並且不要在您的SetBoundsCore版本中執行此檢查?我還沒有嘗試,如果它的工作雖然...

+0

+1解決方法。儘管如此,我仍然會保持這個問題,希望有更好的解決方案。謝謝。 –

+0

當然,不用擔心。但是,它看起來像是通過設計。實際上,將表單大小動態設置爲大於分辨率將無法工作。這確實在Form.SetBoundsCore hardcocded –

+0

@本:尼斯信息在那裏。雖然他們堅持自己的設計決定並且不接受評論,儘管它沒有任何意義,但是很遺憾。 – Tipx

0

作爲Neil N提到你可以在代碼中指定它。然而,如果你想獲得屏幕尺寸或分辨率,然後將表格設置爲該尺寸,可以通過Screen.PrimaryScreen.BoundsScreen.PrimaryScreen.BitsPerPixel ...

+0

感謝您的努力,我已經更新了我的問題,並對實際問題進行了一些說明。 –

1

我找到了解決這個問題。在我的情況下,我需要一個設計時間解決方案。

我發現在桌面擴展到每個顯示器時使用多顯示器系統,這有效地告訴系統您的最大顯示器是顯示器的組合。

這是一個工作,是一個痛苦。特別是對於我來說,當我只是在筆記本電腦領域。

如果您的目標是多個系統,則在運行時縮放比較合適。但是,如果它只是一個單一的目標系統(一個尺寸的顯示器),那麼在設計編碼和運行時就是不必要的開銷。

微軟應該意識到這是一個壞主意,或者至少有一個選擇來覆蓋這個「設計特性」。

4

從窗體派生,覆蓋一些屬性和使用互操作。 這是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.

+0

非常感謝你張貼這個!奇蹟般有效。 – user1003916

+1

剛剛測試過它,對我不起作用:( – TMS

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); 
} 
+0

我有一個無邊框的高大的窗體停靠在一個只能畫到屏幕高度的可調節面板上,經過一番檢查後,我終於意識到窗體大小(高度)忽略這個答案消除了限制,現在這個表格正在繪製整個高的客戶區域,就像我需要的一樣。謝謝! – Jerrill

2

我發現了一個愚蠢的解決方法,可以讓我在設計空間中查看和使用更大的表單尺寸。

我正在使用1240x1024監視器的1440x900顯示器,因此無法達到垂直分量。我所做的只是右鍵單擊我的桌面,將分辨率更改爲1240x1024,調整表單大小,然後再更改分辨率。一旦改回,它會保留給定的表格大小,即使它超出了可接受的限制。

這真正造成的唯一問題是,如果您想在第一個解決方案中運行窗體,它將太大而無法正確查看。

我知道這是一個老問題,我想我會分享我發現的東西。快速修復可能會幫助那裏的人。

1

這個工作對我來說,複製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; 
    } 

}