2010-06-12 101 views
0

时调整形式的所有元素我有这样的图像作为窗体的背景: enter image description hereC#尺寸变换形式


所以我的形式如下: http://img823.imageshack.us/i/cisto.jpg/


当我调整它看起来像这样:http://img820.imageshack.us/i/cistoumanjeno.jpg/


现在我需要做的就是把听众在每一个矩形像图片:http://img810.imageshack.us/img810/238/18887457.jpg


我做了透明面板,并把它们在形式相匹配的图像上的矩形(图像,面板绿色的,所以你可以看到他们在哪里):http://img809.imageshack.us/i/paneli.jpg/


但是当我调整窗体事实是这样的:http://img810.imageshack.us/i/paneliumanjeno.jpg/


锚和码头属性不起作用,因为它们依赖于父容器,并且此处矩形位于背景图像上。


问题: 我想这样做“相对调整大小和位置”。这是可行的吗?所以当我调整窗体大小时,所有面板都适合图像上的矩形。

UPDATE:
此代码的工作,唯一不好的是,当我调整的主要形式,它“strugles”。在调整大小时移动鼠标光标时,它会变得不平滑,因此会“变形”。在我停止调整面板大小之后,过了半秒之后,他们应该在哪里。

形象,同时调整: http://img13.imageshack.us/img13/3408/whileresizing.png

图片时,我停止调整大小,并停止调整后的半秒后: http://img99.imageshack.us/img99/7718/resizef.jpg

有关,或者我应该刚刚离开这种方式有什么建议?这里有很多计算,所以这就是为什么它挣扎。

+1

Form ... WebForm或WinForm? – 2010-06-12 01:18:34

回答

1

建立在和扩大mazzzzz的答案,我认为是这样的:上面

class MyForm : Form 
{ 
: 
List<Panel> m_panels = new List<Panel>(); 
List<Point> m_points = new List<Point>(); 
Size m_originalSize; 

IEnumerable<Panel> FindPanels() 
{ 
    foreach(var control in Controls) 
    { 
     Panel panel = control as Panel; 
     if (panel != null) 
      yield return panel; 
    } 
} 

void SnapshotOriginalLayout() 
{ 
    m_originalSize = ClientSize; 
    foreach(var panel in FindPanels()) 
    { 
     m_panels.Add(panel); 
     m_points.Add(panel.Location); 
     m_points.Add(new Point(panel.Size)); 
    } 
} 

Point [] GetTransformedPoints() 
{ 
    var points = m_points.ToArray(); 
    Matrix m = new Matrix(); 
    m.Scale(ClientSize.Width/(float) m_originalSize.Width, 
      ClientSize.Height/(float) m_originalSize.Height); 
    m.Transform(points); 
    return points; 
} 

void ApplyTransformedPoints(Point [] points) 
{ 
    int index = 0; 
    foreach(var panel in m_panels) 
    { 
     panel.Bounds = new Rectangle(points[index], 
            new Size(points[index + 1])); 
     index += 2; 
    } 
} 

void ResizePanels() 
{ 
    if (m_originalSize.Width == 0 || 
     m_originalSize.Height == 0) 
     return; 

    ApplyTranformedPoints(GetTranformedPoints()); 
} 

protected override void OnShown(EventArgs e) 
{ 
    SnapshotOriginalLayout(); 
    base.OnShown(e); 
} 

protected override void OnResizeEnd(EventArgs e) 
{ 
    base.OnResizeEnd(e); 
    RescalePanels(); 
} 
: 
} 

代码当前未经测试。如果您有任何菜单,工具栏,状态栏等,您可能需要调整m_originalSize值,并从存储在m_points列表中的panel.Location中减去偏移量。

希望这能给你一个好的起点。

2

使用比例系统。在表单处于正常大小时知道所有内容,您可以确定调整大小后的位置。

因此,如果需要在X要绘制的rectange(具有常规尺寸):125 Y:130,和正常大小是X:500 Y:550
然后比例将是

X:125/500 = X/NewXSize
Y:五百五十○分之一百三十○= Y/NewYSize

X = NewXSize *(125/500)
Y = NewYSize *(130/550)
(未测试)
最大