Размер матрицы WinForm? - PullRequest
0 голосов
/ 28 мая 2010

WinForms (.NET 2) вопрос:

Есть ли способ держать элементы на пропорциональном расстоянии при изменении размера родительской формы (или панели)?

Могу ли я использовать Graphics.TransformPoints или Graphics.TransformVectors для этой области? Как. альтернативный текст http://lh5.ggpht.com/_1TPOP7DzY1E/S_-QWNbBoqI/AAAAAAAADN8/cNSRTfxLEoI/s800/Capture3.gif

EDIT:
TableLayoutPanel не будет работать, поскольку наложенные элементы должны быть приняты.

EDIT2:
Это мой код:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
using Microsoft.VisualBasic.PowerPacks;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        List<Point> points;
        List<Point> shapePoints;
        Matrix m;
        float dx, dy;

        public Form1()
        {
            InitializeComponent();

            points = new List<Point>();
            shapePoints = new List<Point>();
            foreach (Control c in this.Controls)
            {
                points.Add(c.Location);
            }

            foreach (Shape s in this.shapeContainer1.Shapes)
            {
                if (s is SimpleShape)
                {
                    shapePoints.Add((s as SimpleShape).Location);
                }
                else if (s is LineShape)
                {
                    shapePoints.Add((s as LineShape).StartPoint);
                }
            }

            m = new Matrix();
            dx = this.Width;
            dy = this.Height;

            // this code will allow(?) do not move this control
            this.shapeContainer1.Dock = DockStyle.Fill;
        }

        protected override void OnSizeChanged(EventArgs e)
        {
            dx = this.Width / dx;
            dy = this.Height / dy;
            ApplyScale(dx, dy);

            dx = this.Width;
            dy = this.Height;

            base.OnSizeChanged(e);
        }

        private void ApplyScale(float dx, float dy)
        {
            //m.Reset();
            m.Scale(dx, dy);

            Point[] locations = points.ToArray();
            m.TransformVectors(locations);

            for (int i = 0; i < this.Controls.Count; i++)
            {
                this.Controls[i].Location = locations[i];
            }

            Point[] shapeLocations = shapePoints.ToArray();
            m.TransformVectors(shapeLocations);

            for (int i = 0; i < this.shapeContainer1.Shapes.Count; i++)
            {
                SimpleShape ss = this.shapeContainer1.Shapes.get_Item(i) 
                                                             as SimpleShape;
                if (ss != null)
                {
                    ss.Location = locations[i];
                    continue;
                }

                LineShape ls = this.shapeContainer1.Shapes.get_Item(i) 
                                                             as LineShape;
                if (ls != null)
                {
                    ls.StartPoint = locations[i];
                    ls.Scale(new SizeF(dx, dy));
                }
            }
        }
    }
}

Вот что я получаю:

альтернативный текст http://lh4.ggpht.com/_1TPOP7DzY1E/TAOYg9fh5EI/AAAAAAAADOE/IPCdAFw-NFo/s800/Untitled-1.png

Ответы [ 2 ]

1 голос
/ 28 мая 2010

Это похоже на работу: При загрузке формы я сохраняю% -left и% -top для каждого элемента управления, размер которого я хочу изменить. Я храню его в свойстве Tag для легкого доступа. Затем в событии изменения размера я просто вычисляю новые% -left и% -top для каждого элемента управления и размещаю их.

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    For Each c As Control In Me.Controls
        c.Anchor = AnchorStyles.None
        c.Tag = CInt((100 / Me.Width) * c.Left).ToString & "|" & CInt((100 / Me.Height) * c.Top).ToString
    Next
End Sub

Private Sub Form1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize
    For Each c As Control In Me.Controls
        c.Location = New Point((Me.Width / 100) * CInt(Split(c.Tag, "|")(0)), (Me.Height / 100) * CInt(Split(c.Tag, "|")(1)))
    Next
End Sub

Начало:

альтернативный текст http://img52.imageshack.us/img52/4918/33405487.jpg

После изменения размера формы: альтернативный текст http://img190.imageshack.us/img190/4107/29607470.jpg

0 голосов
/ 28 мая 2010

Поместите закрепленную (или закрепленную) панель макета таблицы на форму и установите для всех ее столбцов / строк размер в процентах.

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

Edit:

Не могли бы вы увеличить количество столбцов / строк в вашем TLP для наложенных элементов?

Если уменьшить количество столбцов / строк, а затем добавить дополнительные TLP в ячейки, требующие большего позиционирования?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...