Vc++ - изменение размера всех элементов управления при изменении размера формы, включая размеры шрифтов
я создаю настольное приложение, поэтому, когда я пытаюсь изменить размер окна winform, все элементы управления изменяются во время выполнения. я также пробую C# и VB.net код в проекте, но он не работает...
Что я уже пробовал:
#include <string>
#include <unordered_map>
#включить <stdexcept>
#включить <любой>
#включить "floating_point_to_integer.h"
Вильного пространства имен { ограничителю класс ; }
//основная форма
Вильного пространства имен
{
форма form1 класс : государственная система: ОС:Windows::формы::Форма
{
частный:
Ограничителю *РС = новый ограничителю();
общественный:
виртуальный ~Form1()
{
удалить rs;
}
Форма 1()
{
метод InitializeComponent();
}
частный:
void Form1_Resize(std::any sender, EventArgs *e)
{
rs->ResizeAllControls(это);
}
void Form1_Load(std::any sender, EventArgs *e)
{
rs->FindAllControls(это);
}
};
}
//изменение размера класса
Вильного пространства имен
{
изменение размера класса
{
частный:
класс ControlInfo
{
общественный:
std::wstring name;
std::wstring parentName;
двойной leftOffsetPercent = 0;
двойной topOffsetPercent = 0;
двойной heightPercent = 0;
int originalHeight = 0;
int originalWidth = 0;
двойной widthPercent = 0;
float originalFontSize = 0;
};
частный:
с std::unordered_map на<и std::wstring, которая, controlinfo=""&ГТ; ctrlDict = с std::unordered_map на<и std::wstring, которая, controlinfo=""&ГТ;();
общественный:
void FindAllControls(System::Windows::Forms::Control *thisCtrl)
{
// -- Если текущий элемент управления имеет родителя, сохраните все исходное относительное положение
// -- и информация о размере в словаре.
// -- Рекурсивно вызывайте FindAllControls для каждого элемента управления, содержащегося в
// -- текущий контроль
для (auto ctl : *thisCtrl->элементы управления)
{
пробовать
{
if (ctl->Parent != nullptr)
{
auto parentHeight = ctl->Parent->Height;
auto parentWidth = ctl->Parent->Width;
автомобили с = ControlInfo();
c.name = ctl->имя;
гр.parentName = ПНО-&ГТ;родитель-и GT;имя;
гр.topOffsetPercent = метод static_cast&ЛТ;двойной&ГТ;(ЦТЛ-и GT;высокое) / метод static_cast&ЛТ;двойной&ГТ;(parentHeight);
гр.leftOffsetPercent = метод static_cast&ЛТ;двойной&ГТ;(ЦТЛ-и GT;слева) / метод static_cast&ЛТ;двойной&ГТ;(parentWidth);
гр.heightPercent = метод static_cast&ЛТ;двойной&ГТ;(ПНО-&ГТ;Высота) / метод static_cast&ЛТ;двойной&ГТ;(parentHeight);
гр.widthPercent = метод static_cast&ЛТ;двойной&ГТ;(ПНО-&ГТ;ширина) / метод static_cast&ЛТ;двойной&ГТ;(parentWidth);
гр.originalFontSize = ПНО-&ГТ;шрифт-&ГТ;размер;
c.originalHeight = ctl->Высота;
c.originalWidth = ctl->ширина;
ctrlDict.emplace(c.name, с);
}
}
catch (const std::runtime_error &ex)
{
Отладка::печать(исх.что());
}
если (ЦТЛ-и gt;Управление-&ГТ;Граф &ГТ; 0)
{
FindAllControls(ПНО);
}
} // -- Для Каждого
}
void ResizeAllControls(System::Windows::Forms::Control *thisCtrl)
{
поплавок fontRatioW;
поплавок fontRatioH;
поплавок fontRatio;
Система::рисунок::шрифт *f;
// -- Изменение размера и перемещение всех элементов управления в переданном элементе управления
для (auto ctl : *thisCtrl->элементы управления)
{
пробовать
{
if (ctl->Parent != nullptr)
{
auto parentHeight = ctl->Parent->Height;
auto parentWidth = ctl->Parent->Width;
автомобили с = ControlInfo();
bool ret = false;
пробовать
{
// -- Получить информацию о текущем элементе управления из словаря control info
с std::unordered_map на<и std::wstring, которая, controlinfo=""&ГТ;::const_iterator ctrlDict_iterator = ctrlDict.найти(ЦТЛ.Название);
рэт = ctrlDict_iterator != ctrlDict.конец();
c = ctrlDict_iterator->Второй;
// -- Если найдено, отрегулируйте текущее управление на основе относительного управления
// -- информация о размере и положении, хранящаяся в словаре
если (ret)
{
// -- Размер
ctl->Width = FloatingPointToInteger::ToInt32(parentWidth * c.widthPercent);
ctl->Height = FloatingPointToInteger::ToInt32(parentHeight * c.heightPercent);
// -- Позиция
ctl->Top = FloatingPointToInteger::ToInt32(parentHeight * c.topOffsetPercent);
ctl->Left = FloatingPointToInteger::ToInt32(parentWidth * c.leftOffsetPercent);
// -- Шрифт
f = ctl->шрифт;
fontRatioW = ctl->Width / c.originalWidth;
fontRatioH = ctl->Height / c.originalHeight;
fontRatio = (fontRatioW + fontRatioH) / 2; // -- Среднее изменение высоты и ширины элемента управления
ПНО-&ГТ;шрифт = новый шрифт(Ф-&ГТ;строка, гр.originalFontSize * fontRatio, Ф-&ГТ;стиль);
}
}
ловить (...)
{
}
}
}
catch (const std::runtime_error &ex)
{
}
// -- Рекурсивный вызов элементов управления, содержащихся в текущем элементе управления
если (ЦТЛ-и gt;Управление-&ГТ;Граф &ГТ; 0)
{
ResizeAllControls(ПНО);
}
} // -- Для Каждого
}
};
}
gggustafson
разве ты не можешь просто причалить и встать на якорь