БлогNot. С++/CLI и динамические контролы

С++/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++); //Выводим в каждый контрол свой текст
}

теги: программирование c++ studio памятка

15.12.2019, 19:07; рейтинг: 329