С++/CLI и динамические контролы
Диалект C++/CLI, наряду с языком C# используемый при программировании Windows-приложений на платформе .NET, традиционно считается сложным для освоения.
На самом деле, если иметь базовым языком C++, то ничего там сложного нет, а "прямая" совместимость между C# и C++/CLI - стопроцентная, хотя для "обратной" это не всегда так, особенно если дело касается разумной по затратам времени адаптации нативного C/C++-кода к новым платформам или необходимости написания высокопроизводительного кода. В этих случаях C++/CLI становится предпочтительней.
Кстати, проекты Windows Forms на C++/CLI в Studio 2019 опять перестали считаться "устаревшими", а Microsoft возлагает надежды на дальнейшее широкое применение этой технологии.
В этой же заметке мы просто решаем пару типовых затруднений новичков, часто связанных с динамическим созданием компонент интерфейса.
Выполнить эти примеры можно, например, по событию загрузки формы Load
.
Динамическое создание контрола, на примере кнопки
Button^ button1 = gcnew Button(); // создаем контрол button1->Location = System::Drawing::Point(100, 50); //положение button1->Name = L"button1"; //имя button1->Size = System::Drawing::Size (80, 24); //размер button1->TabIndex = 0; //порядок обхода на форме button1->Text = L"Кнопка 1"; //надпись button1->Click += gcnew EventHandler(this, &Form1::button1_Click); //обработчик события нажатия на кнопку Controls->Add (button1); // добавляем на форму
Если непонятно, как динамически создать те или иные контролы, сделайте это в режиме дизайна форм, а потом откройте функцию InitializeComponent
, которая находится в файле .h
в теле функции-конструктора вашей формы. Это функция - код, автоматически генерируемый дизайнером, посмотрите, как там создаётся тот или иной компонент и скопируйте код.
Удалить нашу кнопку можно так:
Controls->Remove(button1); delete button1;
Следующие три примера показаны для текстового поля TextBox
.
Создание массива контролов
В общем, эта операция ничем не отличается от создания массива из любых других объектов в управляемом коде.
const int n = 10; array <TextBox ^> ^tb = gcnew array<TextBox^> (n); for (int i = 0; i < tb->Length; i++) { tb[i] = gcnew TextBox(); tb[i]->Location = System::Drawing::Point(101, 50 + i * 30); tb[i]->Name = L"textBox" + i.ToString(); tb[i]->Size = System::Drawing::Size(75, 23); tb[i]->TabIndex = i; tb[i]->Text = L"textBox" + i.ToString(); Controls->Add(tb[i]); }
К конкретному контролу теперь можно обращаться по индексу:
tb[2]->Text = L"newText";
Доступ к контролу по полученному из кода имени
//на форме должен быть создан textBox1 TextBox^ tb = dynamic_cast <TextBox^> (Controls[L"textBox1"]); if (tb != nullptr) tb->Text = L"newText"; //меняем свойство
Обход в цикле всех контролов нужного типа
//должно быть создано несколько TextBox'ов int n = 1; for each (Control ^ control in Controls) { TextBox ^tb = dynamic_cast<TextBox^>(control); if (tb != nullptr) tb->Text = L"Text"+(n++); //Выводим в каждый контрол свой текст }
15.12.2019, 19:07 [2849 просмотров]