Стандартный интерфейс приложений
Выбери формат для чтения
Загружаем конспект в формате doc
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Стандартный интерфейс приложений
Интерфейс – внешняя оболочка приложения, инструмент доступа к функциям приложения.
Назначение:
1) интерфейс скрывает от пользователя механизмы управления;
2) интерфейс дает возможность работы с информацией, хранящейся в компьютере.
Требования: интерфейс приложения должен обеспечить максимальное удобство и эффективность работы пользователя.
Существуют различные виды интерфейсов, также существует перечень стандартных составляющих интерфейса: меню, контекстные меню, панели инструментов, строка состояния и другие. Существуют специальные инструменты для разработки элементов интерфейса в приложениях.
Общие принципы разработки интерфейса
• Стандартизация. Необходимо использовать стандартные, привычные для пользователя интерфейсные решения. Для Visual Studio это стандарт любого из приложений Microsoft. Под решениями подразумеваются дизайн форм, распределение элементов управления в формах, их взаимное расположение, значки на кнопках управления, названия команд меню.
• Удобство и простота работы. Интерфейс должен быть интуитивно понятным. Все действия должны легко запоминаться и не требовать выполнения дополнительных процедур.
• Внешний дизайн. Интерфейс не должен утомлять, так как рассчитан на длительную работу пользователя с приложением.
• Лаконичность форм. Формы не должны быть перегружены элементами управления, при необходимости используются вкладки.
• Группировка. Элементы управления в форме группируются по смыслу с использованием элементов группировки: рамки, фреймы.
• Разреженность объектов форм. Элементы управления следует располагать на некотором расстоянии, для выделения элементов управления организуются пустые пространства в форме.
Типы интерфейсов
Для Windows приложений, разрабатываемых в Visual Studio, используется три типа интерфейса:
• однодокументный SDI (Single Document Interface),
• многодокументный MDI (Multiple Document Interface),
• интерфейс типа проводник (Explorer).
Документ в этом контексте – форма для работы с данными.
Однодокументный тип интерфейса – такой, в котором можно работать только с одним документом в одном окне, например, редактор Microsoft WordPad, блокнот NotePad. Для одновременной работы с несколькими документами необходимо запускать несколько приложений с интерфейсом типа SDI. Приложения такого типа занимают меньше места на диске и в оперативной памяти.
Интерфейс типа MDI дает возможность работать в одном приложении с некоторым количеством открытых окон, например, редактор Microsoft Word. В одном приложении могут быть одновременно открытыми много документов. Одно окно (окно приложения) является главным, его дочерние окна – это документы.
Интерфейс типа Explorer – проводник (браузер), удобен для работы, например, с файловой системой. Одно окно представляет содержимое, другое – оглавление.
SDI-интерфейс
Интерфейс SDI состоит из следующих элементов:
• главное меню;
• панели инструментов с элементами управления (кнопки быстрого доступа к отдельным командам меню);
• окно приложения для размещения элементов управления данными (в текстовом редакторе это окно документа) с заголовком;
• элементы управления для работы с данными;
• строка состояния для вывода сообщений о состоянии приложения;
• контекстные меню объектов;
• окна диалогов;
• справочная система, горячие клавиши, система всплывающих подсказок.
Для MDI интерфейса добавляются дочерние окна (документы).
SDI-интерфейс можно использовать и для создания многоформенных проектов. Тогда одна из форм (главная) осуществляет управление всем проектом в целом. Как правило, содержит меню вызова других форм.
Вызов дочерней формы
При условии, что форма создана и имеет имя, например, Child_form, необходимо выполнить следующие действия.
1. В главной форме сделать доступным описание дочерней формы включением заголовочного файла дочерней формы:
#include Child_form.h
2. Объявить дескриптор формы:
System::Windows::Forms::Form ^Frm;
3. Передать дескриптору Frm адрес дочерней формы:
Frm = gcnew Child_form; // Возможно, с пространством имен.
4. Открыть дочернюю форму в модальном режиме:
Frm->ShowDialog();
Закрытие формы
Чтобы программно закрыть форму, используется метод Close:
this–>Close();
Доступ к объектам в приложении. Область видимости имен.
Создание меню форм
Общие задачи приложения – реализация множества функций, которые может выполнять приложение (полная функциональность приложения). Меню позволяет получить доступ ко всем функциям приложения.
Главный принцип проектирования меню – стандартизация. Образцом может служить каждое приложение Office. Принято придерживаться общепринятых названий команд меню и их расположения: например, пункт меню для работы с файлами рекомендуется называть в своих приложениях File (Файл), а пункт меню для вызова справочной системы приложения – Help (Справка). При этом пункт меню File располагается первым, а пункт Help – последним.
Команды меню объединяются в группы, реализующие функции для решения общей задачи. Команды группы объединяются в одно раскрывающееся меню, которое имеет общее название для группы. Например, все функции для работы с файлами группируются в одно раскрывающееся меню, связанное с пунктом меню File.
Каждой команде меню должна соответствовать «горячая» клавиша (быстрого доступа). Рекомендуется использовать стандартные клавиши.
Существуют главное меню приложения и контекстные меню отдельных объектов приложения (форм, элементов).
1. Главное (статическое) меню принадлежит приложению, используется для доступа ко всем функциям приложения.
2. Контекстное меню принадлежит элементу управления. Контекстное меню, точнее, контекстные меню (их может быть много) используется для быстрого доступа к некоторым функциям, доступным в данный момент для данного объекта.
Инструменты для разработки меню
Для проектирования меню всех видов используется редактор меню Menu Editor. Редактор создает меню для активного в данный момент окна, то есть, если активно MDI-окно, проектируется меню для него, если активна дочерняя форма, проектируется меню для дочерней формы.
Для создания главного меню используется компонент MenuStrip. Он невидим, точнее, в режиме формы и в режиме конструктора виден различным образом.
Важно, чтобы форма знала, что у нее есть меню. Для этого свойство формы MainMenuStrip должно быть равно имени главного меню, например, MenuStrip1.
При добавлении его на форму компонент располагается ниже пространства формы. Редактор меню появляется при активизации компонента MenuStrip.
Элемент меню Вводить здесь предназначен для добавления новых пунктов меню, для которых нужно задать название.
Для быстрого перемещения по пунктам меню используются клавиши Enter, Tab и стрелка вниз (вправо).
На самом деле здесь работает встроенный редактор меню Menu Editor, который ответствен за внешний вид меню и позволяет задать обработчики событий для пунктов меню.
Правая кнопка мыши вызывает контекстное меню пункта меню, которое позволить редактировать меню путем добавления, удаления пунктов. Здесь же можно задать некоторые свойства пункта меню и перейти к обработчику события по пункту Просмотреть код.
Для полного редактирования меню, особенно если оно уже создано, и появилась необходимость его редактировать, лучше всего использовать свойство Items (коллекция) основного меню. Диалог Редактор коллекции элементов (редактор пунктов меню) открывается как редактор свойства.
В списке Выбрать элемент и добавить в список ниже можно выбрать один из типов пункта меню – команда MenuItem, вызов диалога ComboBox, текстовое поле TextBox. В выпадающих меню доступен тип пункта Separatop – горизонтальная линия, отделяющая друг от друга логические группы команд меню.
Справа в окне свойств ToolStripMenuItem отображаются свойства выделенного элемента.
Общие свойства меню
Меню, как элемент управления, имеет свойства. Они доступны для редактирования в окне Свойства формы, которой принадлежит меню.
Name – имя (идентификатор) меню. По умолчанию имеет имя MenuStrip1. Доступны пункты меню Items.
Доступны также свойства каждого отдельного пункта меню, и свойства его выпадающих пунктов – коллекция DropDownItems.
Некоторые свойства пунктов меню
Итак, один пункт меню (Item) имеет основные свойства.
Name – имя пункта меню. Рекомендуется задавать имя, соответственно смыслу команды, и начинающееся префиксом mnu. По умолчанию пунктам меню присваиваются имена, составленные из текста надписи, к которому добавлен суффикс ToolStripMenuItem, например, файлToolStripMenuItem или в коллекции выпадающих пунктов меню DropDownItems –создатьToolStripMenuItem.
Image – рисунок (пиктограмма), которую можно показать слева от названия пункта меню.
Text – текст, отображаемый в данном пункте меню. Если перед одной из букв поместить символ &, то в пункте меню она будет подчеркнута, и ей можно назначить горячую клавишу.
Помимо использования & в тексте пункта для задания клавиши быстрого вызова, можно использовать свойства пунктов меню ShortcutKeys и ShowShortcutKeys (если равно True, то клавиши быстрого вызова отображаются в меню).
Свойства, определяющие состояние:
Mnemonic – символ, следующий за амперсандом в свойстве Text (или 0).
DefaultItem = True – пункт меню по умолчанию. Текст полужирным шрифтом. Вызывается при двойном щелчке пункта, включающего подменю.
Задание горячих клавиш
Checked –переводит пункт меню в состояние флажка с возможными значениями «Выбрано» или «Не выбрано». Показывает галочку рядом с названием команды меню.
DisplayStyle – стиль вывода пункта меню, принимает одно из значений None, Text, Image, ImageAndText.
Простое решение
В контекстном меню элемента MenuStrip есть пункт Вставить стандартные элементы. Если выбрать это действие, то в меню, будут добавлены четыре пункта для обращения к базовым функциям приложения – Файл, Правка, Сервис, Справка, представляющие выпадающие меню, для которых задана полная функциональность.
К этим пунктам можно добавлять новые, и можно редактировать пункты по своему усмотрению.
Управление приложением с использованием меню
Казалось бы, ничего сложного – выбрал пункт меню, выполнилось действие (команда). Чтобы связать пункт меню с командой, нужно задать обработчики событий пунктов меню.
Объект MenuStrip – это контейнер для экземпляров MenuItem. Для организации подменю в экземплярах MenuItem определяется свойство Items. В выпадающих списках команд это свойство называется DropDownItems.
Обработчики событий меню
Основное событие пунктов меню – Click. Заготовка обработчика создается автоматически при двойном щелчке на пункте меню.
private: System::Void создатьToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)
{
// Тело обработчика...
}
Прототип прописывается в классе формы.
private: System::Windows::Forms::ToolStripMenuItem ^ создатьToolStripMenuItem;
Контекстно-зависимое меню
Контекстное меню является средством быстрого доступа к функциям объекта. При работе приложения оно вызывается в любом месте приложения щелчком правой кнопки мыши на объекте. Контекстным называется потому, что появляется рядом с выбранным объектом, и его состав зависит от содержания (контекста) этого объекта. После выбора команды из контекстного меню оно исчезает.
Возможности контекстного меню – выполнить некоторые функции приложения «Здесь и сейчас», меньше, чем у главного меню приложения. Контекстное меню, как правило, повторяет некоторые функции главного меню.
Практически каждый компонент .Net имеет контекстное меню по умолчанию.
Для создания собственного контекстного меню используется компонент ContextMenuStrip. Их может быть много, по одному для разных элементов управления, расположенных на форме.
Создание контекстного меню аналогично созданию обычного меню.
Обработка событий контекстного меню происходит так же, как и обработка событий главного меню, по событию Click.
Чтобы назначить контекстное меню какому-либо компоненту, необходимо использовать свойство компонента ContextMenuStrip, которому назначить имя контекстного меню, связанного с этим элементом управления. Например, если контекстное меню с именем ContextMenuStrip1 принадлежит элементу управления pictureBox1, то свойство рисунка ContextMenuStrip должно быть равно ContextMenuStrip1.
Создание панелей инструментов
Панель инструментов, это средство, дублирующее пункты главного меню. На панель инструментов выносится управление теми действиями, которые выполняются достаточно часто. Панель инструментов, как правило, настраивается, чтобы пользователь мог добавить в нее недостающие функции.
Панель инструментов выглядит как контейнер, в котором расположены кнопки. Каждая кнопка сопоставлена какой-либо функции (команде) приложения. На кнопках расположены пиктограммы, вид которых подсказывает назначение кнопки. Существуют стандартные пиктограммы, вид которых привычен и понятен пользователю. Эти пиктограммы разработаны и хранятся в виде файлов графического формата в системных папках, например,
С:\Program Files\Microsoft Visual Studio.NET\Common7\Graphics\bitmaps.
Для изображений на кнопках используются как bmp файлы размером 16*16 или 32*32 пиксела, так и специальные изображения с расширением ico.
Чаще всего, пункт инструментальной панели выглядит как кнопка, и ею, фактически, является. Логические группы кнопок разделяются сепаратором – вертикальной чертой. Часто используются списки, например, для выбора одного из нескольких значений свойств – шрифт, размер, масштаб.
Недоступность кнопок
Управление изображением кнопок приведено в примере.
Инструмент для разработки инструментальных панелей
Задача разработчика:
• создать кнопки;
• разместить на них картинки;
• написать обработчики событий – они, скорее всего, повторяют события пунктов главного меню;
• определить (описать) нестандартное поведение кнопок;
• добавить всплывающие подсказки к кнопкам.
Инструмент для проектирования панелей инструментов – ToolStrip. Панель инструментов состоит из набора элементов управления ToolStripButton (кнопки инструментальной панели). Каждая их них может выглядеть как просто кнопка, дублирующая пункт меню, с изображением или текстом, ниспадающее меню или разделитель (между группами кнопок).
Для ToolStrip определено множество свойств. Сначала нужно научиться добавлять кнопки на панель инструментов. Выпадающий список позволит выбрать тип элемента.
Чаще всего, используются элементы Button и ComboBox. Separator изображает вертикальную линию, разделяющую группы кнопок.
Для редактирования панели инструментов используется свойство Items (коллекция), которое вызывает редактор коллекции элементов.
Список Выбрать элемент и добавить в список ниже содержит список возможных элементов, которые могут существовать на панели инструментов – кнопка, метка, текстовое поле, список, разделитель, индикатор прогресса.
Кнопка Добавить добавляет на панель инструментов выбранный элемент. Содержимое панели отражается в поле Members (компоненты). Справа в окне свойств можно настроить свойства выделенного элемента.
Некоторые свойства панели инструментов
Dock – размещение в окне приложения. По умолчанию равно Top – сверху. Значение None – в любом месте формы, что может использоваться для перемещения панели по рабочему пространству приложения.
LayoutStyle – стиль расположения панели инструментов на форме.
AllowItemReorder – возможность изменять положение элемента на панели инструментов во время выполнения приложения (с помощью мыши и клавиши Alt).
ToolTipText – значение текста всплывающей подсказки, которое будет появляться при наведении курсора мыши на кнопку.
Всплывающие подсказки
Такой пустяк, а как важно вовремя увидеть подсказку о том, что ожидает тебя при выборе того или иного инструмента. Даже если тебе все известно, всплывающая подсказка не раздражает.
Чтобы задать подсказку, необходимо выполнить два действия.
1. Задать текст подсказки ToolTipText.
2. Разрешить его показывать. Свойство AutoToolTip = true установлено по умолчанию, и означает, что при отсутствии текста подсказки всплывать будет значение свойства Text элемента управления.
Эти действия выполняются для всех элементов, для которых нужно задать подсказку.
Размещение рисунков на кнопках
Для каждой кнопки необходимо определить рисунок, который на ней расположен. Можно задать нужный рисунок как свойство Image кнопки, сопоставляя его пиктограмме с изображением. Можно использовать ImageList для хранения множества изображений пиктограмм. Каждый элемент этого компонента хранит рисунок, и каждый элемент имеет номер внутри списка
(ImageIndex), который может быть сопоставлен свойству Image кнопки на панели инструментов.
Добавление рисунков на кнопки панели инструментов. ImageList
Вместо текста на кнопке следует помещать, в соответствии со стандартом, графическое изображение. Обычно для создания панели инструментов в приложениях используются стандартные графические файлы ("New.bmp", "Open.bmp" и так далее) или иконки – файлы с расширением .ico.
Файлы пиктограмм (графических изображений) можно выбрать из ресурсов и копировать в отдельную папку внутри проекта или можно добавлять их в файл ресурсов самого проекта.
На форме размещается ImageList, невизуальный компонент, который может хранить изображения и извлекать их по мере необходимости.
Добавление изображений в объект ImageList делается в редакторе коллекции, доступной через список задач.
Важно, что все элементы будут иметь одинаковый размер, что определено свойствами Size и PhysicalDimension.
Каждый элемент списка имеет номер (индекс), счет ведется с нуля.
Подключение созданного списка изображений к панели инструментов требует двух шагов.
1. Сначала выполняется связывание контейнера панели инструментов с контейнером хранилища рисунков. Панель инструментов имеет специальное свойство ImageList. Его значение следует сделать равным имени списка изображений. Тем самым, в качестве источника картинок будет указан нужный графический список ImageList (их может быть много):
this->toolStrip1->ImageList = this->imageList1;
Для кнопок можно задавать двойные изображения – ImageList и DisabledImageList. Первый список может хранить изображения, когда кнопка доступна, второй – видоизмененное (серое) изображение, когда кнопка недоступна.
2. Кнопки панели инструментов необходимо связать с изображениями, находящимися в списке. Кнопки пронумерованы. Свойство ImageIndex кнопки должно иметь значение, сопоставляемое изображению из списка, после чего на кнопке должно появиться требуемое изображение. Размеры кнопки автоматически устанавливаются в соответствии с размером изображения.
В общем, каждой кнопке – свою картинку. Если для кнопки заданы одновременно свойства Text и Image, то для определения их взаимоотношений используется свойство
TextImageRelation, которое может принять одно их значений:
Overlay – наложение текста на изображение.
ImageAboveText – изображение находится над текстом.
TextAboveImage – изображение находится под текстом.
ImageBeforeText – изображение и текст следуют друг за другом слева направо.
TextBeforeImage – изображение и текст следуют друг за другом справа налево.
Вопрос. Как настраивать панель инструментов при работе приложения, то есть добавлять, удалять, перемещать кнопки панели.
Простое решение
В контекстном меню элемента ToolStrip есть пункт Вставить стандартные элементы. Если выбрать это действие, то на панель инструментов, как и ранее при добавлении стандартных функций в меню, будут добавлены восемь кнопок для обращения к базовым функциям приложения – Создать, Открыть, Сохранить, Печать, а также функции редактирования и вызова справочной системы.
Далее содержимое панели можно редактировать – добавить, удалить элементы.
Диалоговые окна
Специальный вид окон приложений – диалоговые окна. Есть два типа окон диалога – модальные и немодальные.
Модальное диалоговое окно – такое, из которого нельзя перейти в другое окно, не закрыв текущее. Используется для выдачи сообщений о ходе работы приложения, для настройки приложения или ввода каких-либо данных, необходимых для работы.
Примером такого окна являются почти все общепринятые диалоги, например, открытия или сохранения файла. Модальное диалоговое окно вынуждает пользователя совершать некоторые действия или отвечать на запрос приложения.
Немодальное диалоговое окно – окно, позволяющее перемещать фокус на другое окно или форму без закрытия текущего окна, используется достаточно редко.
Пример немодального окна – окно Find (Поиск).
Классификация окон диалога
1. Простейшие из диалоговых окон – окна сообщений и окна ввода информации, реализуемые функциями InputBox и MessageBox.
В Visual Studio.Net для минимального диалога с пользователем приложения используется класс MessageBox, который отображает окно сообщения, содержащее текст, кнопки и символы. С помощью окна сообщения пользователь информируется и инструктируется, а также может отвечать на вопросы приложения.
Чтобы вывести на экран окно сообщения, следует вызвать метод Show. Заголовок, сообщение, кнопки и значки, отображаемые в окне сообщения, определяются параметрами, передаваемыми в этот метод.
2. Собственные диалоги пользователя для настройки приложений – модальное окно создается на основе формы, и в нем с помощью элементов управления пользователь имеет возможность выполнить настройки.
3. Стандартные диалоги Windows.
В Visual Studio.Net существуют специальные инструменты для разработки окон диалога, которые поддерживают стандартные диалоги Windows. Все они находятся на панели инструментов во вкладке Диалоговые окна и являются невизуальными.
• OpenFileDialog – диалоговое окно открытия файла;
• SaveFileDialog – диалоговое окно сохранения файла;
• FontDialog – диалоговое окно выбора шрифта;
• ColorDialog – диалоговое окно выбора цвета;
• PrintDialog – диалоговое окно параметров печати;
• PrintPreviewDialog – диалоговое окно предварительного просмотра документа;
• PageSetupDialog – диалоговое окно выбора параметров страницы.
Классы всех стандартных диалоговых окон являются производными от класса CommonDialog. Для отображения используется функция ShowDialog, которая возвращает результат, выбранный пользователем – ОК или Cancel. При проверке возвращаемое значение сравнивается с константами перечисления DialogResult::ОК и DialogResult::Cancel.
Для создания окон диалога существует специальный инструментарий.
Окно сообщения MessageBox
Окно сообщения позволяет выводить информацию о выполнении программы и ее состоянии. Не может принимать текстовый ввод, а только способно сделать выбор из некоторого числа возможных вариантов реакции пользователя на сообщение. Является модальным.
Окно MessageBox имеет заголовок, сообщение, значок и некоторое количество кнопок. Вид значков определяется перечислением MessageBoxIcon, количество и вид кнопок (от одной до трех) – перечислением MessageBoxButtons.
Для вызова используется метод Show, который имеет более десяти перегрузок. Заголовок, сообщение, кнопки и значки, отображаемые в окне сообщения, определяются параметрами, передаваемыми в этот метод.
Часто используется перегрузка Show с четырьмя параметрами, ее синтаксис:
public:
static DialogResult Show(String^ Text, String^ Caption,
MessageBoxButtons Buttons, MessageBoxIcon Icon);
Здесь:
Text – текст, отображаемый в окне сообщения;
Caption –текст, отображаемый в строке заголовка окна сообщения;
Buttons – одно из значений типа MessageBoxButtons, определяющее, какие кнопки отображаются в окне сообщения;
Icon – одно из значений типа MessageBoxIcon, указывающее, какой значок отображается в окне сообщения: Information , Error или Stop , Exlamation или Warning , Question .
Возвращаемое значение имеет тип System.Windows.Forms::DialogResult, и возвращает, в зависимости от выбора пользователя, одно из значений перечисления DialogResult, что необходимо для анализа нажатой кнопки и выбора дальнейших действий. Возможные значения перечисления – Abort, Cancel, Ignore, No, None, OK, Retry, Yes.
Другие перегрузки позволяют дополнительно задать такие параметры как владелец окна, параметры окна, кнопка по умолчанию и другие.
Пример
Пример окна, как это реализовано в коде.
private: System::Void ПримерToolStripMenuItem1_Click_1(System::Object^ sender,
System::EventArgs^ e)
{
// Res получает значение, возвращаемое диалогом.
// Директива using namespase System::IO прописана в начале кода.
System::Windows::Forms::DialogResult Res;
do
{
Res = MessageBox::Show("Закрыть окно?","Пример MessageBox",
MessageBoxButtons::YesNo, MessageBoxIcon::Question);
if (Res==System::Windows::Forms::DialogResult::Yes)
{
MessageBox::Show("Bye-bye..","Пример MessageBox");
break;
}
}while (Res!=System::Windows::Forms::DialogResult::Yes);
}
Элементы управления для создания диалоговых окон
Все стандартные диалоги создаются с использованием элементов управления:
• OpenFileDialog – диалоговое окно открытия файла;
• SaveFileDialog – диалоговое окно сохранения файла;
• FontDialog – диалоговое окно выбора шрифта;
• ColorDialog – диалоговое окно выбора цвета;
• PrintDialog – диалоговое окно параметров печати;
• PrintPreviewDialog – диалоговое окно предварительного просмотра документа;
• PageSetupDialog – диалоговое окно выбора параметров страницы.
Диалоговые окна открытия файла и сохранения файла
Диалоговое окно открытия файла предназначено для поиска файла, который следует открыть.
Диалоговое окно сохранения файла используется для поиска файла, в котором будут сохранены данные из программы.
Для создания этих окон используются элементы OpenFileDialog и SaveFileDialog. Базовым классом для них является класс FileDialog. Результат завершения диалога возвращается через значение перечисления DialogResult, который наследует классу
System::Windows::Forms. Диалоги открытия и закрытия файлов могут завершиться нажатием кнопки ОК или Cancel, соответственно, значение может быть равно DialogResult::OK или DialogResult::Cancel.
Чтобы решать задачи, связанные с файлами и каталогами, рекомендуется включить в код пространство имен System::IO:
using namespace System::IO;
Некоторые свойства OpenFileDialog и SaveFileDialog
На этапе проектирования в конструкторе формы можно задать следующие свойства.
Title – заголовок окна открытия или сохранения файла.
FileName – имя файла, которое выбрано для открытия или закрытия.
Filter – фильтр выбора по типу файла – определяет, файлы какого типа будут отображаться в окне открытия (сохранения) файлов.
Синтаксис фильтра:
Описание фильтра|*.расширение
Например:
Файлы формата rtf |*.rtf
Архивы в формате RAR|*.rаr| Архивы в формате ZIP|*.zip
Можно задавать фильтр программно, определяя значение фильтра как строку, являющуюся значением свойства Filter:
this->saveFileDialog1->Filter="Rtf файлы (*.rtf)|*.rtf|Все файлы (*.*)|*.*";
OverwritePrompt – отображает вопрос о перезаписи текущего файла взамен уже существующего с таким же именем.
DefaultExt – расширение имени файла по умолчанию.
AddExtension – будет ли добавляться расширение по умолчанию (DefaultExt).
FilterIndex – какой тип файлов из списка Filter, будет отображаться.
InitialDirectory – начальная папка.
MultiSelect – разрешено ли пользователю выбирать сразу несколько файлов.
ShowHelp – управляет отображением кнопки Справка в диалоговом окне.
Результатом вызова диалогов является имя выбранного файла. Имя выбранного файла или списка файлов возвращается в значение свойства FileName, в которое передается имя файла. Если можно выбрать несколько файлов, то их имена сохраняются в свойстве-массиве FileNames и разделены пробелами. Если при работе с окном выход происходит по кнопке Cancel, то именем файла будет имя по умолчанию (можно назначить "" или "Noname").
Для вызова диалоговых окон открытия (сохранения) файла необходимо использовать метод ShowDialog(), например:
this->openFileDialog1->ShowDialog();
Однако, так не принято. Требования стиля предполагают анализ результата диалога – завершился ли он нажатием кнопки ОК и подтверждением выполнения действия:
if(this->openFileDialog1->ShowDialog()==::DialogResult::OK)
{
File_name=openFileDialog1->FileName;
this->richTextBox1->LoadFile(File_name,RichTextBoxStreamType::RichText);
}
else
// Не ОК, сделать еще что-то.
Диалоговое окно настройки цветовой палитры
Для настройки цвета фона формы и расположенных в форме элементов можно использовать диалоговое окно настройки цветовой палитры ColorDialog. Основное свойство, возвращаемое диалогом, это Color. Выбранный в окне диалога цвет является его свойством Color, и назначается свойству ForeColor или BackColor элемента или формы. Также можно изменить цвет текста элементов управления.
FullOpen – определяет, указываются ли в окне набор пользовательских цветов.
AllowFullOpen – включает(отключает) кнопку Определить цвет.
Для вызова этого диалогового окна необходимо использовать метод ShowDialog().
Можно вообще не использовать этот диалог в режиме конструктора, а создать динамически.
ColorDialog^ MyDialog = gcnew ColorDialog;
MyDialog->Color = this->richTextBox1->ForeColor;
Диалоговое окно настройки шрифтов текста
Для вызова диалога настройки шрифтов текста используется инструмент FontDialog. Предлагает пользователю выбрать шрифт среди шрифтов, установленных на локальном компьютере.
Свойства диалога определяют вид окна диалога и набор его функций.
Диалог FontDialog возвращает объект Font, его значение или некоторые свойства, запоминающие установки, сделанные в диалоговом окне Font, затем назначается свойству Font элемента управления или формы:
Name – Название выбранного шрифта (текст);
Size – Размер шрифта (число);
Bold – Полужирный (False или True).
Italic – Курсив (False или True).
Underline – Подчеркнутый (False или True).
Strikeout – Зачеркнутый (False или True).
if (fontDialog1->ShowDialog() == ::DialogResult::ОК)
{
textBox1->Font = fontDialog1->Font;
textBox1->ForeColor = fontDialog1->Color;
}
Диалоговое окно печати
Для организации печати используется элемент PrintDialog. Позволяет выбирать принтер, изменять его параметры, а также задавать печать всего документа целиком, диапазона страниц или выделенной части документа.
Свойства PrintDialog
Document – Документ для печати.
AllowSomePages – Выбранный диапазон страниц.
PrinterSettings – Позволяет ссылаться на такие свойства как:
• PrintRange –значения AllPages, Selection или SomePages;
• MinimumPage – начальная страница документа;
• MaximumPage – конечная страница документа;
• FromPage – с какой страницы начинать печать;
• ToPage ‑ какой страницей завершить печать.
Диалоговое окно предварительного просмотра документа
Диалоговое окно PrintPreviewDialog предназначено для предварительного просмотра документа.
Основное свойство PrintPreviewDialog – Document.
Необходимо использовать один и тот же объект PrintDocument, что и для PageSetupDialog и PrintDialog.
Диалоговое окно настройки параметров страницы
Диалоговое окно PageSetupDialog позволяет задавать ширину полей, ориентацию страницы, источники и размеры бумаги, а также выбирать принтер по умолчанию и настраивать параметры принтера.
Свойства PageSetupDialog.
Document – Документ для печати. Необходимо использовать один и тот же объект PrintDocument для PageSetupDialog и PrintDialog.
AllowMorgins – Позволять ли изменять поля.
AllowOrientation – Позволять ли изменять ориентацию.
Изменения, вносимые пользователем в диалоговом окне PageSetupDialog, отражаются объектом PageSettings, который диалоговое окно получает из объекта PrintDocument.
Создание собственных диалоговых окон
Чтобы вывести собственное диалоговое окно, необходимо создать форму, задать ее свойствам ControlBox, MinimizeBox и MaximizeBox значение False, а свойству Modal значение True. Форму следует выводить методом ShowDialog в режиме модального диалогового окна. Если при этом задать свойство TopMost равным True, диалоговое окно будет располагаться поверх всех окон на экране.
Свойство DialogResult кнопки или самой формы позволяет узнать, какая кнопка была нажата на форме: None, Cancel, Abort, Retry, Ignore, Yes, No
Строка состояния
Строка состояния, это специальный элемент окна, состоящий из нескольких панелей, в которых отображается текущая информация о состоянии и режиме работы приложения, например, может показывать состояние приложения, дату и текущее время, состояние клавиш Ins и CapsLock и значения настроек приложения или документа.
Строка состояния автоматически размещается в нижней части родительского окна приложения, это положение элемента является стандартным. В большинстве приложений ею можно управлять – убрать с экрана.
В VB .Net для создания строк состояния используется компонент StatusStrip.
Строка состояния изменяет размеры вместе с формой. (Свойство Dock = Bottom).
Справа на строке состояния расположен манипулятор размера, за который можно ухватиться при изменении размера окна. Его можно скрыть, задав свойству SizingGrip значение False.
Свойства BorderStyle, BackColor и ForeColor выбираются в тон окну владельцу.
Строка состояния состоит из набора панелей, каждая из которых является объектом. Тип элементов панели может быть одного из видов – метка (StatusLabel), индикатор (ProgressBar), выпадающий список(DropDownButton) и разделитель (SplitButton).
Панели строки состояния содержат методы Add, Insert и Remove, а также свойства Text, Icon, Style, ToolTipText, и т.д. Свойство Parent доступно только для чтения.
Основное свойство Text – текст, размещаемый на панели (как правило, текст формируется программно).
Как-то определить – нажаты ли клавиши Insert, CapsLock и прочие. Как-то определить, какой язык.
Описание примера
Постановка задачи. Небольшое приложение «Маленький текстовый редактор» на основе SDI интерфейса, должно содержать обычные пункты меню и дублирующие их кнопки панели инструментов.
Файл: содержит группу команд для работы с файлами: Создать, Открыть, Сохранить, Сохранить как.
Правка: содержит группу команд для работы с текстом в окне редактирования: Вырезать, Копировать, Вставить, Выделить все.
Выход: команда завершения работы редактора – предполагает некоторые действия, связанные с сохранением текста.
Шаг 1. Создать главное меню приложения с использованием MenuStrip. Пункты перечислены в постановке задачи. Для разработки меню используется Menu Editor. Ни один из подпунктов не должен быть выбран (флажок Checked снять). Задать горячие клавиши и всплывающие подсказки для каждого пункта выпадающих меню.
Можно использовать простое решение вставкой стандартных команд, если вызвать пункт контекстного меню Вставить стандартные элементы.
Шаг 2. Создать панель инструментов с использованием компонента ToolStrip.
Общие свойства панели
Положение Dock = Top (наверху).
Размер – по ширине окна.
Стиль границы – BorderStyle = Fixed3D.
Добавить кнопки для работы с файлами: Создать (New), Открыть (Open), Сохранить(Save) – быстрое сохранение. Кнопку Save As не имеет смысла создавать.
Добавить кнопки для работы с текстом: Копировать (Copy), Вырезать (Cut), Вставить (Paste).
Логические группы кнопок разделить сепараторами.
Обязательные свойства каждой кнопки настраиваются в коллекции Items панели инструментов. Тип – в данной простой панели инструментов нет необходимости использовать что-либо, отличное от простых кнопок и разделителя между группами команд.
По умолчанию имена кнопок ToolStripButton_номер, которые можно изменить.
Текст (Text) – текст, который размещается на кнопке, наряду с рисунком, но может быть невидим. Так, для первого пункта меню, текст – «Создать» или «Создать файл».
Текст всплывающей подсказки – ToolTipText –содержит краткую подсказку о содержании действия, выполняемого при выборе этой команды.
Checked – выбран ли данный элемент. По умолчанию = False.
Итак, для каждой кнопки нужно определить:
• имя (Name) для использования в коде программы;
• текст (Text);
• всплывающую подсказку (ToolTipText);
• проверить, чтобы Checked = False (ни один элемент не выбран).
Для добавления рисунков на кнопки панели инструментов нужно найти файлы пиктограмм (графических изображений, например New.bmp, Open.bmp, или с расширением .ico ) и копировать их в отдельную папку внутри проекта.
Если для хранения изображений используется контейнер ImageList, то каждый элемент списка имеет номер (индекс), счет ведется с нуля. В общем, каждой кнопке – свою картинку.
Можно использовать простое решение вставкой стандартных кнопок (пункт контекстного меню Вставить стандартные элементы).
Далее следует разработка обработчиков событий для пунктов меню (и дублирующих их кнопок панели инструментов).
Шаг 3. Основой для создания окна редактирования является компонент для работы с многострочным текстом RichTextBox.
RichTextBox (поле для форматированного текста) используется для отображения, ввода, редактирования текста в формате RTF (Rich Text Format, обогащенный текстовый формат). Позволяет отображать текст различными шрифтами, цветами, работать с гиперссылками и добавлять рисунки.
В компонент можно загружать содержимое файлов в формате .txt или .rtf. В зависимости от выбранного формата, реализация будет различной. Для загрузки файлов может быть использован метод LoadFile, например:
RichTextBox1.LoadFile("С:\Temp\Test.txt",RichTextBoxStreamType.PlainText)
Для сохранения текста может быть использован метод SaveFile:
RichTextBoxl.SaveFile("С:\Test.rtf", RichTextBoxStreamType.RichNoOleObjs)
Необходимо добавить на форму RichTextBox и настроить свойства:
• имя – RichTextBox1;
• граница (BorderStyle) = Fixed3D;
• линейки прокрутки (ScrollBars) – Both;
• размер – по размеру формы (свойство Docs);
• разрешить перенос по строкам – MultiLine = True;
• WordWrap – выполняется ли автоматический перенос на новую строку;
• Свойства Font и Size можно оставить по умолчанию;
• AutoWordSelection = true – включает автоматический выбор слов при выделении;
• CsortCutEnable = true – делает активными горячие клавиши, определенные для данного элемента;
• Beam – вид курсора в окне редактирования;
• контекстное меню должно содержать команды редактирования текста, дублирующие пункты меню «Правка».
Шаг 4. Разработка обработчиков пункта меню «Файл» (Создать, Открыть, Сохранить, Сохранить как).
Включить в код проекта директиву
using namespace System::IO;
Имя файла будет фигурировать в приложении постоянно, поэтому оно должно быть объявлено глобально в теле формы как:
String ^ File_name;
В теле конструктора формы породить объект, чтобы задать имя файла по умолчанию:
File_name=gcnew String("Noname.rtf");
Создать
При создании нового документа окно редактирования очищается, документу присваивается имя "Noname.rtf".
Код обработчика события пункта меню Создать
// Создать новый файл.
private: System::Void создатьToolStripMenuItem_Click
(System::Object^ sender, System::EventArgs^ e)
{
// Предварительно проверить, что есть в окне и предложить сохранить.
this->richTextBox1->Text="";
File_name="Noname.rtf";
}
Открыть
Используется стандартное окно диалога открытия файла, результатом является имя выбранного файла.
По умолчанию диалог предлагает имя файла, которое не является пустым – OpenFileDialog1->FileName = "OpenDialog1.rtf". Тогда, в случае отказа от выбранного действия, именем файла (OpenFileDialog1->FileName) будет значение "OpenDialog1.rtf". Его следует поменять на имя по умолчанию, например, "Noname.rtf" или на пустую строку OpenFileDialog1->FileName = "".
Код обработчика события пункта меню Открыть
// Открыть файл.
private: System::Void открытьToolStripMenuItem_Click(System::Object^ sender,
System::EventArgs^ e)
{
this->openFileDialog1->InitialDirectory =
System::IO::Directory::GetCurrentDirectory();
this->openFileDialog1->Filter="Rtf файлы (*.rtf)|*.rtf|Все файлы
(*.*)|*.*";
// Имя файла в поле ввода имени.
this->openFileDialog1->FileName=File_name;
// Показать диалог и ждать ОК.
if( this->openFileDialog1->ShowDialog() ==
System::Windows::Forms::DialogResult::OK)
{
File_name=openFileDialog1->FileName;
this->richTextBox1->LoadFile
(File_name, RichTextBoxStreamType::RichText);
}
else // Не ОК или еще что-то.
;
}
Сохранить
Это быстрое сохранение файла, при котором имя файла и его местоположение должны быть определены. Все изменения в окне редактирования необходимо записать в файл. Если имя файла равно "Noname.rtf" (файл ни разу не был сохранен), то нужно вызвать диалог сохранения с именем – аналог выбора пункта меню Сохранить как. Достаточно обратиться к процедуре обработчика соответствующего пункта меню.
Код обработчика события пункта меню Сохранить
// Просто сохранить.
private: System::Void сохранитьToolStripMenuItem_Click(System::Object^
sender, System::EventArgs^ e)
{
// Отследить первоначальное сохранение.
if(File_name == "Noname.rtf")
// Вызвать пункт меню "Сохранить как".
// Можно предварительно сообщить – MessageBox.
сохранитькакToolStripMenuItem_Click(sender, e);
else
// Сохранить текст в файле.
this->richTextBox1->SaveFile
(File_name, RichTextBoxStreamType::RichText);
}
Сохранить как
Используется стандартное окно диалога сохранения файла. Именем файла по умолчанию является имя диалога. Если именем файла будет пустая строка (this->SaveFileDialog1-> FileName= ""), то отказ от сохранения приведет к ошибке.
Код обработчика события пункта меню Сохранить как
// Сохранить с именем.
private: System::Void сохранитькакToolStripMenuItem_Click(System::Object^
sender, System::EventArgs^ e)
{
this->saveFileDialog1-> InitialDirectory=System::IO::Directory::GetCurrentDirectory();
this->saveFileDialog1->Filter="Rtf файлы (*.rtf)|*.rtf|Все файлы
(*.*)|*.*";
// Имя файла в поле ввода имени.
this->saveFileDialog1->FileName=File_name;
// Показать диалог и ждать ОК.
// Не просто this->saveFileDialog1->ShowDialog();
if( this->saveFileDialog1->ShowDialog()==
System::Windows::Forms::DialogResult::OK)
{
File_name=saveFileDialog1->FileName;
this->richTextBox1->SaveFile
(File_name, RichTextBoxStreamType::RichText);
}
else
// Не ОК или еще что-то.
;
}
Шаг 5. Разработка панели инструментов для группы команд меню «Файл».
После разработки обработчиков для пунктов меню, разрабатывается панель инструментов. Кнопки панели инструментов должны обращаться к тем же процедурам, что обрабатывают события пунктов меню. Обработчики событий пишутся не для отдельных кнопок панели инструментов, а для всей панели. Номер кнопки – свойство ToolStrip1->Items->IndexOf (нумерация с нуля) определяет выполняемое действие.
// Обработчики событий кнопок инструментальной панели
// дублируют пункты меню.
private: System::Void toolStrip1_ItemClicked(System::Object^ sender,
System::Windows::Forms::ToolStripItemClickedEventArgs^ e)
{
switch (this->toolStrip1->Items->IndexOf(e->ClickedItem))
{
case 0: {/*Создать*/ создатьToolStripMenuItem_Click(sender,e); break;}
case 1: {/*Открыть*/ открытьToolStripMenuItem_Click(sender,e); break;}
case 2: {/*Сохранить*/ сохранитьToolStripMenuItem_Click(sender,e); break;}
};
}
Шаг 6. Разработка обработчиков событий для пункта меню «Редактировать»: Копировать, Вырезать, Вставить, Выделить все.
Обработчики событий пунктов меню редактирования текста работают с выделенным в окне редактирования текстом. Все операции выполняются через буфер обмена, представленный классом ClipBoard.
Все приложения Windows используют общий системный буфер обмена, поэтому его содержимое зависит от выполняемой операции обмена, и в приложении должно быть определено возможными форматами представления данных, помещаемых в буфер и извлекаемых оттуда. Для помещения в буфер обмена объект должен быть сериализуемым.
Класс Clipboard предоставляет методы, которые можно использовать для взаимодействия с функцией буфера обмена операционной системы Windows. Однако, многие приложения используют буфер обмена в качестве временного хранилища данных для решения своих внутренних задач. Например, текстовый редактор использует буфер обмена для выполнения операций редактирования текста – копирования, вырезания и вставки, хотя буфер обмена может использоваться и для передачи данных из одного приложения в другое.
Решая внутренние задачи приложения, нужно определить, какого типа (или типов) данные помещаются и извлекаются из буфера, ограничив, таким образом, функциональность операций редактирования. Кстати, можно добавить данные в буфер обмена в нескольких различных форматах, чтобы увеличить количество приложений, которые потенциально могут использовать данные.
Формат буфера обмена является строкой, которая определяет формат таким образом, чтобы приложение, использующее этот формат, могло получать связанные данные. Предварительно определенные имена форматов для использования предоставляет класс DataFormats. Можно использовать собственные имена форматов или использовать тип объекта в качестве его формата, для чего последние необходимо сериализовать. Тип формата состоит из текстового имени формата (Name) и идентификационного номера (Id), которые определяют формат системного Clipboard или другой формат.
Получить значение формата данных позволяет метод GetFormat.
Класс ClipBoard предоставляет методы для помещения данных в системный буфер обмена и извлечения данных из системного буфера обмена.
Чтобы добавить данные в буфер обмена в одном или нескольких форматах, используется метод SetDataObject, которому можно передать любой объект. Для добавления данных в нескольких форматах необходимо сначала добавить данные в отдельный объект, предназначенный для работы с несколькими форматами данных, обычно это объект DataObject.
Для добавления данных в буфер обмена в требуемом формате используется метод SetData с именем пользовательского формата. Предварительно необходимо определить нужный формат представления данных через свойство Format объекта DataFormats:
DataFormats::Format^ myFormat = DataFormats::GetFormat(DataFormats::Rtf);
Для компонента RichTextBox форматом представления данных является предопределенный формат DataFormats::Rtf.
Для извлечения данных из буфера обмена в требуемом формате используется метод компонента RichTextBox, вставляющий содержимое буфера в точку вставки в указанном формате представления данных:
richTextBox1->Paste(myFormat);
Предварительно необходимо определить нужный формат представления данных через свойство Format объекта DataFormats, а также определить, есть ли в буфере данные и в каком формате они там представлены, с использованием метода ContainsData:
if (Clipboard::ContainsData(myFormat->Name)==true) // Далее вставка.
Замечание о тексте внутри RichTextBox
Внутри текста существует объект Selestion – выделенный текст. Если ничего не выделено, то это точка вставки – сжатый объект Selestion. При работе с ClipBoard необходимо учесть правила взаимодействия добавляемого содержимого с объектом Selestion.
Если есть выделение, то выделенный текст по команде Cut или Copy помещается в буфер, а по команде Paste текст из буфера заменяет выделение в тексте.
Если нет выделения, то команды Cut и Copy могут привести к ошибке, а команда Paste работает без изменения – текст из буфера помещается в точку вставки.
Если в буфере нет текста, то команда Paste работает так же, при этом, если в тексте было выделение, оно удаляется.
Кстати, общепринятые горячие клавиши для операций редактирования – Ctrl/C, Ctrl/X, Ctrl/V работают в RichTextBox без проблем, если свойство Shortcut Enabled = true.
Код обработчика события пункта меню Копировать
Выделенный в окне редактирования фрагмент текста помещается в буфер обмена в соответствии с форматом представления данных DataFormats::Rtf.
private: System::Void копироватьToolStripMenuItem_Click(System::Object^
sender, System::EventArgs^ e)
{
// Получить формат представления текста в буфере как Rtf формат.
DataFormats::Format^ myFormat = DataFormats::GetFormat(DataFormats::Rtf);
// Проверить, есть ли выделение.
if(this->richTextBox1->SelectionLength>0)
{
Clipboard::SetData(myFormat->Name,this->richTextBox1->SelectedRtf);
}
}
Код обработчика события пункта меню Вырезать
Выделенный в окне редактирования фрагмент текста помещается в буфер обмена в соответствии с форматом представления данных DataFormats::Rtf, и удаляется из текста.
private: System::Void вырезатьToolStripMenuItem_Click(System::Object^
sender, System::EventArgs^ e)
{
// Открыть DataFormats::Format для Rtf.
DataFormats::Format^ myFormat = DataFormats::GetFormat(DataFormats::Rtf);
if(this->richTextBox1->SelectionLength>0)
{
Clipboard::SetData(myFormat,this->richTextBox1->SelectedRtf);
this->richTextBox1->SelectedRtf = ""; //->Remove(1);
}
}
Код обработчика события пункта меню Вставить
Из буфера обмена текст помещается в окно редактирования (по местоположению курсора). Если в окне был выделен фрагмент текста, он будет заменен.
private: System::Void вставкаToolStripMenuItem_Click(System::Object^ sender,
System::EventArgs^ e)
{
// Открыть DataFormats::Format для Rtf.
DataFormats::Format^ myFormat = DataFormats::GetFormat(DataFormats::Rtf);
// Есть ли данные
if (Clipboard::ContainsData(myFormat->Name)==true)
// или if (Clipboard::GetDataObject()->GetDataPresent(DataFormats::Rtf)==true)
{
this->richTextBox1->Paste(myFormat);
this->richTextBox1->Refresh();
}
}
Шаг 7. Разработка обработчиков событий панели инструментов – второй пункт.
Добавление кнопок на панель инструментов нужно сделать так, как и в предыдущем случае. Нужно добавить кнопки для команд редактирования и добавить обработчики.
В процедуру обработчика событий инструментальной панели
private: System::Void toolStrip1_ItemClicked(System::Object^ sender, System::Windows::Forms::ToolStripItemClickedEventArgs^ e)
нужно включить вызов функций управления операциями редактирования:
case 3: { вырезатьToolStripMenuItem_Click (sender,e); break;}
case 4: { копироватьToolStripMenuItem_Click (sender,e); break;}
case 5: { вставкаToolStripMenuItem_Click (sender,e); break;}
Управление изображением кнопок
Вообще-то, кнопки Копировать и Вырезать должны быть недоступны, если ничего не выделено, а кнопка Вставить должна быть недоступна, если в буфере ничего нет.
Например,
if (Clipboard::ContainsData(myFormat->Name)==true)
{ // Есть данные, должно быть обычное изображение кнопки.
this->richTextBox1->Paste(myFormat);
}
else
{ // Нет данных, должно быть измененное (серое) изображение.
. . .
}
Задача решается с использованием перечисления System::Windows::Forms::ButtonState.
Значением перечисления могут быть:
All – установлены все флаги, кроме Normal.
Checked – кнопка отображается нажатой, используется для выключателя.
Flat – кнопка имеет плоский, двумерный вид.
Inactive – кнопка неактивна, отображается серым цветом.
Normal – трехмерная кнопка имеет обычный внешний вид.
Pushed – кнопка выглядит нажатой.
Шаг 8. Контекстное меню окна документа необходимо для управления операциями редактирования документа.
Элемент ContextMenuStrip должен принадлежать элементу RichTextBox и содержать те же команды редактирования текста, что и в основном меню.
Обработчики событий контекстного меню могут вызывать обработчики событий пунктов (команд) главного меню.
Шаг 9. Управление цветом текста с использованием диалога ColorDialog.
Для работы с диалогом выбора цвета можно добавить пункты меню, можно создать кнопки панели инструментов – одна для выбора цвета текста, другая для выбора цвета подложки.
Обработка событий – в обработчике конкретно кнопок панели инструментов. Для простоты пусть цветовое выделение применяется только к выделенному тексту (Selection).
В этом примере ColorDialog не размещается на форме в режиме конструктора, а создается «на лету», динамически.
// Пример работы с диалогом настройки выделения цветом.
private: System::Void toolStripButton1_Click(System::Object^ sender,
System::EventArgs^ e)
{ // Создать объект ColorDialog, минуя конструктор.
ColorDialog^ MyDialog = gcnew ColorDialog;
// Цвет, активный в диалоге, равен текущему цвету элемента.
MyDialog->Color = this->richTextBox1->ForeColor;
// Показать окно диалога.
if ( MyDialog->ShowDialog() == System::Windows::Forms::DialogResult::OK )
// Применить к выделенному тексту.
this->richTextBox1->SelectionColor = MyDialog->Color;
}
Для изменения цвета подложки выделенного фрагмента текста используется свойство
SelectionBackColor компонента RichTextBox.
Шаг 10. Диалог FontDialog.
Для работы с диалогом используется пункт меню или кнопка панели инструментов «Формат».
Диалог возвращает объект Font, который присваивается свойству Font выделенного текста.
// Пример работы с диалогом настройки шрифта.
private: System::Void toolStripButton2_Click(System::Object^ sender,
System::EventArgs^ e)
{
this->fontDialog1->Font = this->richTextBox1->Font;
if (fontDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK)
{
this->richTextBox1->SelectionFont=fontDialog1->Font;
// Если в диалоге разрешено выбрать цвет: ShowColor=true.
// this->richTextBox1->ForeColor=fontDialog1->Color;
}
}
Шаг 11. Дать возможность менять начертание текста.
Начертание текста является свойством объекта Font, однако, можно вынести на панель инструментов кнопки изменения только начертания текста – Bold, Italic, Underline. Обработчики пишутся в обработчике инструментальной панели.
При изменении начертания, как и при выделении, кнопки должны изменять свой вид. Так, если к выделенному фрагменту применено начертание Bold, кнопка не должна быть доступной или должна иметь вид нажатой.
Задача решается с использованием перечисления System::Windows::Forms::ButtonState.
Case "Bold"
RichTextBox1.SelBold = Not RichTextBox1.SelBold
If RichTextBox1.SelBold = True Then
Button.Value = tbrPressed
Else
Button.Value = tbrUnpressed
End If
Case "Italic"
RichTextBox1.SelItalic = Not RichTextBox1.SelItalic
If RichTextBox1.SelItalic = True Then
Button.Value = tbrPressed
Else
Button.Value = tbrUnpressed
End If
Case "UnderLine"
RichTextBox1.SelUnderline = Not RichTextBox1.SelUnderline
If RichTextBox1.SelUnderline = True Then
Button.Value = tbrPressed
Else
Button.Value = tbrUnpressed
End If
Шаг 12. Разработка панели состояния.
Пусть панель состоит из трех панелек:
Имя файла
Текущая дата
Что-нибудь еще – хорошо бы положение курсора – строка, символ.
AutoSize = False
Пусть первая панель строки состояния всегда отображает имя файла, который находится в окне редактирования. Тогда строку
this->statusStrip1->Items[0]->Text=File_name;
нужно написать везде, где имя файла изменяется – во всех процедурах, открытия, закрытия и сохранения файла. Только вот имя будет полным – как-то надо отсечь путь к имени.
Для отображения даты используется функция Now(). Можно применить в открытии формы. Только вот как-то надо определить формат представления даты и времени.
this->statusStrip1->Items[1]->Text=DateTime::Now.ToShortDateString();
Шаг 13. Разработка инструмента поиска.
Поиск в тексте, открытом в окне редактирования, можно выполнить по-разному. Например, можно использовать окно «Поиск-замена». Например, можно отыскивать очередное вхождение контекста и говорить «Вот оно». Простой вариант, чтобы ознакомиться с механизмами поиска – найти во всем тексте подстроку поиска и выделить ее цветом или начертанием.
На панель инструментов добавить сепаратор, текстовое поле и кнопку. В поле при работе приложения будет введен текст.
Обработчик события кнопки выполнит поиск этого текста по всему документу и выделит все его вхождения в текст документа.
Код обработчика события кнопки Найти
// Поиск в тексте.
private: System::Void toolStripButton3_Click(System::Object^ sender,
System::EventArgs^ e)
{
// Где - в тексте richTextBox1.
String ^ Where = gcnew String("");
Where = this->richTextBox1->Text;
// Что - из текстового поля панели инструментов.
String ^ What = gcnew String("");
What = this->toolStripTextBox1->Text;
// Разделить текст на слова.
array^chars = {' ', ',', '.', ':'};
array ^My_Split = Where->Split(chars);
// Начало поиска: местоположение Wo_Start.
String ^Wo = gcnew String("");
int Wo_Start = 0;
for each (Wo in My_Split)
{
if (Wo->Trim() != "" && Wo->Trim() == What) // Compare
{
Wo_Start = this->richTextBox1->Text->IndexOf(What, Wo_Start);
this->richTextBox1->Select(Wo_Start, What->Length);
this->richTextBox1->SelectionBackColor =
System::Drawing::Color::Aqua;
Wo_Start = Wo_Start + What->Length;
}
}
}
Справочная система в стиле Windows
Для использования этого диалогового окна необходимо создать справочную систему для приложения (файл справки). Далее необходимо определить значения для метода Flags диалогового окна справочной системы.
Флаги диалогового окна справочной системы:
Константа
Значение
Описание
cdlHelpCommandHelp
&Н102
Вызывает справочную систему отдельной командой
cdlHeIpContents
&НЗ
Вызывает справочную систему
cdlHelpContext
&H1
Вызывает отдельную тему справочной системы
cdlHelpContextPopup
&H8
Вызывает тему справки по индексу
cdlHelpIndex
&H3
Вызывает указатель справочной системы
cdlHelpKey
&H101
Вызывает справочную систему по ключевому слову
Пример, параметры окна.