2011-11-16 39 views
3

Windows窗體(包括Windows Forms for Compact Framwork,這是我正在使用的)有一個AutoScale feature。通過將AutoScaleMode property設置爲AutoScaleMode.Dpi,您爲320x200設計的應用程序將自動擴展到例如VGA設備的較大顯示屏。如何製作壓縮框架自定義控件AutoScale aware

這很好,但我有一些自制的自定義控件,他們自己OnPaint的東西,我希望他們也可以擴展。不幸的是,我沒有找到很好的文檔或例子來說明如何做到這一點。

目前,我這樣做:

protected SizeF zoom = new SizeF(1.0, 1.0); 

protected override void ScaleControl(SizeF factor, BoundsSpecified specified) 
{ 
    base.ScaleControl(factor, specified); 
    zoom = factor;  // remember the zoom factor 
} 

protected override void OnPaint(PaintEventArgs e) 
{ 
    // scale everything by zoom.Width and zoom.Height 
    ... 
    e.Graphics.DrawImage(...); 
    ... 
} 

它的工作原理,但我不知道這是否是「正確的方式」來做到這一點。由於(根據ILSpy)其他CF控件都沒有內部字段來存儲比例因子,所以我想知道是否有更容易或更好的方法來做到這一點。

回答

3

我們通常會在我們的控件和表單中處理OnResize中的所有縮放比例。我們還必須支持許多具有瘋狂維度和DPI的不同設備(有些平臺甚至不報告正確的DPI!)。我們發現AutoScaleMode已關閉,您可以按比例使用此類助手來縮放表格的子女OnResize。您只需在構造函數中添加一個Size _initalSize成員集到表單大小。不過,我通常在大多數表格中發現我必須編寫自定義佈局代碼來適當處理縱向和橫向顯示。

 protected override void OnResize(EventArgs e) 
    { 
     base.OnResize(e); 

     // Scale the control 
     ScaleChildren(this, ref _initialFormSize); 
    } 


     public static void ScaleChildren(Control control, ref Size initialSize, float fontFactor) 
    { 
     if (control == null || control.Size == initialSize) 
      return; 

     SizeF scaleFactor = new SizeF((float)control.Width/(float)initialSize.Width, (float)control.Height/(float)initialSize.Height); 
     initialSize = control.Size; 

     if (!float.IsInfinity(scaleFactor.Width) || !float.IsInfinity(scaleFactor.Height)) 
     { 
      foreach (Control child in control.Controls) 
      { 
       child.Scale(scaleFactor); 

       if (child is Panel) 
        continue; 

       try 
       { 
        // scale the font 
        float scaledFontSize = (float)(int)(child.Font.Size * scaleFactor.Height * fontFactor + 0.5f); 

        System.Diagnostics.Debug.WriteLine(
         string.Format("ScaleChildren(): scaleFactor = ({0}, {1}); fontFactor = {2}; scaledFontSize = {3}; \"{4}\"", 
         scaleFactor.Width, scaleFactor.Height, fontFactor, scaledFontSize, child.Text)); 

        child.Font = new Font(child.Font.Name, scaledFontSize, child.Font.Style); 
       } 
       catch { } 
      } 
     } 
    }