본문 바로가기

IT/Dot Net

윈도우 폼 개발후 배포시 사이즈가 이상하다...?

AutoScaleMode열거형

Windows Forms에서 지원하는 여러 종류의 자동 크기 조정 모드를 지정합니다.

네임스페이스: System.Windows.Forms

어셈블리: System.Windows.Forms(System.Windows.Forms.dll)

구문

public enum AutoScaleMode

멤버 이름

설명

None

자동 크기조정을 사용할 없습니다.

Font

클래스에서 사용하는글꼴(대개 시스템 글꼴) 크기를 기준으로 크기를 제어합니다.

Dpi

디스플레이 해상도를 기준으로 크기를 제어합니다.일반적인 해상도는 96DPI 120DPI입니다.

Inherit

클래스의 부모 크기 조정 모드에 따라 크기를 제어합니다.부모가 없는 경우 자동 크기 조정을 사용할 없습니다.

설명

ContainerControl 클래스와 클래스에서 파생된 Form 등의 클래스에서는 해당 항목 자체와 내용의 크기를 현재 시스템 글꼴 또는 디스플레이 해상도(DPI) 따라 자동으로 조정할 있습니다.AutoScaleMode 열거형은 이러한 클래스와 이러한 클래스의 파생 형식에서 지원하는 자동 크기 조정 모드를 정의합니다.컨트롤의 현재 모드는 ContainerControl.AutoScaleMode 속성을 통해 액세스할 있습니다.

대부분의 비즈니스 응용 프로그램에서는 Font 자동 크기 조정 모드를 사용해야 합니다.Dpi 크기 조정 모드는 그래픽 기반 응용 프로그램에 유용하며 .NET Compact Framework에서 사용하는 기본 크기 조정 기능과 호환됩니다.

중요

중요

.NET Framework 버전 1.0 1.1에서 지원되는 자동 크기 조정 기능은 항상 현재 시스템 글꼴에 따라 달라지는 단순한 메커니즘을 사용했습니다. 메커니즘은 이상 사용되지 않지만 이전 버전과의 호환성을 위해 여전히 지원됩니다.포함하는 Form AutoScale 속성을 true 설정하여 이전의 크기 조정 동작을 가져올 있습니다. 이러한 작업을 수행하면 ContainerControl.AutoScaleMode 속성도 None으로 암시적으로 설정됩니다.반면에 폼의 ContainerControl.AutoScaleMode 속성을 설정하면 AutoScale false 설정되어.NET Framework 버전 2.0에서 도입된 새로운 크기 조정 메커니즘을 사용하게 됩니다.

Smartphone 응용 프로그램에서 열거형을 사용하려면 Smartphone Windows Mobile 버전 5.0 소프트웨어가필요합니다.

버전 정보

.NET Framework

4, 3.5, 3.0, 2.0에서 지원

.NET Framework Client Profile

4, 3.5 SP1에서 지원

플랫폼

Windows 7, Windows Vista SP1 이상, Windows XP SP3, Windows XP SP2 x64 버전,Windows Server 2008(Server Core 지원되지 않음), Windows Server 2008 R2(Server CoreSP1 이상에서 지원됨), Windows Server 2003 SP2

.NET Framework에서 모든 플랫폼의 전체 버전을 지원하지는 않습니다. 지원되는 버전의 목록을 보려면 .NET Framework 시스템 요구 사항 참조하십시오.

참조

System.Windows.Forms 네임스페이스

ContainerControl.AutoScaleMode

BoundsSpecified

정보가 도움이 되었습니까? 예아니요

<http://msdn.microsoft.com/ko-kr/library/system.windows.forms.autoscalemode.aspx>에서 삽입

 

MSDN 에서 발췌한 내용이다.

 

보통 잘 신경쓰지 않는 속성 하나 때문에 고생 좀 했다...

 

C# 으로 윈폼 어플 개발을 했는데.... 대부분의 컨트롤을 GDI+ 로 직접 그려줘야 했다...

 

그리고, 당당하게 1차 중간점검을 위해 업체에 가서 설명하고 테스트 했다... (물론 내 노트북에서...)

 

그리고, 집으로 돌아오는 길에 윈도우8 에서 실행하니 일부 컨트롤이 깨져서 보인네요... ^,.^;;;;  머지???

 

그래서 Virtual Box 에 직접 설치해서 실행해 보니... 이런... 엉망이다... 머지? 아직 Preview 버전이라 그런가... 내 노트북과 데스크탑... 그리고 업체에서도 아무말 없었는데.... 하필 윈도우8 에 배포될거란다... 헉... 실컷 했는데...다 무용지물인가? ㅋㅋ...

 

노트북에 Visual Studio 11 beta 를 깔아서 다시 빌드한후 윈도우8 에서 실행해 보면..또 마찬가지... 우쒸~

 

그래서 Virtual Box 에 VS 2010 을 직접 설치해서 디버깅 해 보았다...

 

특정 컨트롤을 잡아서 디버깅을 했는데... 분명 해당 컨트롤은 사이즈가 고정값으로 할당하게 되어 있는데... 생성자에서 고정값으로 할당하고

 

OnPaint 에서 영역게산 하는 부분에서 ClientRectangle 을 BreakPoint 걸어서 확인해 보면 사이즈가 이상하게 변경되어 있다...

 

머지?? ㅡㅡ;;

 

머 이래 저래 삽질 하다가 결국 위 프로퍼티가 문제....

 

System.Windows.Forms.ContainerControl 를 상속받아서 AutoScaleMode 속성이 있는 모든 컨트롤의 속성을 변경해 주기로 했다. (DPI 로)

 

아래는 AutoScaleMode 소스...

 

/// <summary>
    /// 컨트롤의 자동 크기 조정 모드를 가져오거나 설정합니다.
    /// </summary>
    ///
    /// <returns>
    /// 현재 크기 조정 모드를 나타내는 <see cref="T:System.Windows.Forms.AutoScaleMode"/>입니다.기본값은 <see cref="F:System.Windows.Forms.AutoScaleMode.None"/>입니다.
    /// </returns>
    /// <exception cref="T:System.ComponentModel.InvalidEnumArgumentException">유효하지 않은 <see cref="T:System.Windows.Forms.AutoScaleMode"/> 값을 사용하여 이 속성을 설정한 경우</exception>
    [Browsable(false)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    [SRCategory("CatLayout")]
    [SRDescription("ContainerControlAutoScaleModeDescr")]
    [EditorBrowsable(EditorBrowsableState.Advanced)]
    public AutoScaleMode AutoScaleMode
    {
      get
      {
        return this.autoScaleMode;
      }
      set
      {
        if (!System.Windows.Forms.ClientUtils.IsEnumValid((Enum) value, (int) value, 0, 3))
          throw new InvalidEnumArgumentException("value", (int) value, typeof (AutoScaleMode));
        bool flag = false;
        if (value != this.autoScaleMode)
        {
          if (this.autoScaleMode != AutoScaleMode.Inherit)
            this.autoScaleDimensions = SizeF.Empty;
          this.currentAutoScaleDimensions = SizeF.Empty;
          this.autoScaleMode = value;
          flag = true;
        }
        this.OnAutoScaleModeChanged();
        if (!flag)
          return;
        this.LayoutScalingNeeded();
      }
    }

 

autoScaleDimensions 도 바뀐다...

 

현재 내 노트북 (굴림, 9pt) <=> VirtualBox 에 설치된 윈도우8 (Microsoft Sans Serif, 8.5pt)

 

으... 영문이 이었지... 폰트가 다르다.. 그래서 폰트에따라 Scaling 다르게 적용되다 보니... 쩝...

 

this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F);
 this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;

this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;

 

지금까지는 영문판에 배포해서 이상하면 걍 폰트롤 맞추거나 했는데...

 

디자이너 띄워서 아예 ScaleMode 를 DPI 로 변경하니...그대로 잘 적용된다...

 

물론 메인 폼 뿐만 아니라...System.Windows.Forms.ContainerControl 를 상속받는 모든 컨트롤의 속성을 변경해 줘야 한다는 점이 중요 !!

 

혹시나 다음에 잊어버릴까바... 장황하게 코멘트(?) 한다...

 

아유... 이거 삽질한다고.. 진도 하나도 못 나갔네 ㅠ,.ㅠ

 

결국...GDI+ 탓도...윈도우8 탓도... 영문판이라는 탓도 할 수 없다. 매커니즘을 제대로 파악하지 않았고...그동안 그냥 대충 넘어가서 그런가 보다...

 

되도록 이면 조금 이라도 더 깊이 제대로 이해하고 넘어가야 하겠다...