Опубликован: 01.11.2004 | Уровень: для всех | Доступ: свободно | ВУЗ: Московский государственный университет имени М.В.Ломоносова
Лекция 23:

Библиотека классов .NET Framework среды проектирования Visual Studio .NET. Формы Windows

< Лекция 22 || Лекция 23: 123 || Лекция 24 >
Аннотация: В лекции рассматривается процесс создания приложений-диалогов с использованием библиотеки классов .NET Framework, описывается применение класса Form, применение классов стандартных диалогов, построение системы меню.
Ключевые слова: MDI, windowstate

Приложения-диалоги

Создание формы

Формы Windows реализуются набором классов из пространства имен Systems.Windows.Forms.

Базовым классом для всех окон является класс Form.

Для создания приложения-диалога на языке С++ следует:

  1. В окне дизайнера создать диалоговую форму. Код, соответствующий создаваемой форме, записывается в файл с расширением .h (например, Form1.h).
  2. В методе main файла приложения выполнить создание формы вызовом метода Run объекта Application.
// D1.cpp : главный файл проекта.
#include "stdafx.h"
#include "Form1.h"    // Файл формы
using namespace D1;
[STAThreadAttribute]
int main(array<System::String ^> ^args)
{     // создание окна формы
  Application::Run(gcnew Form1());
  return 0;
}

Оператор gcnew создает экземпляр управляемого типа. Результатом выполнения данной операции является дескриптор, указывающий на объект управляемого типа. Для объявления переменной типа дескриптора используется операция ^. Доступ к свойствам и методам объекта через дескриптор выполняется операцией ->.

Редактор формы

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

При размещении в форме нового элемента управления соответствующий код добавляется в файл формы. Аналогично для задания значения каждого свойства в файл формы добавляется соответствующий set-метод. Методы-обработчики событий также помещаются в файл формы.

Следующий код представляет файл формы для формы, в которую добавлено два элемента управления - поле ввода и командная кнопка:

namespace D1 {
// Подключение используемых пространств имен
  using namespace System;
  using namespace System::ComponentModel;
  using namespace System::Collections;
  using namespace System::Windows::Forms;
  using namespace System::Data;
  using namespace System::Drawing;
          // ref class объявляет управляемый класс C++
public ref class Form1 :   
               public System::Windows::Forms::Form
{
public:
  Form1(void){InitializeComponent();}
protected:
  ~Form1(){if (components) {delete components;}}
         // Объявление элемента управления "кнопка": 
private: System::Windows::Forms::Button^  button1;
          // Объявление элемента управления 
      // "поле ввода": 
private: System::Windows::Forms::TextBox^  textBox1;
         // Объявление контейнера
private:System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code
              // Формируется дизайнером формы
  void InitializeComponent(void)
   {  // Создание объекта "кнопка":
  this->button1 = 
           (gcnew System::Windows::Forms::Button());
      // Создание объекта "поле ввода":
  this->textBox1 = 
           (gcnew System::Windows::Forms::TextBox());
  this->SuspendLayout();  // Временно 
            // приостанавливает события компоновки до 
            // вызова метода ResumeLayout или 
  // Задание свойств для кнопки button1
  this->button1->Location = 
                    System::Drawing::Point(427, 22);
  this->button1->Name = L"button1";
  this->button1->Size = System::Drawing::Size(75, 23);
  this->button1->TabIndex = 0;
  this->button1->Text = L"button1";
  this->button1->UseVisualStyleBackColor = true;
    // Определение обаботчика события Click для кнопки
  this->button1->Click += gcnew System::EventHandler(
                               this, 
                               &Form1::button1_Click);
  // Задание свойств для поля ввода textBox1
  this->textBox1->Location = 
                      System::Drawing::Point(80, 25);
  this->textBox1->Name = L"textBox1";
  this->textBox1->Size = 
                      System::Drawing::Size(100, 20);
  this->textBox1->TabIndex = 1;
  // Задание свойств для формы Form1
  this->AutoScaleDimensions = 
                       System::Drawing::SizeF(6, 13);
  this->AutoScaleMode = 
         System::Windows::Forms::AutoScaleMode::Font;
  this->ClientSize = System::Drawing::Size(548, 266);
..// Добавление в форму элементов управления
  this->Controls->Add(this->textBox1);
  this->Controls->Add(this->button1);
  this->Name = L"Form1";
  this->Text = L"Form1";
  this->ResumeLayout(false);
  this->PerformLayout();
  }
#pragma endregion
// Обработчик события для кнопки
private: System::Void button1_Click(
                 System::Object^  sender, 
                 System::EventArgs^  e) 
{this->textBox1->Text = L"123456"; }
};  // Конец реализации класса
}   // Конец пространства имен D1
Листинг 23.1.

При создании проекта приложения для языка C# сразу создается диалоговая форма. Автоматически формируемое приложение включает в себя файлы, приведенные на рис. 23.1.

Файлы проекта для C#

Рис. 23.1. Файлы проекта для C#

Файл Program.cs - это главный файл приложения, содержащий метод main. В этот файл по умолчанию вставляется следующий код:

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace D_1
{
static class Program
{ [STAThread]
 static void Main()
 {
 Application.EnableVisualStyles(); // Разрешает использовать для элементов управления визуальные стили. 
 Метод должен быть вызван до добавления в форму элементов управления
// Метод введен для .NET Framework version 2.0.:
 Application.SetCompatibleTextRenderingDefault(false); 
 Application.Run(new Form1());  // Создание формы
 }
 }
}

Файл Forms.Designer.cs содержит код метода InitializeComponent, в котором к окну формы добавляются все элементы управления и происходит настройка их свойств.

Также в данный файл помещается код объявления элементов управления, размещаемых в форме:

namespace D_1
{partial class Form1
 {
  private System.ComponentModel.IContainer 
                                    components = null;
 /// <summary>
 /// Clean up any resources being used.
 /// </summary>
 /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
 protected override void Dispose(bool disposing)
 {  if (disposing && (components != null))
       { components.Dispose();  }
    base.Dispose(disposing);
 }

#region Windows Form Designer generated code

/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
        /// </summary>
 private void InitializeComponent()
 {
  this.button1 = new System.Windows.Forms.Button();
  this.textBox1 = new System.Windows.Forms.TextBox();
  this.SuspendLayout();
  // Элемент управления button1
  this.button1.Location = 
                   new System.Drawing.Point(188,27);
  this.button1.Name = "button1";
  this.button1.Size = new System.Drawing.Size(75, 23);
  this.button1.TabIndex = 0;
  this.button1.Text = "button1";
  this.button1.UseVisualStyleBackColor = true;
  this.button1.Click += 
         new System.EventHandler(this.button1_Click);
  // Элемент управления textBox1
  this.textBox1.Location = 
                   new System.Drawing.Point(42, 30);
  this.textBox1.Name = "textBox1";
  this.textBox1.Size = 
                   new System.Drawing.Size(100, 20);
  this.textBox1.TabIndex = 1;
  // Окно формы Form1
  this.AutoScaleDimensions =    // Определяет размер 
               // окна как ширина и высота (тип float)
                 new System.Drawing.SizeF(6F, 13F);
  this.AutoScaleMode = 
             System.Windows.Forms.AutoScaleMode.Font;
  this.ClientSize = new System.Drawing.Size(292, 266);
  this.Controls.Add(this.textBox1);
  this.Controls.Add(this.button1);
  this.Name = "Form1";
  this.Text = "Form1";
  this.ResumeLayout(false);
  this.PerformLayout();       // Заставляет элемент 
        // управления выполнить для всех дочерних 
       // элементов компановку в соответствии 
      // с их свойствами
 }
#endregion
  // Объявление переменных
    private System.Windows.Forms.Button button1;
    private System.Windows.Forms.TextBox textBox1;
    }
}
Листинг 23.2.

Файл Forms.cs содержит описание всех добавляемых пользователем методов обработки событий ( переход между окном кода и окном дизайнера для формы может быть выполнен вызовом команды контекстного меню View Code или View Designer).

Для окна формы с двумя элементами управления - командная кнопка и поле ввода, и методом обработки события Click файл Forms.cs может содержать следующий код:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace D_1
{ public partial class Form1 : Form
{
public Form1() // Конструктор
{ InitializeComponent(); // Метод определен
//в файле Forms.Designer.cs
}
private void button1_Click(object sender,EventArgs e)
{ this.textBox1.Text = "123456789"; }
}
}
< Лекция 22 || Лекция 23: 123 || Лекция 24 >
Александр Демьяненко
Александр Демьяненко

Можно ли сдавать один и тот же тест несколько раз?
Или же один и тот же тест можно сдать лишь однажды?

Максим Стогний
Максим Стогний

Добрый день!

Скажите, пожалуйста, если в терминологии объектно-ориентированного программирования функции также называются методами или методами - членами класса, в примере объявления указателя на метод использовали в формальном описании оба названия:

тип_метода (имя_класса::*имя_метода_указателя)
    (список параметров);
тип_функции (*имя_ функции_указателя)
    (список параметров);

при этом можно было  тип_функции во втором описании заменить на тип_метода? Т.е.:

тип_метода (*имя_ метода_указателя)
    (список параметров);