2011-07-11 14 views
17

यह क्यों है, कि विजुअल स्टूडियो WinForms डिजाइनर में मैं स्क्रीन के संकल्प के ऊपर अपने फॉर्म का आकार बढ़ा नहीं सकता हूं, मैं वर्तमान में काम कर रहा हूं? मुझे लगता है कि इसे किसी भी तरह के निचले रेज सिस्टम पर उच्च संकल्पों के उद्देश्य से विकसित करना संभव हो सकता है। तथ्य यह है कि यह डिबगिंग के दौरान फॉर्म को क्लिप करेगा, यह एक मुद्दा नहीं होना चाहिए। क्या इसके लिए विजुअल स्टूडियो में शायद कुछ सेटिंग है, जो मुझे नहीं मिल रहा है?क्या विजुअल स्टूडियो डिजाइनर में एक फॉर्म का आकार स्क्रीन रिज़ॉल्यूशन तक सीमित है?

संपादित करें: मेरा मुख्य मुद्दा यह है कि मुझे एक लैपटॉप (उदाहरण के लिए) 1440x900 आकार के प्रारूप को एक लैपटॉप (उदाहरण के लिए) 1360x768 स्क्रीन के साथ डिज़ाइन करने में सक्षम होना चाहिए।

+1

की नकल की मेरी 1360x768 लैपटॉप पर बहुत से लोगों को, मैं भी कोड की तरह। मुझे अभी तक उस समस्या का सामना नहीं हुआ है, लेकिन आपके लिए धन्यवाद, मेरे पास पहले से ही एक कामकाज होगा! – Tipx

उत्तर

24

दुर्भाग्य से (मुझे उम्मीद है कि कोई और बेहतर समाधान पोस्ट करेगा!), केवल कामकाज मुझे पता है कि फार्म के अंदर एक पैनल रखना है।

Autoscroll और AutoSize मूल रूप से मूल रूप से गुणों को सेट करें। फिर पैनल आकार को वांछित आकार में बढ़ाएं। फॉर्म स्वयं भी आपके स्क्रीन रिज़ॉल्यूशन से बड़ा नहीं होगा, लेकिन यह स्क्रॉल बार दिखाएगा, इसलिए कम से कम आप डिज़ाइनर का उपयोग अपने आकार की सीमाओं से परे बड़े पैनल पर नियंत्रण आदि को छोड़ सकते हैं।

फिर, आपको रन-टाइम पर फॉर्म आकार को समायोजित करने के लिए कुछ कोड जोड़ने की आवश्यकता हो सकती है ताकि स्क्रॉल बार के बिना पैनल को दिखाने के लिए पर्याप्त हो (और शायद ऑटोस्कोल प्रॉपर्टी को भी अक्षम कर दें)।

मुझे पता है, यह एक विशेष रूप से अच्छा वैकल्पिक हल नहीं है ...

संपादित:

ऐसा लगता है कि यह जानबूझकर और डिजाइन द्वारा:

MSDN

संपत्ति पर्चा .Size: इस संपत्ति का अधिकतम मूल्य तक सीमित है स्क्रीन का संकल्प जिस पर फॉर्म चलता है। मान प्रत्येक स्क्रीन आयाम (क्षैतिज + 12 और लंबवत + 12) पर 12 पिक्सल से अधिक नहीं हो सकता है।

और फिर Microsoft Connect/Public Bug Tracking पर:

माइक्रोसॉफ्ट 2008/10/09 पर द्वारा पोस्ट 12:18 पर पूर्वाह्न

.नेट फ्रेमवर्क पर आपकी प्रतिक्रिया के लिए धन्यवाद!

आपके द्वारा रिपोर्ट की गई समस्या वास्तव में डिज़ाइन द्वारा है।

इस संपत्ति का अधिकतम मान स्क्रीन है जिस पर प्रपत्र रनों का संकल्प द्वारा सीमित है:

MSDN में http://msdn.microsoft.com/en-us/library/25w4thew.aspx पर, आप विषय Form.Size संपत्ति में निम्न जानकारी प्राप्त कर सकते हैं।मान प्रत्येक स्क्रीन आयाम (क्षैतिज +12 और लंबवत + 12) पर 12 पिक्सल से अधिक नहीं हो सकता है।

इसलिए, हम अपने रूपों को अनिश्चित काल तक विस्तारित नहीं कर सकते हैं। यह व्यवहार अन्य सॉफ़्टवेयर, जैसे नोटपैड और माइक्रोसॉफ्ट पेंट के साथ संगत है।

यह व्यवहार निम्न कोड के साथ mothed Form.SetBoundsCore (...) में परिभाषित किया गया है:

आकार अधिकतम = SystemInformation.MaxWindowTrackSize;

अगर (ऊंचाई> max.Height) {

height = max.Height; } 

अगर (चौड़ाई> max.Width) {

width = max.Width; } 

[...]

धन्यवाद, UIFx टीम

EDIT2:

के बाद से जांच की तरह (एक decompiler के रूप में ILSpy का प्रयोग करके) Forms.SetBoundsCore में hardcoded है:

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 –

+0

@Ben में हार्डकॉक्ड है: अच्छी जानकारी है। यह दुखद है कि वे अपने डिजाइन के फैसले से अपना स्टैंड रखते हैं और टिप्पणियों को स्वीकार नहीं करते हैं, भले ही इसका कोई मतलब न हो। – Tipx

0

Neil N के रूप में वर्णित है कि आप इसे कोड में निर्दिष्ट कर सकते हैं। हालांकि यदि आप स्क्रीन आकार या रिज़ॉल्यूशन प्राप्त करना चाहते हैं और फिर उस आकार को फॉर्म सेट करें तो आप इसे Screen.PrimaryScreen.Bounds और Screen.PrimaryScreen.BitsPerPixel ...

+0

आपके प्रयास के लिए धन्यवाद, मैंने वास्तविक प्रश्न के कुछ स्पष्टीकरण के साथ अपना प्रश्न अपडेट किया है। कामकाज के लिए –

1

मुझे इस मुद्दे के लिए एक काम मिल गया है। मेरे मामले में मुझे एक डिजाइन समय समाधान की आवश्यकता थी।

मैंने पाया कि डेस्कटॉप के साथ एक बहु प्रदर्शन प्रणाली का उपयोग प्रत्येक डिस्प्ले तक बढ़ाया गया है, यह प्रभावी ढंग से सिस्टम को बताता है कि आपका अधिकतम प्रदर्शन डिस्प्ले का संयोजन है।

यह एक काम है और दर्द है। मेरे लिए विशेष रूप से एक लैपटॉप के साथ क्षेत्र में था।

रनटाइम पर स्केलिंग ठीक है यदि आप एकाधिक सिस्टम को लक्षित कर रहे हैं। लेकिन अगर यह सिर्फ एक ही लक्ष्य प्रणाली (एक आकार का डिस्प्ले) है, तो यह डिज़ाइन कोडिंग और रनटाइम में एक अनियंत्रित ओवरहेड है।

माइक्रोसॉफ्ट को यह महसूस करना चाहिए था कि यह एक बुरा विचार था या कम से कम इस "डिज़ाइन फीचर" को ओवरराइड करने का विकल्प दिया गया था।

4

फॉर्म से व्युत्पन्न, कुछ गुणों को ओवरराइड करना और इंटरऑप का उपयोग करना। यह वीबी.नेट क्षमा चाहता है लेकिन आपको विचार मिलता है।

व्युत्पन्न रूप का उपयोग करके आप क्रमशः डिजाइन और रनटाइम के लिए "साइजडिज़ाइन" और "साइज रनटाइम" गुणों का उपयोग कर सकते हैं।

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 

एजे।

+0

इसे पोस्ट करने के लिए बहुत बहुत धन्यवाद! एक जादू की तरह काम करता है। – user1003916

+1

बस इसका परीक्षण किया गया है, मेरे लिए काम नहीं करता है :( – TMS

2

धन्यवाद सब, खासकर बेन श्विन! ऊपर दी गई जानकारी के साथ, यदि आपका ऐप आधार फॉर्म का उपयोग करता है, तो आप निम्न परिवर्तन (सी # में) कर सकते हैं जो इससे प्राप्त सभी रूपों से सीमा को हटा देगा।

[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

मुझे एक गूंगा काम मिल गया जो मुझे डिजाइन स्थान में बड़े आकार के आकारों को देखने और उपयोग करने देता है।

मैं 1240x924 मॉनीटर के लिए 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; 
    } 

} 
संबंधित मुद्दे