Пятница, 26.04.2024, 22:50
Приветствую Вас Гость | RSS

Лекции

Меню сайта
Форма входа
Категории раздела
ТАУ (Теория автоматического управления) [31]
лекции по ТАУ
Экология [151]
учебник
Бухгалтерский учет и налогообложение в строительстве [56]
Дементьев А.Ю. - Практическое пособие
Психология [104]
Пип
информатика [80]
с# Карли Ватсон
современные стулья [0]
новинки
Поиск

Главная » 2010 » Февраль » 11 » Дополнительные возможности Windows Form
00:32
Дополнительные возможности Windows Form
Дополнительные возможности
Windows Form
Использование управляющих элементов, наиболее часто используемых при
разработке приложений Windows, позволяет создавать весьма впечатляющие диа-
логовые, однако очень мало серьезных приложений Windows, которые обладают
пользовательским интерфейсом, состоящим всего из одного диалогового окна. На-
против, такие приложения используют либо Single Document Interface (SDI, одно-
документный интерфейс), либо Multi-Document Interface (MDI, многодокументный
интерфейс). Приложения обоих этих типов обычно интенсивно используют различ-
ные меню и панели инструментов — управляющие элементы, которые еще не рас-
сматривались.
Начнем с рассмотрения таких управляющих элементов, как "меню" и "панель
инструментов". В результате мы узнаем, каким образом можно привязывать кноп-
ки к панелям инструментов и наоборот. Затем перейдем к созданию SDI- и MDI-
приложений, уделив главное внимание последним, поскольку SDI-приложения,
в основном, представляют собой подмножества MDI-приложений.
Управляющие элементы, которые поставляются в готовом виде вместе с Visual
Studio.NET, являются очень мощными и предоставляют широкий спектр функцио-
нальных возможностей, однако иногда возникают ситуации, когда их использование
оказывается недостаточным. Именно поэтому предусмотрена возможность созда-
вать свои собственные управляющие элементы, и в концу данной главы мы позна-
комимся с тем, каким образом эта возможность реализуется.
Интересно, сколько приложений Windows вы сможете вспомнить, в которых
бы не было какого-нибудь меню? Вероятнее всего, что такое число будет очень
близким к нулю. Меню, таким образом, можно представить себе как очень важную
составную часть любого приложения, которое создается для использования под
операционной системой Windows. Для облегчения работы по созданию меню для
приложений в Visual Studio.NET предусмотрен управляющий элемент, который
позволяет очень быстро создавать простые меню, затрачивая не намного больше
усилий на создание сложных.
Использование управляющего элемента Menu
Управляющий элемент Menu (меню), который, который будет здесь использова-
ться, называется MainMenu. Он является, как и два других вида меню, поставляе-
мых с Visual Studio.NET, производным от базового класса с именем Menu.
350 Глава 14
Второй разновидностью меню, которая будет кратко обсуждаться после MainMenu,
является ContextMenu, выводимое в тот момент, когда пользователь щелкает пра-
вой кнопкой мыши на каком-либо объекте. Технически существует еще и третья
разновидность меню, называемая Menuitem и также
ЯВЛЯЮЩаяСЯ ПрОИЗВОДНОЙ ОТ класса Menu. Menuitem
представляет собой отдельные элементы, выводящиеся
в виде меню. На рисунке слева поле Туре Неге (вво-
дить здесь) как раз является примером Menuitem. К по-
дробному обсуждению Menuitem мы перейдем очень
скоро.
Если попытаться перенести управляющий элемент
MainMenu из панели инструментов на рабочую поверх-
ность, то можно заметить, что поведение этого элемента
очень напоминает поведение панели состояния в том, что
касается его одновременного размещения как на самой
форме, так и под ней. Однако в отличие от панели состоя-
ния управляющий элемент меню допускает непосредст-
венное редактирование прямо в форме. Для того чтобы со-
здать новые пункты меню, требуется просто переместить
курсор в окно с надписью Туре Неге (см. рис. справа).
с п • •
i ^ЖС*Ас£»«{S£.
'•.:;1
Введите название меню в выделенное ОКОШКО, поста-
вив амперсанд (&) перед буквой, которую вы хотите ис-
пользовать в качестве мнемонического символа для
данного пункта меню, то есть перед той буквой, которая
будет подчеркнута в названии пункта меню и по которой
к нему можно обратиться с помощью клавиш Alt+Ключ
(см. рис. слева).
Заметьте, что вполне допустимо создать несколько
пунктов меню с одним и тем же мнемоническим симво-
лом. Правило гласит, что любая буква может быть ис-
пользована в каждом раскрывающемся меню только один
раз (например, один раз в раскрывающемся меню Files,
один раз в меню View и т. д.). Если вы случайно присвоите одну и ту же мнемони-
ческую букву нескольким пунктам в одном раскрывающемся меню, то обнаружите,
что на данный символ реагирует только самый верхний пункт.
В качестве разделителя при наборе текста в меню используется дефис (-). Это
недопустимо для пунктов меню самого верхнего уровня, а может применяться
только для пунктов меню более низких уровней.
Если щелкать мышью на выделенном окне, то можно заметить, что свойства,
выводящиеся на панели свойств, изменились. Это происходит потому, что боль-
шинство свойств, которые могут использоваться при работе с меню, имеют отно-
шение к отдельным пунктам меню.
Дополнительные возможности Windows Form 351
Средство управления Menultem
Если выбрать пункт меню в управляющем элементе, расположенном на форме,
то можно увидеть некоторые свойства, которые используются для управления
внешним видом и поведением этого пункта. Каждый пункт меню может содержать
в себе другие пункты меню, что позволяет создавать подменю для каждого пункта
основного меню. Для хранения всех объектов Menultem в базовом классе Menu
определено семейство MenuitemCoilection, как показано на приведенной выше
диаграмме классов.
Имя Режим доступа Описание
BarBreak Чтение/запись Присваивая это значение, вы указываете, что меню должно
появляться с новой строки. С помощью этого свойства можно
создавать меню с несколькими рядами верхнего уровня.
Если это свойство задано, то пункты подменю будут располагаться
в новых столбцах. Идентификатор этого свойства не выводится
в Properties Window.
Checked Чтение/запись Указывает, является ли данный пункт меню выбранным.
Defaultitem Чтение/запись Пункт, выбираемый по умолчанию; рисуется жирным шрифтом.
Если выполняется двойной щелчок мышью на Menultem,
в котором содержатся подпункты и один из них является
подпунктом по умолчанию, то именно он и будет выбран.
Enabled Чтение/запись Пункт, свойству Enabled которого присвоено значение f a l s e ,
выводится серым цветом, и его нельзя выбрать.
MdiList Чтение/запись Указывает, будет ли в меню включен список дочерних окон в MDI.
MergeOrder Чтение/запись Определяет, каким образом будет располагаться данное меню,
если оно объединяется с другим меню. Объединение различных
меню будет рассматриваться ниже в настоящей главе
при обсуждении MDI-приложений.
MergeType Чтение/запись Позволяет управлять поведением меню, когда его необходимо
объединить с другим меню, имеющим такое же значение
свойства MergeOrder.
Mnemonic Только чтение Возвращает мнемонический символ, поставленный в соответствие
данному пункту меню. Мнемонический символ — это первый
символ, следующий за амперсандом (&). Это свойство
не выводится в Properties Window.
OwnerDraw Чтение/запись Если значение этого свойства равно t r u e , то вся ответственность
за рисунки в Menultem ложится на вас. Если вам необходимо
добавить в меню рисунки, то этому свойству следует присвоить
значение t r u e и реализовать для данного пункта обработчики
для событий Drawltem и Measureltem.
RadioCheck Чтение/запись Если это свойство имеет значение, равное t r u e , то окно выбора
выводится в виде переключателя, а не в виде окошка с флажком.
shortcut Чтение/запись Это свойство определяет комбинацию клавиш, которая позволяет
осуществлять непосредственный доступ к пунктам меню
(например, Ctrl+S для пункта меню Save).
ShowShortcut Чтение/запись Присвоение этому свойству значения t r u e будет означать,
что комбинация клавиш для непосредственного доступа будет
выводиться в Menultem в текстовом виде.
Text Чтение/запись Собственно текст Menultem. В него входит амперсанд (&)
перед символом, который будет использоваться в качестве
мнемонического.
352 Глава 14
Некоторые свойства Menuitem наследуются от класса Menu. Этот список не яв-
ляется исчерпывающим — если необходим полный перечень, следует обратиться
к MSDN Reference (Справочник MSDN).
События управляющего элемента Nenultem
Имя
Сколько различных событий необходимо для Menuitem? Вы, вероятно, думаете,
что достаточно одного — события click. На самом деле, существует пять событий,
на которые можно подписаться, причем два из них следует использовать, только
если вы рисуете пункты самостоятельно. Ниже даны описания событий и пример,
демонстрирующий использование этого управляющего элемента:
Описание
Наступает, когда пользователь щелкает мышью на пункте меню. Это событие можно
также сгенерировать искусственно, обратившись к методу PerformClickO,
имеющемуся в Menuitem.
Возникает, когда пункт меню должен быть выведен. Если свойству OwnerDraw
присвоено значение t r u e , то это событие необходимо обрабатывать.
Возникает перед тем, как Menuitem начинает рисоваться. Если вы рисуете Menuitem
самостоятельно, то вам необходимо вычислить и вернуть ширину и высоту пункта,
вызвавшего наступление события.
Возникает в момент вывода списка подпунктов данного Menuitem. Это событие может
использоваться для проверки доступности пунктов меню и соответствующего задания
их состояния.
Наступает, когда пользователь перемещает курсор мыши на данный пункт или когда он
перемещает фокус с помощью клавиатуры.
Click
Drawltem
Measureltem
Popup
Select
Средство управления CemtextHenu
Контекстное меню — это меню, которое открывается, когда пользователь
щелкает правой кнопкой мыши на каком-либо объекте, расположенном
в форме. Контекстное меню, изображенное на рисунке слева, представляет со-
бой меню, которое автор получил, щелкнув правой кнопкой мыши на рабочем
столе своего компьютера
Создать контекстное меню можно посредством переноса такого меню
в форму и добавления к нему необходимых пунктов — точно так же, как это
может быть сделано со управляющим элементом MainMenu. Единственное от-
личие заключается в том, что в контекстном меню не допускается наличие
пунктов самого верхнего уровня. Для того чтобы привязать контекстное меню
к какому-либо управляющему элементу в форме, следует выбрать соответст-
вующий управляющий элемент и присвоить его свойству contextMenu указа-
тель на созданное вами контекстное меню.
Active Desktop
cons
|| -
R
Paste ; .
f in~..,vL(1 *
>
Практикум: пример использования меню
Теперь можно создать пример использования различных меню, который будет
использоваться в качестве базового по мере создания более сложных примеров
с использованием меню при обсуждении MDI-приложений. В данном примере мы
создадим одно основное меню и одно контекстное меню:
1. Начните с создания нового Windows Application.
Назовите его MenuExample.
Дополнительные возможности Windows Form 353
Название
menultemFi1es
menuItemNew
menuItemOpen
menuItemSave
menuItemSeparatorO
menul t emExi t
Текст
&Files
&New
&Open
&Save
-
E&xit
2. Добавьте В форму управляющие Элементы MainMenu И ContextMenu
посредством двойного щелчка мышью на соответствующих
управляющих элементах, находящихся в панели инструментов.
Назовите эти управляющие элементы соответственно MainMenuFiies
И ContextMenuFonts.
3. Добавьте приведенные ниже пункты в управляющий
элемент MainMenu, выбрав его и вводя текст
В Соответствующие ПУНКТЫ меню, начав С menuItemFiles
и двигаясь вниз. Меню menuItemFiles как меню самого
верхнего уровня. Помните, что вы создаете разделитель,
вводя в меню один дефис (-), а также определяете
мнемонические символы для каждого пункта, включая
амперсанд (&) перед символом, который выбирается
в качестве мнемонического (см. табл. слева).
4. Выберите контекстное меню и создайте следующие
пункты меню точно так же, как вы делали это выше
(см. табл. справа).
5. Добавьте к форме один управляющий элемент RichTextBox.
Назовите его rtfText И присвойте его СВОЙСТВУ Dock
Имя Текст
menuItemBold
menultemltaliс
&Bold
&Italic
значение Fill, для того чтобы оно заполнило всю
форму целиком, и очистите его свойство Text.
6. Выберите элемент RichTextbox и выберите
свойство ContextMenu. Из раскрываемого списка
выберите ContextMenuFonts, ДЛЯ ТОГО чтобы
привязать контекстное меню к управляющему
элементу RichTextbox.
После этого вы должны получить форму, которая
выглядит приблизительно так, как представлено на ри-
сунке слева.
Добавление обработчиков событий
Теперь следует добавить код в наши меню. Мы постараемся не усложнять ме-
тоды, соответствующие пунктам меню Open (открыть), Save (сохранить) и New
(создать новый), и для демонстрационных целей будем использовать фиксирован-
ный файл. Для того чтобы добавить обработчик событий click в какой-либо пункт
меню, слеяует просто дважды щелкнуть на нем мышью, как мы это делали для
переключателей и других управляющих элементов. Мы добавим обработчики цдя
следующих пунктов меню: New, Open, Save и Exit (выход). Щелчок мышью на раз-
делителе не допускается, кроме того, не должно выполняться никаких действий
в том случае, если пользователь щелкает мышью на меню файлов, поэтому для
этого пункта меню не предусмотрено никаких обработчиков событий.
Начнем с двойного щелчка мышью на пункте меню New:
private void menultemNew__Click(object sender, System.EventArgs e)
this.rtfText.С1ear();
354 Глава 14
Параметр sender представляет собой ссылку на пункт меню, на котором прои-
зошел щелчок мышью. В данном случае, нам заведомо известно, что таким пунк-
том является пункт New, однако обработчик события может быть привязан
к нескольким пунктам, и тогда этот параметр определяет меню, которое следует
использовать.
Повторите процедуру для пунктов Open, Save и Exit:
private void menuItemOpen_Click(object sender, System.EventArgs e)
{
// Загрузка файла
try
• щшт'1 -Л • (
this.rtfText.LoadFilef*. ./. ./test.rtf") ;
}
catch (System.Exception err)
MessageBox.Show("Error while loading:\n" + err.Message);
' I : 1 : }
}
private void menuItemSave_Click(object sender, System.EventArgs e)
{ ;_ .
// Сохранение файла
try
{
this, rtf Text. SaveFileC. ./. ./test.rtf) ;
' : } . . :
catch (System.Exception err)
{
MessageBox.Show("Error while saving file:\n" + err.Message);
}
}
private void menuItemExit_Click(object sender, System.EventArgs e)
{ .... , ^ _^ .._. _ .._ ,;. ._ ...^ . ......... . .......... ^ ... . ; ...
/7 Выход из приложения •
Application.Exit();
}
Обратите внимание на то, что мы включили сюда обработку ошибочной ситуа-
ции, когда требуемый текстовый файл отсутствует. Существует еще один способ
выполнения такой проверки. Пункт меню menuItemFiles содержит и другие пункты
нашего основного меню. По этой причине каждый раз, когда приходит запрос на
просмотр всех членов данного пункта меню, он отправляет сообщение о событии
Popup. Если мы подпишемся на это событие, то окажемся в состоянии осуществ-
лять проверку существования требуемого файла и отключать пункт меню Open
в том случае, если таковой не существует. Мы осуществим подписку на это собы-
тие, добавив его в конструктор формы:
public Forml()
{
//
// Необходимо для поддержки Windows Form Designer
//
InitializeComponent() ;
this.menuItemFiles.Popup += new EventHandler(this.menuItemFiles_Popup);
Дополнительные возможности Windows Form 355
Теперь мы создаем собственно обработчик события:
private void menuItemFiles_Popup(object sender, System.EventArgs e)
:-.: { '
// Позволяет определять, существует ли данный файл, присваивая соответствующее
// значение свойству Enabled, которое возвращается методом File,Exists,
this.menuItemOpen.Enabled = System.10.File.Exists("../../test.rtf");
} I . . • •• ' • . |
Статический метод Exists класса File возвращает значение логического типа,
которое равно true, если такой файл существует, и false — в противном случае;
это именно то, что требуется отобразить в пункте меню Open, поэтому мы просто
присваиваем свойству Enabled значение, возвращаемое этой функцией.
На этом работа с основным меню завершена, и теперь можно перейти к кон-
текстному меню. Мы добавляем обработчик событий click точно так же, как дела-
ли это для основного меню — посредством двойного щелчка мышью на пунктах
и внесения следующего кода:
private void menuItemBold_Click(object sender, System.EventArgs e)
M : : - , t : - { '••" ; - ' ' ' ' ' • '
Font newFont = new Font(rtfText.SelectionFont,
(rtfText.SelectionFont.Bold ?
: rtfText.SelectionFont.Style & -FontStyle.Bold :
rtfText.SelectionFont.Style ! FontStyle.Bold));
rtfText.SelectionFont -newFont;
}
private void menuItemItalic_Click(object sender, System.EventArgs e)
{
Font newFont = new Font(rtfText.SelectionFont,
(rtfText.SelectionFont.Italic ?
rtfText.SelectionFont.Style & -FontStyle.Italic :
rtfText.SelectionFont.Style I FontStyle.Italic));
rtfText,SelectionFont = newFont;
} ^^^: ;;--;-:Г: ;.^";.:"----;-:; .=•;:•"';'-"
: private void menuItemUnderline_Glick(object sender, System.EventArgs e)
{
Font newFont = new Font(rtfText•SelectionFont,
i (rtfText.SelectionFont.Underline ?
rtfText.SelectionFont.Style & -FontStyle.Underline :
rtfText.SelectionFont.Style I FontStyle.Underline));
rtfText.SelectionFont = newFont;
В каждой из этих трех функций мы создаем новый шрифт на основе шрифта,
который используется в текущий момент в окне RichTextbox. Если стиль шрифта
уже задан, то удаляем его из нового шрифта, в противном случае добавляем требу-
емый стиль в шрифт. После этого присваиваем новый шрифт выбранному тексту.
Единственная строка, предназначенная для создания объектов, выглядит неско-
лько устрашающе, поэтому дадим здесь некоторые пояснения. Если вы чувствуете,
что недостаточно знакомы с тринарными операторами, то вам следует обратиться
к главе 4. Для пояснений мы возьмем строку из метода menuitemBoid_ciick:
1 Font newFont = new Font(rtfText.SelectionFont,
2 ( rtfText.SelectionFont.Bold ?
3 rtfText.SelectionFont.Style & -FontStyle.Bold :
4 rtfText.SelectionFont.Style I FontStyle.Bold));
5 rtfText.SelectionFont = newFont;
356 Глава 14
Г -I
ТЫ* text is bold
ТШ mxt is. ЪаШ. ftalfc and tmdGfitnod
На строке 2 мы осуществляем проверку, равно ли, значение свойства Bold
выбранного шрифта true. Если да, то необходимо сформировать новый стиль для
создаваемого шрифта, в котором будут сохранены все имеющиеся у него стили за
исключением выделения жирным шрифтом, чем и занимается код, расположенный
между символами ? и : на строке 3. Код, расположенный на строке 4 — сразу по-
сле точки с запятой — будет выполняться
в том случае, если текущее значение свой-
ства Bold равно false, причем на этот раз
вместо того, чтобы удалять выделение жир-
ным шрифтом, мы добавляем его. Наконец,
вся эта последовательность событий заклю-
чается в круглые скобки — этот прием
весьма часто используется для отделения
логики тринарного оператора от остального
кода, хотя в данном случае польза от такого
выделения не представляется очевидной.
На этом первый пример, посвященный
использованию меню, завершен. Если запу-
стить код, то должно получиться нечто вро-
де представленного на рисунке слева.
Категория: информатика | Просмотров: 1291 | Добавил: basic | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Календарь
«  Февраль 2010  »
ПнВтСрЧтПтСбВс
1234567
891011121314
15161718192021
22232425262728
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

krutoto.ucoz.ru
Бесплатный конструктор сайтов - uCoz