Форум программистов, компьютерный форум, киберфорум
C++/CLI Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/25: Рейтинг темы: голосов - 25, средняя оценка - 4.76
3 / 3 / 2
Регистрация: 18.12.2014
Сообщений: 64

Пропорциональные изменение размеров и позиций элементов формы

15.08.2015, 18:30. Показов 5040. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В стандартных свойствах элементов формы таких фич нет, так что нужна программная реализация.
Допустим, есть такая форма: Название: 1.png
Просмотров: 178

Размер: 12.2 Кб
Нужно, чтобы при ресайзе главного окна расстояние между надписями и текстбоксами не изменялось как относительно друг друга, так и относительно границ окна.
Например: (рисовал на глаз, но принцип понятен).
На этом форуме есть похожая тема, но решение, предложенное там, мне не совсем подходит: разве что нужно вручную в событии SizeChanged изменять размер и положение элементов. Немного поколдовав, ничего не придумал.
Есть обработчик изменения размеров окна - Form1_SizeChanged. Есть текстбокс1, приклеенный к верхней, левой и правой границам окна, высоту которого - textBox1->Height - надо менять. Есть надпись, приклеенная к левой границе, положение по оси У которой (надписи) надо менять на столько пикс., на сколько изменилась высота textBox1 - label2->Location->Y. И есть textBox2, который приклеен к нижней, левой и правой границам окна, так что надо менять его textBox2->Height.
Кто может помочь?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.08.2015, 18:30
Ответы с готовыми решениями:

Как запретить изменение размеров формы
Подскажите. VisualStudio 2008 C++/ Необходимо, чтобы форму нельзя было увеличить или уменьшить

Изменение размеров элементов, при изменение размеров формы
Доброго времени суток, подскажите, как в VS2016 реализовать подобное, а именно: Имеются следующая форма: С нижним текстбоксом я...

Изменение размеров элементов, сохраняя пропорции, при изменении размеров самой формы
Как изменять размеры элементов, сохраняя пропорции, при изменении размеров самой формы?

5
3 / 3 / 2
Регистрация: 18.12.2014
Сообщений: 64
15.08.2015, 22:35  [ТС]
ах да, у нижнего текстбокса надо еще менять координату Y на столько, на сколько изменилась высота textBox1, чтоб он сдвигался вместе с label2. label1 должен стоять на месте

Добавлено через 2 часа 32 минуты
вот немного придумал:
C++
1
2
3
4
5
private: 
System::Void Form1_SizeChanged(System::Object^  sender, System::EventArgs^  e) 
{
    label2->Location.Y = this->Height * (202/443);
}
где 202 - начальная позиция по оси У надписи2, 443 - начальная высота окна.
Теперь расстояние между верхней и нижней границами окна и надписи2 остается постоянным, сама надпись ползает вдоль левого края
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9673 / 4825 / 763
Регистрация: 17.04.2012
Сообщений: 9,664
Записей в блоге: 14
16.08.2015, 15:57
Иван_Богданов, суровое решение, но в некоторых случаях приходится так делать. В WPF эта проблема решается панелями размещения (StackPanel, Grid) и т.д., но в формах их нет.
Вам придётся играться с 3 свойствами - Dock, Margin и Padding. Dock заставит размеры изменяться вместе с родительским контейнером, Margin и Padding будут сохранять неизменными отступы от края.
0
3 / 3 / 2
Регистрация: 18.12.2014
Сообщений: 64
16.08.2015, 16:53  [ТС]
придумал подходящий для этой цели вариант:
C++
1
2
3
4
5
6
System::Void Form1_SizeChanged(System::Object^ sender, System::EventArgs^ e)
{
    textBox1->Height = label2->Location.Y-28;
    textBox4->Height = textBox1->Height;
    textBox4->Location = System::Drawing::Point(12, label4->Location.Y+16);
}
до: Название: 1.png
Просмотров: 172

Размер: 13.5 Кб
после:
этот пример теперь используется в моей реальной проге. вот код той, что на скринах:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#pragma once
namespace testform {
    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;
    using namespace System::Threading;
    /// <summary>
    /// Сводка для Form1
    /// </summary>
    public ref class Form1 : public System::Windows::Forms::Form
    {
    public:
        Form1(void)
        {
            InitializeComponent();
            //
            //TODO: добавьте код конструктора
            //
        }
    protected:
        /// <summary>
        /// Освободить все используемые ресурсы.
        /// </summary>
        ~Form1()
        {
            if (components)
            {
                delete components;
            }
        }
    private: System::Windows::Forms::TextBox^ textBox1;
    protected:
    private: System::Windows::Forms::TextBox^ textBox4;
    private: System::Windows::Forms::Label^ label2;
    private: System::Windows::Forms::Label^ label4;
    private: System::Windows::Forms::Label^ label1;
    private:
        /// <summary>
        /// Требуется переменная конструктора.
        /// </summary>
        System::ComponentModel::Container ^components;
#pragma region Windows Form Designer generated code
        /// <summary>
        /// Обязательный метод для поддержки конструктора - не изменяйте
        /// содержимое данного метода при помощи редактора кода.
        /// </summary>
        void InitializeComponent(void)
        {
            this->textBox1 = (gcnew System::Windows::Forms::TextBox());
            this->textBox4 = (gcnew System::Windows::Forms::TextBox());
            this->label2 = (gcnew System::Windows::Forms::Label());
            this->label4 = (gcnew System::Windows::Forms::Label());
            this->label1 = (gcnew System::Windows::Forms::Label());
            this->SuspendLayout();
            //
            // textBox1
            //
            this->textBox1->Anchor = static_cast<System::Windows::Forms::AnchorStyles>((((System::Windows::Forms::AnchorStyles::Top | System::Windows::Forms::AnchorStyles::Bottom)
            | System::Windows::Forms::AnchorStyles::Left)
            | System::Windows::Forms::AnchorStyles::Right));
            this->textBox1->CharacterCasing = System::Windows::Forms::CharacterCasing::Upper;
            this->textBox1->Font = (gcnew System::Drawing::Font(L"Lucida Console", 9, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point,
            static_cast<System::Byte>(204)));
            this->textBox1->Location = System::Drawing::Point(12, 22);
            this->textBox1->MaxLength = 2147483647;
            this->textBox1->Multiline = true;
            this->textBox1->Name = L"textBox1";
            this->textBox1->Size = System::Drawing::Size(172, 20);
            this->textBox1->TabIndex = 0;
            this->textBox1->Text = L"TEXTBOX1";
            //
            // textBox4
            //
            this->textBox4->Anchor = static_cast<System::Windows::Forms::AnchorStyles>(((System::Windows::Forms::AnchorStyles::Bottom | System::Windows::Forms::AnchorStyles::Left)
            | System::Windows::Forms::AnchorStyles::Right));
            this->textBox4->Font = (gcnew System::Drawing::Font(L"Lucida Console", 9, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point,
            static_cast<System::Byte>(204)));
            this->textBox4->Location = System::Drawing::Point(12, 110);
            this->textBox4->MaxLength = 2147483647;
            this->textBox4->Multiline = true;
            this->textBox4->Name = L"textBox4";
            this->textBox4->Size = System::Drawing::Size(172, 20);
            this->textBox4->TabIndex = 3;
            this->textBox4->Text = L"textBox4";
            //
            // label2
            //
            this->label2->Anchor = System::Windows::Forms::AnchorStyles::Left;
            this->label2->AutoSize = true;
            this->label2->Location = System::Drawing::Point(12, 48);
            this->label2->Name = L"label2";
            this->label2->Size = System::Drawing::Size(35, 13);
            this->label2->TabIndex = 5;
            this->label2->Text = L"label2";
            //
            // label4
            //
            this->label4->Anchor = System::Windows::Forms::AnchorStyles::Left;
            this->label4->AutoSize = true;
            this->label4->Location = System::Drawing::Point(9, 94);
            this->label4->Name = L"label4";
            this->label4->Size = System::Drawing::Size(35, 13);
            this->label4->TabIndex = 7;
            this->label4->Text = L"label4";
            //
            // label1
            //
            this->label1->AutoSize = true;
            this->label1->Location = System::Drawing::Point(9, 6);
            this->label1->Name = L"label1";
            this->label1->Size = System::Drawing::Size(35, 13);
            this->label1->TabIndex = 4;
            this->label1->Text = L"label1";
            //
            // Form1
            //
            this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
            this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
            this->ClientSize = System::Drawing::Size(196, 180);
            this->Controls->Add(this->textBox1);
            this->Controls->Add(this->label4);
            this->Controls->Add(this->label2);
            this->Controls->Add(this->label1);
            this->Controls->Add(this->textBox4);
            this->MinimumSize = System::Drawing::Size(212, 218);
            this->Name = L"Form1";
            this->StartPosition = System::Windows::Forms::FormStartPosition::CenterScreen;
            this->Text = L"testform";
            this->SizeChanged += gcnew System::EventHandler(this, &Form1::Form1_SizeChanged);
            this->ResumeLayout(false);
            this->PerformLayout();
        }
#pragma endregion
 
 
    private:
    
        System::Void Form1_SizeChanged(System::Object^ sender, System::EventArgs^ e)
        {
            textBox1->Height = label2->Location.Y-28;
            textBox4->Height = textBox1->Height;
            textBox4->Location = System::Drawing::Point(12, label4->Location.Y+16);
        }
    };
}
только при огромном количестве текста в текстбоксах окно лагает при изменении размера (тестилось с ~100к символами в каждом)
0
3 / 3 / 2
Регистрация: 18.12.2014
Сообщений: 64
16.08.2015, 17:01  [ТС]
все значения подгонялись на глаз:
Цитата Сообщение от Иван_Богданов Посмотреть сообщение
label2->Location.Y-28
и тут:
Цитата Сообщение от Иван_Богданов Посмотреть сообщение
label4->Location.Y+16
0
3 / 3 / 2
Регистрация: 18.12.2014
Сообщений: 64
18.08.2015, 16:55  [ТС]
странно, что я не заметил это раньше: из-за этого костыля...
C++
1
2
3
4
5
6
System::Void Form1_SizeChanged(System::Object^ sender, System::EventArgs^ e)
{
    textBox1->Height = label2->Location.Y-28;
    textBox4->Height = textBox1->Height;
    textBox4->Location = System::Drawing::Point(12, label4->Location.Y+16);
}
...у textBox-ов 1 и 4 по непонятным мне причинам при сворачивании-разворачивании окна изменяется параметр ширины, так что при разворачивании их правые части немного уползают за видимую часть окна.
можно так проверить:
C++
1
2
3
4
5
6
7
System::Void Form1_SizeChanged(System::Object^ sender, System::EventArgs^ e)
{
    textBox1->Height = label2->Location.Y-28;
    textBox4->Text = Convert::ToString(textBox1->Width);
    textBox4->Height = textBox1->Height;
    textBox4->Location = System::Drawing::Point(12, label4->Location.Y+16);
}
при изменении размера окна за край в textBox4 будет отображаться ширина textBox1 (не спрашивайте, почему там). При мин. размере формы там будет 172, после сворачивания-разворачивания - 196.
исправил так:
C++
1
2
3
4
5
6
7
8
System::Void Form1_SizeChanged(System::Object^ sender, System::EventArgs^ e)
{
    textBox1->Height = label2->Location.Y-28;
    textBox1->Width = this->Width - 40;
    textBox4->Width = this->Width - 40;
    textBox4->Height = textBox1->Height;
    textBox4->Location = System::Drawing::Point(12, label4->Location.Y+16);
}
40 потому, что ширина_формы - ширина_textBox1 = 40
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.08.2015, 16:55
Помогаю со студенческими работами здесь

Изменение размеров элементов управления с изменением размеров формы
подскажите, как сделать так чтобы размер элементов управления изменялся пропорционально размерам формы. всё дело в том что я не знаю на...

Изменение размеров элементов формы
Нужна помощь с формой. Нужно, чтобы панель с кнопками и верхние панели с кнопками и текстовыми полями изменяли размер одинаково. У меня...

Согласованное изменение размеров элементов и формы
Можно ли сделать так, что бы при изменении размера формы, изменялись и размеры элементов ? Anchor не идет. Он меняет размер на столько,...

Изменение расположения элементов при изменении размеров формы
Из названия понятно - при изменении размеров формы пользователем необходимо изменить расположение элементов на ней. Суть формы такова, что...

Изменение размеров элементов при изменении формы (masm32)
Привет, есть форма на форме ListView. Создаю его так. ;тут функция invoke CreateWindowEx, WS_EX_STATICEDGE +...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru