2010-02-06 29 views
0

我有要求在調整窗體大小時調整窗體上的所有控件的大小。 不幸的是,由於一些問題,我不能使用任何容器控件或使用錨/碼頭屬性。我需要使用代碼來做所有事情。 我可以根據屏幕調整大小的比例調整控件的大小。在執行此調整大小時,我需要計算所有控件的新位置以及新大小。問題是在計算這些新點時,我得到了十進制的新值,如果我將它們四捨五入,那麼每次調整窗體大小時都會導致問題並計算錯誤的大小和位置。 我看到一些第三方控件的相同任務,但他們都準確計算出位置。在調整Winform上的控件大小時解決舍入錯誤

請幫我解決這個問題。 在此先感謝, Ashish Sharma

回答

0

這是C#/ Windows窗體?

手動縮放是頸部疼痛。實際上,完全防止表單的長期生命週期中的任何主要舍入錯誤的唯一方法是存儲您重新定位/調整大小的每個控件的原始位置和大小,並使所有重新定位/調整大小代碼相對於原始位置而不是現在的位置。

最終你會與一些fugliness這樣的:

public class Form1 
{ 
    private Size originalFormSize; 

    private List<Control> controlsToResize = new List<Control>(); 
    private List<Point> originalLocations; 
    private List<Size> originalSizes; 

    public Form1() 
    { 
     InitializeComponent(); 
     SaveOriginalSizes(); 
    } 

    private void SaveOriginalSizes() 
    { 
     originalFormSize = Size; 
     controlsToResize.Add(panel1); 
     controlsToResize.Add(panel2); 
     ... 
     originalLocations = new List<Point>(controlsToResize.Count); 
     originalSizes = new List<Size>(controlsToResize.Count); 
     foreach (Control c in controlsToResize) 
     { 
      originalLocations.Add(c.Location); 
      originalSizes.Add(c.Size); 
     } 
    } 

    protected override void OnResize(EventArgs e) 
    { 
     base.OnResize(e); 
     float scaleX = (float)originalFormSize.Width/Size.Width; 
     float scaleY = (float)originalFormSize.Height/Size.Height; 
     for (int i = 0; i < controlsToResize.Count; i++) 
     { 
      Control c = controlsToResize[i]; 
      UpdatePosition(c, originalLocations[i], scaleX, scaleY); 
      UpdateSize(c, originalSizes[i], scaleX, scaleY); 
     } 
    } 
} 

......很明顯,您將不得不實現你自己的UpdatePositionUpdateSize方法 - 我假設你已經有了某種的實施。

老實說,這真是太神奇了。我會強烈建議,而不是試圖做任何這一點,你重訪任何要求/設計約束是阻止您使用AnchorDock屬性。在我所有年份中,我不認爲我曾經聽說過不使用這些或佈局控件TableLayoutPanel/FlowLayoutPanel或兩者的合法理由。那些是的方式來處理WinForms中的佈局;其他任何東西都是笨拙的黑客。

+0

Hi Aaronaught, 感謝您的回覆。 我可以理解,使用錨點和碼頭是最簡單的方法,但不能使用相同的:( 反正,我會盡量保存控件的初始位置,並按照這些位置計算,我會讓你知道結果後,我執行。 – 2010-02-10 00:51:03

相關問題