Программирование >>  Автоматически обновляемые приложения 

1 ... 152 153 154 [ 155 ] 156 157 158 ... 170


: Листинг 17.16, Создание нового пункта в системном меню

public FormlО {

InitializeComponent();

Получаем описатель системного меню

IntPtr hSysMenu = GetSystemMenu(this.Handle, 0);

Добавляем новые пункты в системное меню AppendNenu(hSysMenu, MenuFlags.MF SEPARATOR, О, null) AppendMenu(hSysMenu, MenuFlags.MF STRING, ID ABOUT, C#.Народные советы );

Сначала мы получаем описатель системного меню, а затем добавляем нужную команду. Если вы запустите проект на этой стадии, то увидите, что в системном меню появилась новая команда. Но если вы щелкнете на этом пункте, то ничего не произойдет. Это нас не устраивает. Нужно переопределить виртуальный метод wndProc в нашем классе для обработки щелчка мыши по добавленному пункту меню, как это сделано в листинге 17.17.

[Dlllmport( user32.dll )]

private static extern bool AppendMenu(IntPtr hMenu, MenuFlags uFlags,

uint wIDNewItem, String IpNewItem);

Сообщение Windows

const int WM SYSCOMMAND = 0x0112;

Наш новый идентификатор для системного меню const int ID ABOUT = 1000;

Чтобы усилить контроль типов, мы использовали перечисление MenuFlags

для функции AppendMenu. Кроме ТОГО, применение перечисления позволяет использовать возможности IntellSense, что ускоряет написание кода. Для создаваемого нового пункта меню мы задаем новый идентификатор idabout. Важно, чтобы значение идентификатора не вступило в конфликт с встроенными системными командами. Теперь у нас все готово к добавлению нового пункта в меню. Для этого в конструкторе формы пишем код, приведенный в листинге 17.16.



Листинг 17.17. Обработка щелчка мыши

protected override void WndProc(ref Message msg) {

if (msg.Msg == WM SYSCOMMAND) {

i f (ms g.WPa ram.TоInt 3 2()==ID ABOUT) {

MessageBox.Show( Вы выбрали пункт системного меню ); return;

base.WndProc(ref msg);

Запустите проект и проверьте работу приложения (рис. 17.1). Сейчас все работает, как положено. Теперь вы знаете, как вставлять новые пункты в системное меню. Для более профессионального кода можно также использовать

функции GetMenuItemCount И RemoveMenu, С ПОМОЩЬЮ КОТОрЫХ МОЖНО ПОД-

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

Примечание

Пример добавления команды в системное меню находится в папке SystemMenu на прилагаемом диске.


Переместить Размер I Свернуть П Развернуть

X Закрыть

Alt+F4

С.Народные советы

Рис. 17.1. Новая команда в системном меню



I Листинг 17.18. Работа с конфигурационными файлами

[Dlllmport( kernel32 )]

private static extern bool WritePrivateProfileString(string AppName, string KeyName,

string IpString, string FileName); [Dlllmport( kernel32 )]

private static extern int GetPrivateProfileString(string AppName, string KeyName, string IpDefault, StringBuiider ReturnedString, int Size, string FileName);

[Dlllmport( kernel32.dll )]

private static extern mt GetPrivateProfilelnt(string AppName, string KeyName, int nDefault, string FileName);

Работа с конфигурационными файлами INI

Конфигурационные файлы используются для сохранения различных настроек программы, которыми можно воспользоваться при открытии нового сеанса работы с этой программой. Например, мы хотим запомнить размеры окна, его цвет, текст в текстовых полях и другие настройки. Можно придумать свой вариант хранения данных, разработав собственный формат файлов. А можно воспользоваться готовыми решениями. Конфигурационные файлы с расширением INI использовались еще в старых версиях Windows, например, в Windows 3.11. Затем специалисты Microsoft решили хранить настройки в реестре и предложили разработчикам отказаться от файлов I1M1. В настоящее время стало модным использовать файлы XML. У всех этих способов есть свои плюсы и минусы. К плюсам файлов IN1 можно отнести простоту редактирования файла, который является обычным текстовым файлом, возможность создания переносимых приложений, которые не засоряют реестр, а также их малый размер по сравнению с файлами XML. Рассмотрим пример работы с файлами IN1 при помощи функций Windows API WritePrivateProfileString, GetPrivateProfileSting И GetPrivateProfilelnt. Предположим, что мы хотим запоминать размеры формы, установленные пользователем, а также текст, введенный пользователем в текстовый файл, чтобы при следующей загрузке программы использовать эти значения. Именно это и делается в примере, приведенном в листинге 17.18.



1 ... 152 153 154 [ 155 ] 156 157 158 ... 170

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика