C # изменить размер всех элементов в форме при изменении размера формы - PullRequest
0 голосов
/ 12 июня 2010

У меня есть это изображение в качестве фона формы: enter image description here


Итак, моя форма выглядит так: 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/


свойства привязки и закрепления не работают, поскольку они зависят от родительского контейнера, а здесь прямоугольники находятся на фоновом изображении.


ВОПРОС: Я хотел бысделать что-то вроде "относительного изменения размера и положения".Это возможно?Поэтому, когда я изменяю размер формы, все панели соответствуют прямоугольникам на изображении.

ОБНОВЛЕНИЕ:
Этот код работает, только плохая вещь, когда я изменяю размер основной формы, он "изо всех сил"».Когда я перемещаю курсор мыши во время изменения размера, он не становится гладким, он "борется".И через полсекунды после того, как я перестаю изменять размеры, панели находятся там, где они должны быть.

Изображение при изменении размера: http://img13.imageshack.us/img13/3408/whileresizing.png

Изображение, когда я прекращаю изменение размера, и через полсекунды после остановки изменения размера:http://img99.imageshack.us/img99/7718/resizef.jpg

Есть предложения по этому поводу или я должен просто оставить это так?Здесь много вычислений, поэтому он борется.

Ответы [ 2 ]

2 голосов
/ 12 июня 2010

Используйте систему пропорций. Зная, где находится все, когда форма имеет нормальный размер, вы можете определить, где она будет, когда вы измените размер.

Таким образом, если прямоугольник (с обычным размером) нужно нарисовать в X: 125 Y: 130, а нормальный размер - X: 500 Y: 550
тогда пропорция будет

x: 125/500 = x / NewXSize
y: 130/550 = y / NewYSize
или
x = NewXSize * (125/500)
y = NewYSize * (130/550)
(Не проверено)
Max

1 голос
/ 12 июня 2010

Опираясь на и расширяя ответ 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.

Надеюсь, это даст вамотправная точка.

...