這是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);
}
}
}
......很明顯,您將不得不實現你自己的UpdatePosition
和UpdateSize
方法 - 我假設你已經有了某種的實施。
老實說,這真是太神奇了。我會強烈建議,而不是試圖做任何這一點,你重訪任何要求/設計約束是阻止您使用Anchor
和Dock
屬性。在我所有年份中,我不認爲我曾經聽說過不使用這些或佈局控件TableLayoutPanel
/FlowLayoutPanel
或兩者的合法理由。那些是的方式來處理WinForms中的佈局;其他任何東西都是笨拙的黑客。
Hi Aaronaught, 感謝您的回覆。 我可以理解,使用錨點和碼頭是最簡單的方法,但不能使用相同的:( 反正,我會盡量保存控件的初始位置,並按照這些位置計算,我會讓你知道結果後,我執行。 – 2010-02-10 00:51:03