2010-06-12 6 views
0

J'ai cette image comme arrière-plan de la forme: enter image description hereC# redimensionner tous les éléments sous forme lors du redimensionnement de forme


ma forme ressemble donc à ceci: http://img823.imageshack.us/i/cisto.jpg/


Quand je redimensionner il ressemble à ceci: http://img820.imageshack.us/i/cistoumanjeno.jpg/


Maintenant, ce que je dois faire est de mettre les auditeurs sur chaque rectangle comme sur l'image: http://img810.imageshack.us/img810/238/18887457.jpg


J'ai fait des panneaux transparents et les mettre sur le formulaire pour faire correspondre les rectangles sur l'image (sur l'image, les panneaux sont vert afin que vous puissiez voir où ils sont): http://img809.imageshack.us/i/paneli.jpg/


mais quand je redimensionne la forme il se présente comme suit: http://img810.imageshack.us/i/paneliumanjeno.jpg/


Les propriétés anchor et dock ne fonctionnent pas car elles reposent sur le conteneur parent et les rectangles se trouvent sur l'image d'arrière-plan.


QUESTION: Je voudrais faire quelque chose comme "-Redimensionner et la position relative". Est-ce que c'est posible? Donc quand je redimensionne la forme, tous les panneaux correspondent aux rectangles de l'image.

MISE À JOUR:
Ce code fonctionne, seule mauvaise chose est quand je suis Redimensionnement principale forme, il « strugles ». Lorsque je déplace le curseur de la souris pendant le redimensionnement, il ne va pas en douceur, il "strugles". Et après une demi-seconde après avoir arrêté de redimensionner les panneaux sont là où ils devraient être.

image lors du redimensionnement: http://img13.imageshack.us/img13/3408/whileresizing.png

image quand j'arrête le redimensionnement, et après une demi-seconde après Redimensionnement d'arrêt: http://img99.imageshack.us/img99/7718/resizef.jpg

Toute suggestion à ce sujet ou je devrais laisser cette façon? Il y a beaucoup de calculs ici, c'est pourquoi ça a du mal.

+1

Formulaire ... WebForm ou WinForm? –

Répondre

1

étoffant et en élargissant la réponse de mazzzzz, je suggère quelque chose comme:

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(); 
} 
: 
} 
code

ci-dessus est actuellement non testé. Si vous avez des menus, des barres d'outils, des barres d'état, etc., vous devrez peut-être modifier la valeur de m_originalSize et soustraire un offset du panel.Location stockée dans la liste m_points.

Espérons que cela vous donne un bon point de départ.

2

Utilisez un système de proportions. Sachant où tout se trouve lorsque le formulaire est dans sa taille normale, vous pouvez déterminer où il sera lorsque vous redimensionnez.

Donc, si le rectange (à taille régulière) doit être tiré à X: 125 Y: 130, et la taille normale est X: 500 Y: 550
la proportion serait alors

x: 125/500 = x/NewXSize
y: 130/550 = y/NewYSize
ou
x = NewXSize * (125/500)
y = NewYSize * (130/550)
(non testé)
Max

Questions connexes