Лекция 26. Разработка функционального интерфейса приложения

Содержание

Слайд 2

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

Разработка функционального интерфейса приложения

Под графическим интерфейсом пользователя подразумевается тип экранного представления,

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

Разработка функционального интерфейса приложения Графический интерфейс пользователя любой серьезной программы должен

Разработка функционального интерфейса приложения

Графический интерфейс пользователя любой серьезной программы должен включать

в себя:
1. Главное меню.
2. Инструментальную панель быстрых кнопок, дублирующих основные разделы меню. Программа может содержать несколько инструментальных панелей и желательно дать пользователю возможность их перестроения.
3. Контекстные меню, всплывающие при щелчке пользователя правой кнопкой мыши на том или ином компоненте.
Слайд 4

Разработка функционального интерфейса приложения Графический интерфейс пользователя любой серьезной программы должен

Разработка функционального интерфейса приложения

Графический интерфейс пользователя любой серьезной программы должен включать

в себя:
4. Продуманную последовательность переключения фокуса управляющих элементов.
5. Клавиши быстрого доступа ко всем разделам меню и всем управляющим элементам, горячие клавиши для доступа к основным командам.
6. Ярлычки подсказок, всплывающие при перемещении курсора мыши над быстрыми кнопками и иными компонентами.
Слайд 5

Разработка функционального интерфейса приложения Графический интерфейс пользователя любой серьезной программы должен

Разработка функционального интерфейса приложения

Графический интерфейс пользователя любой серьезной программы должен включать

в себя:
7. Полосу состояния, используемую для развернутых подсказок и выдачи различной информации пользователю.
8. Файл справки, темы которого отображаются при нажатии клавиши (обычно F1) или при выборе пользователем соответствующего раздела меню.
9. Информацию о версии, доступную пользователю при щелчке на пиктограмме приложения правой кнопкой мыши.
Слайд 6

Разработка функционального интерфейса приложения Графический интерфейс пользователя любой серьезной программы должен

Разработка функционального интерфейса приложения

Графический интерфейс пользователя любой серьезной программы должен включать

в себя:
10. Возможность настройки приложения и запоминания настроек, чтобы при очередном сеансе работы восстанавливались настройки, установленные в прошлом сеансе.
11. Средства установки приложения, регистрации его в Windows и удаления из Windows (это нужно для приложений, которые содержат не один, а несколько файлов; для простых программ установка, регистрация и удаление не требуют специальных средств). 
Слайд 7

Разработка функционального интерфейса приложения Элементы управления ToolStrip, MenuStrip и StatusStrip позволяют

Разработка функционального интерфейса приложения

Элементы управления ToolStrip, MenuStrip и StatusStrip позволяют достаточно

легко создавать меню и панели инструментов.
Элемент MenuStrip ведет свое происхождение непосредственно от элемента управления ToolStrip. Это означает, что MenuStrip может выполнять все, что может ToolStrip.
Кроме MenuStrip еще несколько элементов управления присутствуют в меню. Три из них — ToolStripMenuItem, ToolStripDropDown и ToolStripSeparator — используются наиболее часто.
Слайд 8

Разработка функционального интерфейса приложения ToolStripMenuItem представляет одиночную запись в меню, ToolStripDropDown

Разработка функционального интерфейса приложения

ToolStripMenuItem представляет одиночную запись в меню, ToolStripDropDown —

элемент, который при щелчке на нем отображает список других элементов, a ToolStripSeparator — горизонтальную или вертикальную разделительную линию в меню или панели инструментов.
Еще один вид меню ContextMenuStrip — представляет контекстное меню, открываемое при щелчке на элементе правой кнопкой мыши и, как правило, отображающее информацию, связанную с этим элементом.
Слайд 9

Разработка функционального интерфейса приложения Для создания меню следует перетащить экземпляр элемента

Разработка функционального интерфейса приложения

Для создания меню следует перетащить экземпляр элемента управления

MenuStrip из панели инструментов на поверхность проектирования и щелкнуть на треугольнике у правого края MenuStrip в верхней части диалогового окна, чтобы открыть окно действий.
Далее нужно щелкнуть на маленьком треугольнике в верхнем правом углу меню, а затем на ссылке Insert Standard Items (Вставить стандартные элементы).
Слайд 10

Разработка функционального интерфейса приложения При перетаскивании элемента управления MenuStrip из панели

Разработка функционального интерфейса приложения

При перетаскивании элемента управления MenuStrip из панели инструментов

на поверхность проектирования он помещается как в саму форму, так и в лоток управления. Но инструмент управления можно редактировать непосредственно на форме. Чтобы создать новые элементы меню, достаточно поместить указатель в поле, помеченное надписью Туре Неге (Введите текст здесь).
Слайд 11

Разработка функционального интерфейса приложения При вводе заголовка меню в выделенном поле

Разработка функционального интерфейса приложения

При вводе заголовка меню в выделенном поле перед

буквой, которая должна служить клавишей быстрого доступа к данному элементу меню — этот символ будет отображаться подчеркнутым, а для выбора пункта нужно будет нажать сочетание и клавиши указанного символа — можно вставить знак амперсанда (&).
Слайд 12

Разработка функционального интерфейса приложения В одном меню можно создать несколько элементов

Разработка функционального интерфейса приложения

В одном меню можно создать несколько элементов меню

с одним и тем символом быстрого доступа. Данный символ может использоваться для этой цели только единожды в каждом раскрывающемся меню (например, один раз в меню File, один раз в меню View и т.д.). Если один и тот же символ быстрого доступа случайно присвоить нескольким элементам одного и того же раскрывающегося меню, только ближайший к верхней части элемента управления элемент меню будет реагировать на нажатие данного символа.
Слайд 13

Разработка функционального интерфейса приложения При выборе элемента меню элемент управления автоматически

Разработка функционального интерфейса приложения

При выборе элемента меню элемент управления автоматически отображает

соответствующие элементы ниже и справа от текущего элемента. Ввод заголовка в любом из этих элементов ведет к созданию нового элемента, связанного с начальным. Именно так создаются раскрывающиеся меню.
Слайд 14

Разработка функционального интерфейса приложения Для создания горизонтальных линий, которые делят меню

Разработка функционального интерфейса приложения

Для создания горизонтальных линий, которые делят меню на

группы, вместо ToolStripMenuItem необходимо использовать элемент управления ToolStripSeparator, но в действительности другой элемент управления вставлять не нужно. Вместо этого достаточно ввести символ - в качестве единственного символа заголовка элемента меню и Visual Studio автоматически интерпретирует его как разделитель и изменит тип элемента управления.
Слайд 15

Разработка функционального интерфейса приложения Свойства класса ToolStripMenuItem: Checked Указывает, выбрано ли

Разработка функционального интерфейса приложения

Свойства класса ToolStripMenuItem:  
Checked Указывает, выбрано ли меню


CheckOnClick Когда значение этого свойства — true, метка флажка либо добавляется, либо удаляется из позиции, расположенной слева от текста в элементе, которую в противном случае занимает изображение. Для определения состояния элемента меню следует использовать свойство checked
Enabled Элемент, значение свойства Enabled которого установлено равным false, будет затемнен и не может быть выбран
DropDownitems Возвращает коллекцию элементов, используемую в качестве раскрывающегося меню, связанного с данным элементом меню
Слайд 16

Разработка функционального интерфейса приложения События элемента управления ToolStripMenuItems: Click Отправляется каждый

Разработка функционального интерфейса приложения
События элемента управления ToolStripMenuItems:
 Click Отправляется каждый раз,

когда пользователь щелкает на элементе. В большинстве случаев это событие, на которое требуется реакция
checkedchanged Отправляется при щелчке на элементе, обладающем свойством CheckOnClick
Слайд 17

Разработка функционального интерфейса приложения Двойной щелчок на элементе ToolStripMenuItem в представлении

Разработка функционального интерфейса приложения

Двойной щелчок на элементе ToolStripMenuItem в представлении конструктора

ведет к добавлению события Click:
private void MenuItem1_Click(object sender, EventArgs e) {
richTextBoxText.Text = "";
}
Слайд 18

Разработка функционального интерфейса приложения Для создания панели инструментов служит элемент управления

Разработка функционального интерфейса приложения

Для создания панели инструментов служит элемент управления ToolStrip.


Два отличия от элемента управления MenuStrip:
- в крайней левой позиции элемента управления расположены четыре вертикальные точки, с помощью которых панель инструментов можно перемещать по окну родительского приложения и пристыковывать к его краям;
- по умолчанию панель инструментов отображает пиктограммы, а не текст, поэтому по умолчанию все ее элементы являются кнопками.
Панель инструментов отображает раскрывающиеся меню, которое позволяет выбирать тип элемента.
Слайд 19

Разработка функционального интерфейса приложения Для ToolStrip (как и для MenuStrip) окно

Разработка функционального интерфейса приложения

Для ToolStrip (как и для MenuStrip) окно Actions

содержит ссылку Insert Standard Items (Вставить стандартные элементы), однако щелчок на ней позволяет вставить не совсем те же элементы, которые можно было вставить с помощью MenuStrip, здесь доступны кнопки New (Создать), Open (Открыть), Save (Сохранить), Print (Печать), Cut (Вырезать), Сору (Копировать), Paste (Вставить) и Help (Справка).
Слайд 20

Разработка функционального интерфейса приложения Свойства элемента управления ToolStrip: GripStyle Управляет тем,

Разработка функционального интерфейса приложения

Свойства элемента управления ToolStrip:
GripStyle Управляет тем, должны ли

четыре вертикальные точки отображаться в крайней левой позиции панели инструментов. Сокрытие этой рукоятки-манипулятора ведет к тому, что пользователи утрачивают возможность перемещения панели инструментов
LayoutStyle Управляет способом отображения элементов в панели инструментов. По умолчанию они отображаются горизонтально
Слайд 21

Разработка функционального интерфейса приложения Свойства элемента управления ToolStrip: Items Содержит коллекцию

Разработка функционального интерфейса приложения

Свойства элемента управления ToolStrip:
Items Содержит коллекцию всех элементов

панели инструментов
ShowItemToolTip Определяет, нужно ли отображать подсказки для элементов панели инструментов
Stretch По умолчанию панель инструментов лишь немного шире или выше содержащихся в ней элементов. Если значение свойства stretch установлено равным true, панель инструментов будет заполнять всю длину своего контейнера
Слайд 22

Разработка функционального интерфейса приложения Элементы управления ToolStrip: ToolStripButton Представляет кнопку. Это

Разработка функционального интерфейса приложения

Элементы управления ToolStrip:
ToolStripButton Представляет кнопку. Это свойство

можно использовать для кнопок с текстом или без него
ToolStripLabel Представляет надпись. Этот элемент управления может также отображать изображения — т.е. его можно использовать для отображения статического изображения перед другим, не отображающим информацию о себе, элементом управления, таким как текстовое поле или поле со списком
Слайд 23

Разработка функционального интерфейса приложения Элементы управления ToolStrip: ToolStripSplitButton Отображает кнопку с

Разработка функционального интерфейса приложения

Элементы управления ToolStrip:
ToolStripSplitButton Отображает кнопку с расположенной

слева от нее кнопкой развертывания, щелчок на которой вызывает отображение меню под ней. Меню не разворачивается при щелчке на кнопочной части элемента управления
ToolStripDropDownButton Аналогичен элементу управления ToolStripSplitButton. Единственное различие в том, что кнопка развертывания заменена изображением развернутого массива. Меню разворачивается при щелчке на любой части элемента управления
Слайд 24

Разработка функционального интерфейса приложения Элементы управления ToolStrip: ToolStripComboBox Отображает поле со

Разработка функционального интерфейса приложения

Элементы управления ToolStrip:
ToolStripComboBox Отображает поле со списком
ToolStripProgressBar

Вставляет индикатор протеканий процесса в панель инструментов
ToolStripTextBox Отображает текстовое поле
ToolStripSeparator Создает горизонтальные или вертикальные разделители элементов.
Слайд 25

Разработка функционального интерфейса приложения Элемент управления StatusStrip представляет строку, отображаемую в

Разработка функционального интерфейса приложения

Элемент управления StatusStrip представляет строку, отображаемую в нижней

части диалоговых окон многих приложений. Как правило, эта строка служит для отображения краткой информации о текущем состоянии приложения. Наглядным примером может быть отображение в строке состояния приложения Word текущей страницы, столбца, строки и т.п. во время ввода текста.
Слайд 26

Разработка функционального интерфейса приложения Элемент управления StatusStrip является производным от ToolStrip.

Разработка функционального интерфейса приложения

Элемент управления StatusStrip является производным от ToolStrip.
В

элементе управления StatusStrip могут быть использованы элементы управления ToolStripDropDownButton, ToolStripProgressBar, ToolStripSplitButton и StatusStripStatusLabel.
Слайд 27

Разработка функционального интерфейса приложения StatusStripStatusLabel используется для предоставления пользователю краткой информации

Разработка функционального интерфейса приложения

StatusStripStatusLabel используется для предоставления пользователю краткой информации о

текущем состоянии приложения в виде текста и изображений.
Свойства класса StatusStripStatusLabel:
AutoSize Свойство AutoSize включено по умолчанию, что в действительности не слишком естественно, поскольку нежелательно, чтобы надписи в строке состояния перемещались по ней только из-за изменения текста в одной из них. Если только информация, отображаемая в надписи, не является статичной, значение этого свойства всегда следует изменять на false
DoubleClickEnable Это свойство указывает, будет ли генерироваться событие DoubleClick, что означает предоставление пользователям еще одного места для изменения чего-либо в приложении
Слайд 28

Пример 1 Поместив компонент StatusStrip на форму, следует щелкнуть на кнопке

Пример 1

Поместив компонент StatusStrip на форму, следует щелкнуть на кнопке с

символом многоточия (...) рядом со свойством Items элемента управления StatusStrip на панели Properties. В результате откроется редактор Items Collection Editor (Редактор коллекции элементов). Щелчок на кнопке Add (Добавить) добавляет панель в элемент управления StatusStrip.
В обработчик события любого элемента управления, например, в обработчик события TextChanged элемента richTextBox1, можно добавить код:
private void richTextBox1_TextChanged(object sender, EventArgs e) {
toolStripStatusLabel1.Text = "Количество символов: " + richTextBox1.Text.Length;
}
Слайд 29

Приложения SDI и MDI Традиционно для Windows можно программировать три вида

Приложения SDI и MDI

Традиционно для Windows можно программировать три вида

приложений.
□ Приложения на основе диалоговых окон. Эти приложения открываются для пользователя в виде одного диалогового окна, предоставляющего доступ ко всем своим функциональным возможностям (калькулятор Windows).
□ Однодокументные интерфейсы (Single-document interfaces — SDI). Эти приложения представляются пользователю в виде одного окна с меню и одной или несколькими панелями инструментов; в этом окне пользователь может выполнять ту или иную задачу (WordPad и Paint).
□ Многодокументные интерфейсы (Multiple-document interfaces — MDI). Эти приложения представляются пользователю так же, как SDI-приложения, но могут одновременно содержать несколько открытых окон (Adobe Reader).
Слайд 30

Приложения SDI и MDI Добавить еще одну форму в проект можно

Приложения SDI и MDI

Добавить еще одну форму в проект можно

различными способами, например, можно нажать на имя проекта в окне Solution Explorer (Обозреватель решений) правой кнопкой мыши и выбрать Add (Добавить)-> Windows Form.
!!! При работе с несколькими формами надо учитывать, что одна из них является главной - которая запускается первой в файле Program.cs. При закрытии главной закрывается все приложение и вместе с ним все остальные формы.
Слайд 31

Пример 2 В обработчиках событий кнопок (или пунктов меню), размещенных на

Пример 2

В обработчиках событий кнопок (или пунктов меню), размещенных на формах

можно организовать переход от одной формы к другой:
// с помощью кнопки на главной форме вызвать вторую форму
Form ifrm = new Form2();
this.Hide(); // скрыть Form1 (this - текущая форма)
ifrm.ShowDialog(); // отобразить Form2
// или методом ifrm.Show();
// с помощью кнопки на дочерней форме вызвать главную форму,
// которая открыла текущую, главная форма всегда имеет индекс 0
Form ifrm1 = Application.OpenForms[0];
// или Form ifrm1 = new Form1();
ifrm1.Show(); // отобразить Form1
this.Close();
Слайд 32

Пример 3 MDI-приложение состоит, по меньшей мере, из двух различных окон.

Пример 3

MDI-приложение состоит, по меньшей мере, из двух различных окон. Первое

окно (главное) называется контейнером MDI. Окно, которое может отображаться внутри этого контейнера, называется дочерним MDI.
Пусть Windows-приложение имеет название MDIBas.
Чтобы изменить тип главного окна приложения Form1 с формы на контейнер MDI, следует установить значение свойства IsMdiContainer формы равным true.
Цвет фона формы изменится, указывая, что теперь она представляет собой всего лишь фон, на который не следует помещать видимые элементы управления (хотя эти и возможно и даже целесообразно в некоторых ситуациях).
Слайд 33

Пример 3 Следует добавить вторую форму Form2. Новая форма становится дочерним

Пример 3

Следует добавить вторую форму Form2. Новая форма становится дочерним окном

при установке ссылки на главное окно в качестве свойства MdiParent дочернего окна. Это свойство нельзя установить посредством панели Properties. Для этого нужно использовать код, например, изменив конструктор новой дочерней формы следующим образом:
public Form2 (MdiBas.Form1 parent) {
InitializeComponent();
// установка контейнера в качестве
// родительского элемента управления формы
this.MdiParent = parent;
}
Слайд 34

Пример 3 Далее необходимо указать контейнеру MDI, какие окна следует отображать,

Пример 3

Далее необходимо указать контейнеру MDI, какие окна следует отображать, а

затем обеспечить их отображение. Для этого следует создать новый экземпляр формы, которую нужно отобразить, а затем вызвать для нее метод Show(). Конструктор родительской формы MDI может содержать код:
public Form1 () {
InitializeComponent();
// создание нового экземпляра дочерней формы
MdiBas.Form2 child = new MdiBas.Form2 (this);
child.Show(); // отображение формы

Слайд 35

Обычные диалоговые окна Диалог — это окно, которое отображается в контексте

Обычные диалоговые окна

Диалог — это окно, которое отображается в контексте другого

окна. Диалоговое окно позволяет потребовать от пользователя ввод определенных данных до продолжения выполнения программы.
Каркас .NET Framework содержит классы, которые подключают диалоговые окна Windows для открытия и создания каталогов, открытия и сохранения файлов, обращения к принтерам и выбора цветов и шрифтов, и т. д.
Слайд 36

Обычные диалоговые окна □ OpenFileDialog — позволяет пользователям открывать файл. □

Обычные диалоговые окна

□ OpenFileDialog — позволяет пользователям открывать файл.
□ FileSaveDialog

— служит для запроса имени файла для сохранения данных.
□ PrintDialog — служит для определения конфигураций принтера и параметров печати.
□ PageSetupDialog — служит для изменения полей печатной страницы.
□ PrintPreviewDialog — служит для просмотра печатной страницы, что позволяет пользователям заранее видеть, как она будет выглядеть.
□ FontDialog — выводит список всех установленных шрифтов Windows с информацией о стилях и размерах и предоставляет возможность просмотра для выбора нужного шрифта.
□ ColorDialog — облегчает выбор цвета.
□ FolderBrowserDialog — служит для выбора и создания каталогов.
Слайд 37

Обычные диалоговые окна Все эти классы диалоговых окон, за исключением PrintPreviewDialog,

Обычные диалоговые окна

Все эти классы диалоговых окон, за исключением PrintPreviewDialog, являются

производными от абстрактного базового класса CommonDialog, который содержит методы для управления обычными диалоговыми окнами Windows.
Метод ShowDialog() вызывает защищенный метод экземпляра RunDialog() для отображения диалогового окна, возвращая экземпляр DialogResult, который содержит информацию о взаимодействии пользователя с диалоговым окном.
И напротив, метод Reset() устанавливает первоначальные, заданные по умолчанию значения свойств класса диалогового окна.
Слайд 38

Пример 4 OpenFileDialog dig = new OpenFileDialog(); // 1 dig.Title =

Пример 4

OpenFileDialog dig = new OpenFileDialog(); // 1
dig.Title = "Sample"; //

2
dig.ShowReadOnly = true; // 2
if (dig.ShowDialog () == DialogResult.OK) { // 3
string fileName = dig.FileName; // 4
}
1. Создание нового экземпляра класса диалогового окна.
2. Установка ряда свойств: значение свойства Title равным "Sample", а свойства ShowReadOnly— равным true.
Слайд 39

Пример 4 3. Вызов метода ShowDialog() ведет к отображению диалогового окна,

Пример 4

3. Вызов метода ShowDialog() ведет к отображению диалогового окна, ожиданию

ввода пользователя и реагированию на него. Если пользователь нажимает кнопку ОК, диалоговое окно закрывается и происходит проверка этого путем сравнивания результата диалогового окна со значением DialogResult.ОК.
4. Затем можно извлечь значения из ввода пользователя, запрашивая значения конкретных свойств. В данном случае значение свойства FileName хранится в переменной fileName.
Слайд 40

Обычные диалоговые окна Диалоговое окно OpenFileDialog служит для предоставления пользователям возможности

Обычные диалоговые окна

Диалоговое окно OpenFileDialog служит для предоставления пользователям возможности просмотра

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

Обычные диалоговые окна Фильтр используется для отображения записей в списке Files

Обычные диалоговые окна

Фильтр используется для отображения записей в списке Files of

Type: (Файлы типа:).
Фильтр состоит из нескольких сегментов, разделенных символом конвейера (|). Каждая запись состоит из двух строк, поэтому количество сегментов всегда является четным. Первая строка в каждой записи определяет текст, отображаемый в поле списка. Вторая строка указывает расширение файлов, которые будут отображаться в диалоговом окне. Строку фильтра можно определить в свойстве Filter:
dig.Filter = "Text documents (*.txt)|*.txt|All Files|*.*";
Наличие пробела перед или после фильтра не допускается.
Свойство FilterIndex указывает номер записи, выбираемой в списке по умолчанию (значения начинаются с единицы).
Слайд 42

Обычные диалоговые окна Класс SaveFileDialog предоставляет пользователю диаоговые окна, в которых

Обычные диалоговые окна

Класс SaveFileDialog предоставляет пользователю диаоговые окна, в которых пользователи

могут указывать имя файла и отыскивать каталог для сохранения файлов. Этот класс во многом подобен классу OpenFileDialog, и они имеют ряд общих свойств.
Свойство Title позволяет устанавливать заголовок диалогового окна, подобно тому, как это имеет место в классе OpenFileDialog. Если никакое значение этого свойства не установлено, заголовок, используемый по молчанию — Save As (Сохранить как).
Рекомендуется всегда добавлять расширение к файлу — в противном случае Windows не будет знать, какое приложение следует использовать для открытия файла, а со временем эта информация, скорее всего, забудется.
Слайд 43

Обычные диалоговые окна AddExtension — булевское свойство, которое автоматически добавляет расширение

Обычные диалоговые окна

AddExtension — булевское свойство, которое автоматически добавляет расширение к

имени файла, введенному пользователем. Значение этого свойства, используемое по умолчанию — true.
Свойство DefaultExt определяет расширение файла, которое используется, если пользователь его не вводит. Если оставить значение этого свойства пустым, будет применяться расширение файла, определенное выбранным в данный момент свойством Filter. Если оба свойства Filter и DefaultExt установлены, DefaultExt используется независимо от выбранного значения Filter.
Слайд 44

Обычные диалоговые окна Функциональные возможности классов: □ В основе печати лежит

Обычные диалоговые окна

Функциональные возможности классов:
□ В основе печати лежит класс PrintDocument,

имеющий метод Print(), который начинает последовательность вызовов, завершающуюся вызовом метода OnPrintPage(), который отвечает за передачу выходных данных принтеру.
□ Класс PrintController управляет потоком задачи печати. Контроллер печати содержит события для запуска печати, для обработки каждой страницы и для завершения печати. Этот класс является абстрактным, поскольку реализация обычной печати отличается от реализации предварительного просмотра печатного документа. Конкретные классы, производные от PrintController — StandardPrintController и PreviewPrintController.
Слайд 45

Обычные диалоговые окна Функциональные возможности классов: □ Класс PrinterSettings может получать

Обычные диалоговые окна

Функциональные возможности классов:
□ Класс PrinterSettings может получать и устанавливать

такие параметры конфигурации принтера, как двусторонняя печать, альбомная или книжная ориентация и количество копий.
□ Класс PrintDialog содержит параметры выбора принтера для печати и способа конфигурирования PrinterSettings. Этот класс, подобно другим классам диалоговых окон, является производным от CommonDialog.
□ Класс PageSettings определяется размеры и поля страницы печати и то, является ли она черно-белой или цветной. Конфигурирование этого класса можно выполнять посредством класса PageSetupDialog, производным от CommonDialog.
Слайд 46

Обычные диалоговые окна Последовательность печати: Приложение должно вызвать метод Print() класса

Обычные диалоговые окна

Последовательность печати: Приложение должно вызвать метод Print() класса PrintDocument,

который запускает последовательность печати. PrintController предпринимает необходимое действие и информирует PrintDocument о начале печати, вызывая метод OnBeginPrint(). После завершения начального этапа PrintController выполняет вход в метод PrintLoop(), вызывая метод OnPrintPage() в классе PrintDocument для каждой печатаемой страницы. OnPrintPage() вызывает все обработчики события PrintPage, которые содержат код печати.
После того, как последняя страница напечатана, PrintController вызывает метод OnEndPrint() в классе PrintDocument.
Слайд 47

Пример 5 namespace WindowsFormsApp36 { public partial class Form1 : Form

Пример 5

namespace WindowsFormsApp36
{
public partial class Form1 : Form
{

string fileName = "";
private string[] lines; // печатаемый текст
private int linesPrinted = 0; // количество
// печатаемых строк
public Form1() {
InitializeComponent();
}
Слайд 48

Пример 5 private void button2_Click(object sender, EventArgs e) { // Сохранить

Пример 5

private void button2_Click(object sender, EventArgs e)
{ // Сохранить


SaveFileDialog sdlg= new SaveFileDialog();
sdlg.Filter = "Текстовые документы (*.rtf)|*.rtf|Все файлы|*.*";
// путь к папке сисполняемым файлом
// "C:..\WindowsFormsApp36\bin\debug"
string dirrr = Directory.GetCurrentDirectory();
int x = dirrr.LastIndexOf("\\"); // найти индекс
// последнего в строке символа \
int y = dirrr.Length; // найти длину строки
dirrr = dirrr.Remove(x,y-x); // удалить последний каталог
x = dirrr.LastIndexOf("\\");
y = dirrr.Length;
Слайд 49

Пример 5 dirrr = dirrr.Remove(x, y - x); // удалить следующий

Пример 5

dirrr = dirrr.Remove(x, y - x); // удалить следующий


// последний каталог теперь в переменной dirrr лежит
// путь к каталогу "C:..\WindowsFormsApp36"
dig.InitialDirectory = dirrr + "\\Одежда\\Женская";
if (sdlg.ShowDialog() == DialogResult.OK) {
fileName = sdlg.FileName;
try {
File.WriteAllText(fileName, richTextBox1.Text);
} catch (IOException ex) {
MessageBox.Show(ex.Message, "Simple Editor", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
}
Слайд 50

Пример 5 private void button7_Click(object sender, EventArgs e) { // параметры

Пример 5

private void button7_Click(object sender, EventArgs e) { // параметры

страницы
try {
printDocument1.Print();
} catch (Exception ex) {
MessageBox.Show(ex.Message, "Simple Editor", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
pageSetupDialog1.ShowDialog();
}
Слайд 51

Пример 5 private void printDocument1_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e) { // устанавливаются

Пример 5

private void printDocument1_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e) {
//

устанавливаются все строки, которые будут напечатаны
char[] param = {'\n'};
if (printDialog1.PrinterSettings.PrintRange == System.Drawing.Printing.PrintRange.Selection) {
lines = richTextBox1.SelectedText.Split(param);
} else { lines = richTextBox1.Text.Split(param); }
int i = 0;
char[] trimParam = {'\r'};
foreach (string s in lines)
lines[i++] = s.TrimEnd(trimParam);
}
Слайд 52

Пример 5 private void printDocument1_EndPrint(object sender, System.Drawing.Printing.PrintEventArgs e) { lines =

Пример 5

private void printDocument1_EndPrint(object sender, System.Drawing.Printing.PrintEventArgs e) {
lines

= null;
}
private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
// используется шрифт Arial размером в 10 пунктов и черная
// кисть, позиция вывода определяется переменными х и у
int x = e.MarginBounds.Left;
int y = e.MarginBounds.Top;
Слайд 53

Пример 5 while (linesPrinted // каждая строка возвращается на принтер e.Graphics.DrawString(lines[linesPrinted++],

Пример 5

while (linesPrinted < lines.Length) {
// каждая строка

возвращается на принтер
e.Graphics.DrawString(lines[linesPrinted++], new Font("Arial", 10), Brushes.Black, x, y);
y +=15;
if (y >= e.MarginBounds.Bottom) {
e.HasMorePages = true; // метод PrintPage()
// должен быть вызван снова для печати другой страницы
return;
}
}
linesPrinted = 0;
e.HasMorePages = false; // печать только одной страницы
}
Слайд 54

Пример 5 private void button8_Click(object sender, EventArgs e){ // печать try

Пример 5

private void button8_Click(object sender, EventArgs e){ // печать
try

{
if (richTextBox1.SelectedText != "")
printDialog1.AllowSelection = true;
if (printDialog1.ShowDialog() == DialogResult.OK)
printDocument1.Print();
} catch (Exception ex) {
MessageBox.Show(ex.Message, "Simple Editor", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
Слайд 55

Обычные диалоговые окна Класс PageSetupDialog позволяет конфигурировать размеры и источники бумаги,

Обычные диалоговые окна

Класс PageSetupDialog позволяет конфигурировать размеры и источники бумаги, ориентацию

и поля печатных страниц. А поскольку эти параметры зависят от используемого принтера, данное диалоговое окно позволяет также выбирать принтер.
После добавления на форму компонента PageSetupDialog в качестве значения его свойства Document следует выбрать имя установленного ранее компонента PrintDocument, чтобы связать диалоговое окно с документом, который нужно напечатать.
Значение true свойства AllowPaper означает, что пользователи могут выбирать размеры и источник бумаги. Свойство PageSetupDialog.PageSettings.PaperSize реализует доступ к свойствам Height, Width и PaperName содержащим информацию соответственно о высоте, ширине и названии формата бумаги.
Слайд 56

Обычные диалоговые окна Свойство PaperName специфицирует такие имена, как Letter или

Обычные диалоговые окна

Свойство PaperName специфицирует такие имена, как Letter или А4.

Свойство Kind возвращает перечисление, из которого можно извлечь значение перечисления PaperKind, которые определяют размеры бумаги, такие как A3, А4, А5, Letter, LetterPlus и LetterRotated.
Значение true свойства AllowMargins позволяет пользователям устанавливать значение полей печатной страницы. Информация о полях хранится в свойстве PageSetupDialog.PageSettings.Margins. Возвращенный объект Margins (Поля) содержит свойства Bottom (Нижнее), Left (Левое), Right (Правое) и Тор (Верхнее).
Свойство AllowOrientation определяет выбор пользователя между печатью в книжной и альбомной ориентации. Выбранное значение можно выяснить с помощью значения свойства PageSetupDialog.PageSettings.Landscape:
true — альбомный режим, false — книжный.
Слайд 57

Пример 6 Класс PrintDialog позволяет пользователям выбирать принтер из числа установленных,

Пример 6

Класс PrintDialog позволяет пользователям выбирать принтер из числа установленных, количество

копий и некоторые параметры принтера вроде ориентации и источника бумаги.  
try { // печатать выбранный текст
if (textBox1.SelectedText != "") {
printDialog1.AllowSelection = true;
}
if (printDialog1.ShowDialog() == DialogResult.OK) {
printDocument1.Print ();
}
} catch (InvalidPrinterException ex) {
MessageBox.Show(ex.Message, "Simple Editor",
MessageboButtons.OK, MessageBoxIcon.Error);
}
Слайд 58

Обычные диалоговые окна Диалоговое окно FontDialog позволяет пользователям выбирать шрифт, включая

Обычные диалоговые окна

Диалоговое окно FontDialog позволяет пользователям выбирать шрифт, включая его

стиль, размер и цвет.
Код, использующий класс FontDialog, подобен следующему:
if (fontDialog1.ShowDialog() == DialogResult.OK)
{
textBox1.Font = fontDialog1.Font;
}
Слайд 59

Обычные диалоговые окна Класс ColorDialog позволяет конфигурировать дополнительные цвета, если ни

Обычные диалоговые окна

Класс ColorDialog позволяет конфигурировать дополнительные цвета, если ни один

из основных цветов не подходит. Для этого используют свойство AllowFullOpen.
Прочитать выбранный цвет можно с помощью свойства Color объекта диалогового окна при помощи обработчика события любого управляющего компонента:
if (colorDialog1.ShowDialog() == DialogResult.OK)
{
textBox1.ForeColor = colorDialog1.Color;
}
Слайд 60

Обычные диалоговые окна FolderBrowserDialog — простое диалоговое окно, предназначенное для получения

Обычные диалоговые окна

FolderBrowserDialog — простое диалоговое окно, предназначенное для получения имен

каталогов от пользователя или создания каталогов.
Свойство Description (Описание) можно использовать для определения текста, который будет отображаться над древовидным представлением.
Свойство RootFolder определяет папку, с которой должен начинаться поиск папок пользователем. Это свойство позволяет устанавливать значение из перечисления Environment.SpecialFolder.
Свойство ShowNewFolderButton определяет, разрешено ли пользователю создавать новую папку посредством диалогового окна.
Слайд 61

Пример 7 Метод ShowDialog() отображает диалоговое окно до тех пор, пока

Пример 7

Метод ShowDialog() отображает диалоговое окно до тех пор, пока пользователь

не нажмет кнопку ОК или Cancel. Считывание выбранного пользователем пути можно выполнять, обращаясь к свойству SelectedPath:
dlgFolderBrowser.Description = "Выберите папку";
if (dlgFolderBrowser.ShowDialog() == DialogResult.OK) {
MessageBox.Show("Папка " + dlgFolderBrowser.SelectedPath + " выбрана");
}
Слайд 62

Формы в Visual Studio C#

Формы в Visual Studio C#

Слайд 63

После добавления в проект второй форма следует осуществить взаимодействие между двумя

После добавления в проект второй форма следует осуществить взаимодействие между двумя

формами. Пусть, первая форма по нажатию на кнопку будет вызывать вторую форму. Сначала следует добавить на первую форму Form1 кнопку и в обработчике события нажатия кнопки добавить код вызова второй формы.

Формы

Слайд 64

Сначала создается объект класса Form2 (вторая форма), а потом для его

Сначала создается объект класса Form2 (вторая форма), а потом для его

отображения на экране вызывается метод Show:
private void button1_Click(object sender, EventArgs e){
    Form2 newForm = new Form2();
    newForm.Show();
}

Пример 1

Слайд 65

Теперь следует организовать связь наоборот - чтобы вторая форма воздействовала на

Теперь следует организовать связь наоборот - чтобы вторая форма воздействовала на

первую. Пока вторая форма не знает о существовании первой. Чтобы это исправить, надо второй форме как-то передать сведения о первой форме. Для этого можно воспользоваться передачей ссылки на форму в конструкторе.
Поскольку C# поддерживает перегрузку методов, то можно создать несколько методов и конструкторов с разными параметрами и в зависимости от ситуации вызывать один из них.

Формы

Слайд 66

using System; … using System.Windows.Forms; namespace HelloApp{ public partial class Form2

using System;

using System.Windows.Forms; 
namespace HelloApp{
    public partial class Form2 : Form{
        public Form2(){
            InitializeComponent();
        } 
        public Form2(Form1

f){
            InitializeComponent();
            f.BackColor = Color.Yellow;
        }
    }
}

Пример 1

Слайд 67

Теперь следует перейти к коду первой формы, где была вызвана вторая

Теперь следует перейти к коду первой формы, где была вызвана вторая

форма и изменить его на следующий:
private void button1_Click(object sender, EventArgs e){
    Form2 newForm = new Form2(this);
    newForm.Show();
}

Пример 1

Слайд 68

Можно также создавать объекты и текущей формы: private void button1_Click(object sender,

Можно также создавать объекты и текущей формы:
private void button1_Click(object sender, EventArgs

e){
    Form1 newForm1 = new Form1();
    newForm1.Show();         
    Form2 newForm2 = new Form2(newForm1);
    newForm2.Show();
}

Пример 1

Слайд 69

При работе с несколькими формами надо учитывать, что одна из них

При работе с несколькими формами надо учитывать, что одна из них

является главной - которая запускается первой в файле Program.cs.
Если одновременно открыта куча форм, то при закрытии главной закрывается все приложение и вместе с ним все остальные формы.

Формы

Слайд 70

Обмен данными между формами сводится к трем основным принципам: передача параметров

Обмен данными между формами сводится к трем основным принципам: передача параметров

в форму, получение данных из формы, изменение значений другой формы. 
1-й способ: Найти на 2 - й форме в файле "Form2.Designer.cs" запись:
private System.Windows.Forms.TextBox textBox1; и заменить слово private на public
И тогда из первой формы, можно обратиться следующим образом:
Form2 f = new Form2();
f.textBox1.Text = "Привет";
f.ShowDialog();

Формы

Слайд 71

2-й способ. Использование свойства 'родитель'. При создании второй формы установить владельца.

2-й способ. Использование свойства 'родитель'. При создании второй формы установить владельца.
Form2

f = new Form2();
f.Owner = this;
f.ShowDialog();  
Найти на 1 - й форме в файле "Form1.Designer.cs" запись:
private System.Windows.Forms.TextBox textBox1;
и заменить слово private на public

Формы

Слайд 72

2-й способ. Во второй форме определить владельца, например, в обработчике события

2-й способ.
Во второй форме определить владельца, например, в обработчике события

кнопки.
Form1 main = this.Owner as Form1;
// Form1 main = (Form1)this.Owner;
if (main != null){
string s = main.textBox1.Text;
main.textBox1.Text = "OK";
}

Формы

Слайд 73

3-й способ. Создать в классе формы 2 указатель на "родительскую" форму

3-й способ. Создать в классе формы 2 указатель на "родительскую" форму

и получить через указатель доступ ко всем элементам первой формы из формы 2.
Любой класс, должен иметь конструктор, и следовательно очевидным является тот факт, что передача данных необходимых для инициализации формы необходимо проводить именно через конструктор формы.
Важно: Все действия, выполняемые с объектами формы должны быть произведены после функции InitializeComponent()!

Формы

Слайд 74

3-й способ. public partial class Form2 : Form { private Form1

3-й способ.
public partial class Form2 : Form {
private

Form1 parentForm;
public Form2(Form1 link)
{
InitializeComponent();
this.parentForm = link;
}
.................
}

Формы

Слайд 75

3-й способ. Найти на 1 - й форме в файле "Form1.Designer.cs"

3-й способ.
Найти на 1 - й форме в файле "Form1.Designer.cs"

запись:
private System.Windows.Forms.TextBox textBox1; и заменить слово private на public
private void button1_Click(object sender, EventArgs e) { // перейти на форму 2
Form2 f = new Form2(this);
f.Show();
}

Формы

Слайд 76

3-й способ. private void button2_Click(object sender, EventArgs e) { // Доступ

3-й способ.
private void button2_Click(object sender, EventArgs e) {
// Доступ

к открытым компонентам
// родительской формы из формы 2
string s = parentForm.textBox1.Text;
parentForm.textBox1.Text = label1.Text;
}

Формы

Слайд 77

4-й способ. Доступ к родительской форме из других форм. Чтобы реализовать

4-й способ. Доступ к родительской форме из других форм.
Чтобы реализовать доступ

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

Формы

Слайд 78

4-й способ. Шаг 1. В файле Program.cs создать публичную переменную f1.

4-й способ. Шаг 1. В файле Program.cs создать публичную переменную f1.
namespace WindowsApplication1{
  static class Program {
    public

static Form1 f1; // ссылка на форму Form1         
    [STAThread]
    static void Main() {
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(new Form1());
    }
  }
}

Формы

Слайд 79

4-й способ. Шаг 2. Открыть Form1.Designer.cs и в нем у элементов,

4-й способ.
Шаг 2. Открыть Form1.Designer.cs и в нем у элементов, к которым нужно

будет обратиться из другой формы, поменять private на public. Например, сделать доступной для изменений кнопку button1 на форме Form1.
public System.Windows.Forms.Button button1; // заменить private на public

Формы

Слайд 80

4-й способ. Шаг 3. При создании формы Form1 присвоить переменной f1

4-й способ. Шаг 3. При создании формы Form1 присвоить переменной f1

ссылку на эту форму
namespace WindowsApplication1{
  public partial class Form1 : Form {
    public Form1()  {        
       InitializeComponent();
     Program.f1 = this; // f1 - ссылка на форму Form1
   }
    private void button1_Click(object sender, EventArgs e) {
       Form2 frm = new Form2();
       frm.ShowDialog(); }
  }
}

Формы

Слайд 81

4-й способ. Шаг 4. Теперь из абсолютно любой формы или из

4-й способ. Шаг 4. Теперь из абсолютно любой формы или из любого

класса можно обратиться к элементу button1 находящемуся на Form1 так: Program.f1.button1. Например, пусть кнопка в Form2 меняет текст кнопки на Form1:
namespace WindowsApplication1{
   public partial class Form2 : Form {
     public Form2()   {  InitializeComponent();  } 
     private void button1_Click(object sender, EventArgs e)  {
           Program.f1.button1.Text = "test";
// Меняет текст на кнопке формы Form1
        }
    }
}

Формы

Слайд 82

!!! Но замена слов private на public не является хорошим тоном

!!! Но замена слов private на public не является хорошим тоном

программирования, так как по принципам ООП поля классов не должны быть доступны для изменения в других классах.

Формы

Слайд 83

5-й способ: В форме 2 создать СВОЙСТВО, которое будет считывать и

5-й способ: В форме 2 создать СВОЙСТВО, которое будет считывать и

записывать текст в закрытое поле textBox1. Свойство может выглядеть так:
public partial class Form2 : Form {
public string textBoxValue{ // Свойство позволяет
// получить доступ к private элементам формы
get { return textBox1.Text; }
set { textBox1.Text = value; }
}
public Form2() { InitializeComponent(); }
}

Формы

Слайд 84

5-й способ: Тогда из первой формы можно обратиться уже так: public

5-й способ: Тогда из первой формы можно обратиться уже так:
public partial

class Form1 : Form {
private Form2 F2 = new Form2();
// Объявить форму 2 как элемент класса формы 1
  public Form1() {
InitializeComponent();
}
private void open_Click(object sender, EventArgs e) {
F2.ShowDialog(); // кнопка откравает Form2
}

Формы

Слайд 85

5-й способ: private void read_Click(object sender, EventArgs e){ MessageBox.Show(F2.textBoxValue); // показывает

5-й способ:
private void read_Click(object sender, EventArgs e){
MessageBox.Show(F2.textBoxValue);

// показывает сообщение с текстом,
// введенным в textBox формы Form2
}
private void write_Click(object sender, EventArgs e){
F2.textBoxValue = String.Empty;
// очищает textBox из Form2
}

Формы

Слайд 86

6-й способ: Передача ссылки на компонент главной формы в дочернюю форму.

6-й способ: Передача ссылки на компонент главной формы в дочернюю форму.
При

открытии формы Form2 передать в нее ссылку на закрытый элемент главной формы, который планируется потом менять (button1).
namespace WindowsApplication1{
  public partial class Form1 : Form  {
    public Form1()  {
        InitializeComponent();
   }

Формы

Слайд 87

6-й способ: private void button1_Click(object sender, EventArgs e) { Form2 frm

6-й способ:  
     private void button1_Click(object sender, EventArgs e)  {
        Form2 frm = new

Form2(this.button1);
// передать ссылку на кнопку в форму Form2
        frm.ShowDialog();
      }
   }
}

Формы

Слайд 88

6-й способ: Теперь в форме Form2 нужно создать переменную, которая будет

6-й способ:  Теперь в форме Form2 нужно создать переменную, которая будет

содержать ссылку на эту кнопку и через нее можно обращаться к кнопке на Form1.
namespace WindowsApplication1{
   public partial class Form2 : Form {
     private Button but1; // ссылка на кнопку
// button1 из формы Form1
     public Form2() // конструктор по умолчанию
    {
InitializeComponent();            
    }

Формы

Слайд 89

6-й способ: public Form2(Button but) { InitializeComponent(); but1 = but; //

6-й способ:  
   public Form2(Button but) {
InitializeComponent();
       but1 = but; //

but1 - ссылка на кнопку button1 
 }
  private void button1_Click(object sender, EventArgs e) {
      but1.Text = "test"; // меняет текст на кнопке
// button1 формы Form1
        }
    }
}

Формы

Слайд 90

7-й способ: Использование делегатов для доступа к закрытым элементам класса. В

7-й способ: Использование делегатов для доступа к закрытым элементам класса.
В

случае когда надо связать не две формы а множество, или сложно проследить родство между формами, проще сделать это более универсальным методом с большими возможностями. 1. Создать в основном namespace (это в файле program.cs) класс:
public static class CallBackMy { public delegate void callbackEvent(string what);
// Объявить тип делегата public static callbackEvent callbackEventHandler;
// Объявить ссылку на делегат
}

Формы

Слайд 91

7-й способ: 2. Далее добавить в конструктор формы приёмника обработчик события

7-й способ:
2. Далее добавить в конструктор формы приёмника обработчик события -

который запустит нужную функцию (их может быть и несколько — что очень удобно):
public FormMy(){
InitializeComponent();
// Добавить обработчик события - который запустит
// функцию Reload, сконструировать делегат
CallBackMy.callbackEventHandler = new CallBackMy.callbackEvent(this.Reload);
}
В форме приёмнике содержится метод:
void Reload(string param){
// код метода, содержащий обращение к элементам формы
}

Формы