Member 14779107 Ответов: 1

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

разве ты не можешь просто причалить и встать на якорь

1 Ответов

Рейтинг:
0

OriginalGriff

Даже не думай об этом.
It's complicated: a lot more so than you think: especially when you try to work with font sizes changing to fit text into resized controls. Think about it: font sizes are pretty much discrete values, which controls can grow and shrink by a pixel at a time. And font size is only usable when it is readable by the human sitting looking at it, and your code has no idea what is "readable", nor can it be defined as a "generic value". Add in that the font size is not just a function of the control size, but of the amount of data in the control - and many, many controls can contain a run-time determined amount of data - and the calculations not only become very complex, but also require a good deal of iteration and still probably won't result in a comfortable and readable form - let alone a "good looking" one - especially as the number of controls on a form increases.

Вместо этого посмотрите на весь дизайн пользовательского интерфейса и спроектируйте его так, чтобы он хорошо работал независимо от разрешения - например, макет VS центральной текстовой области, окруженный закрепляемыми "коробками", хорошо работает, но может не соответствовать вашему приложению.

Нет "одного решения", которое будет работать для всех приложений при всех разрешениях!