Файл: Справочник для опытных и как пособие для начинающих программистов. Компактдиск содержит исходные коды примеров из книги.doc

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 11.01.2024

Просмотров: 946

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
ничего сложного, как и многое другое в области компьютерных технологий, если разобраться в сути слов и попробовать практически испытать работу элементов этих технологий. В данном разделе речь идет о программах, работающих на компьютере вфоновом режимепри использовании, например, антивирусных про­грамм или элемента управления громкостью. Такие программы внешне напомина­ют о своем существовании лишь присутствием значка в области уведомлений панели задач в правом нижнем углу экрана. Кстати программу "Время по Гринвичу в полупрозрачной форме", рассмотренную в предыдущем разделе, уместно было бы запрограммировать именно со значком в области уведомлений. Однако чтобы замысел одного примера не смешивался с замыслом другого, а программный код при этом выглядел компактно и выразительно, эти программы приведены в разных Примерах.

Рассматриваемая в данном разделе программа также способна работать в фоновом режиме. Внешне программа имеет форму с меткой, где записаны возможности программы, командную кнопку, при щелчке на которой форма исчезает, но зато появляется значок в области уведомлений. При этом программа в оперативной па­мяти существует и работает в фоновом режиме. При щелчке правой кнопкой мыши на этом значке появляется контекстное меню из двух пунктов. Один пункт меню сообщает пользователю время работы данного компьютера с тех пор, как стартова­ла операционная система, а другой пункт меню обеспечивает выход из данной про­граммы. При двойном щелчке на значке появляется опять исходная форма, а значок исчезает. Таким образом, проектируемая программа способна переводить свою работу в фоновый режим и обратно.

Для программирования данной задачи запустим Visual Studio 2010, выберем новый проект Windows Forms Application С#. В конструкторе формы из панели элементов перенесем в форму метку, командную кнопку, элемент управления NotifyIcon и контекстное меню ContextMenuStrip. Щелкая на значке ContextMеnuStrip, спроектируем два пункта контекстного меню: Время старта ОС и Выход. Теперь перейдем на вкладку программного кода, где напишем текст программы, представленный в листинге 12.5.

Листинг 12.5. Перевод работы программы в фоновый режим и обратно

//Эта программа сообщает пользователю время, прошедшее с момента старта операционной системы

//на данном компьютере. Доступ к этой информации реализован через контекстное меню значка в

//области уведомлений панели задач


using System;

using System.Drawing;

using System.Windows. Forms ;

// Другие директивы using удалены, поскольку они не используются данной программе

namesрасе Значок_в_области_уведомлений

{ // Из панели элементов следует перенести в форму Button, Label, Notifylcon и ContextMenuStrip

Public partial class Form1 : Form

{

public Form1()

{

InitializeComponent ();

base.Text = "Создаю значок в области уведомлений";

// Задаем размер метки

Label1.Size = new System.Drawing.Size(292, 90);

// Разрешаем продолжение текста в метке с новой строки

label1.AutoSize = false;

label1.Text =

"При щелчке на командной кнопке данная программа " +

"размещает значок в область уведомлений. Щелкните " +

"правой кнопкой мыши на этом значке для доступа к " +

"контекстному меню с пунктами \"Время\"" +

"работы 0С\" и \ "Выход\"" +

". Двойной щелчок на значке возвращает " +

"на экран данную форму.";
button1.Text = "Разместить значок в область уведомлений";
// Systemlcons - это стандартные значки Windows

Notifylcon1.Icon = Systemlcons.Shield; // значок щита
// Systemlcons.Information - значок сведений

Notifylcon1.Text = "Время работы ОС";

notifylcon1.Visible = false;

// "Привязываем" контекстное меню к значку notifylcon1

Notifylcon1.ContextMenuStrip = contextMenuStrip1;

}

private void button1_Click(object sender, EventArgs e)

{ // Скрыть экранную форму и сделать видимым значок

//в области уведомлений

base.Hide(); notifylcon1 .Visible = true;

}

private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)

{ // Чтобы получить пустой обработчик этого события, можно, например,

//в конструкторе формы дважды щелкнуть на значке notifylcon1

Notifylcon1.Visible = false; base.Show ();

}

private void времяСтартаОСТооlStripMenuItem_Click (object sender, EventArgs e)

{

double Время_работы_ОС_в_минутах = System.Environment.TickCount / 1000 / 60;

// Формат "{0:F0}" округляет Double до целого значения

string ss = string.Format("ОС стартовала {0:F0} минут назад", Время_работы_ОС_в_минутах);

MessageBox.Show(ss);

}

private void выходToolStripMenuItem_Click(object sender, EventArgs e)

{ notifylcon1.Dispose(); Application.Exit(); }

}

}



Рис. 12.3. Внешний вид формы при работе Рис. 12.4. Контекстное меню при работе
программы в обычном режиме программы в фоновом режиме

Как видно из программного кода, сразу после запуска процедуры InitializeComponent выполняем очевидные инициализации свойств элементов управления, в том числе для компонента notifylcon1. Для него среди стандарт­ных значков Windows выбираем

значок щита (notifylcon1. Icon Systemlcons.Shield), а сам значок делаем невидимым (notifylcon1.Visible =

false). При обработке события "щелчок на командной кнопке" скрываем экран­ную форму и делаем видимым значок в области уведомлений. Обработка собы­тия "двойной щелчок" на этом значке обеспечивает противоположное действие, а именно показывает форму, но скрывает значок. Две последние процедуры об­рабатывают выбор пунктов меню Время старта ОС и Выход. На рис. 12.3 и 12.4 приведены фрагменты работы программы в обычном и фоновом режимах. Убедиться в работоспособности данной программы можно, открыв соответст­вующее решение в папке Значок_в_области_уведомлений.

Пример 88. Нестандартная форма. Перемещение формы мышью

Обычно экранную форму, любое Windows-окно мы перемещаем при нажатой левой кнопке мыши, "зацепив" за заголовок, т. е. за синюю полосу вверху окна. В заголовке расположены кнопки Свернуть, Свернуть в окно и Закрыть. Для демонстрации работы с событиями мыши, с аргументами процедуры обработки этих событий MouseEventArgs напишем программу, с помощью которой появляется возможность перемещать форму, "зацепив" ее указателем мыши в любой части формы, а не только за заголовок. Подобный пример, только на языке Visual Basiс приведен в книге "Visual Basic .NET. Библия пользователя"( Ивьен Б., Берес Дж. Visual Basic .NET. Библия пользователя. — M.: Вильямс, 2002. С. 591.).

Итак, запускаем Visual Studio 2010, далее заказываем новый проект шаблонаWindows Forms Application С# и получаем таким образом стандартную экранную форму. Далее вводим текст программы, приведенный в листинге 12.6.

Листинг 12.6. Перемещение формы мышью

//Нестандартная форма. Программа позволяет перемещать форму мышью, "зацепив" ее не только за заголовок,

// а в любом месте формы

using System.Windows.Forms;

// Другие директивы using удалены, поскольку они не используются в данной программе

Namespace ПеремещениеФормы

{

public partial class Form1 : Form

{

bool Moving = false;

// Перемещаем форму только тогда, когда Moving = true

int MouseDownX;

int MouseDownY;

public Form1()

{

InitializeComponent();

}

private void Form1_MouseDown(object sender, MouseEventArgs e)

{ // Здесь обрабатываем событие "щелчок любой кнопкой мыши". Во время

// щелчка левой копкой мыши запоминаем текущее положение мыши

if (е.Button == MouseButtons.Left)

{

Moving = true;

MouseDownX = e.X;

MouseDownY = e.Y;

}

}

private void Form1_MouseUp(object sender, MouseEventArgs e)

{ // Здесь обрабатываем событие, когда пользователь отпустил кнопку мыши


if (е.Button == MouseButtons.Left) Moving = false;

}

private void Form1_MouseMove(object sender, MouseEventArgs e)

{ //Здесь обрабатываем событие, когда указатель мыши перемещается в пределах формы.

// Перемещаем форму только тогда, когда Moving = true,

if (Moving == true)

{

var temp = new System.Drawing.Point();

temp.X = base.Location.X + (e.X - MouseDownX);

temp.Y = base.Location.Y + (e.Y - MouseDownY);

base.Location = temp;

}

}

}

}

Вначале программы объявлены три внешние переменные, видимые в пределах класса Form1. Одна из переменных— булева переменная Moving— это как бы флажок, который сигнализирует, следует ли перемещать экранную форму. Если пользователь нажал левую кнопку мыши (событие MouseDown, е.Button == Left), то Moving = true, т. е. следует перемещать форму. Если пользователь отпустил кнопку мыши (событие Mouseup), то Moving = false, т. е. форму перемещать не следует. Остальные две переменные целого типа int предназначены для запомина­ния текущего положения (е.X и e.Y) мыши. Перемещаем форму только тогда, ко­гда перемещается указатель мыши (событие MouseMove), и при этом флажок

Moving = true. Убедиться в работоспособности программы можно, открыв решение Переме­щениеФормы.sln в папке ПеремещениеФормы.

Пример 89. Проигрыватель Windows Media Player 11

Используя возможность подключения к проекту соответствующей библиотеки, можно написать программу для проигрывания различных файлов мультимедиа AVI, MPEG, МРЗ, МР4, FLV, WMV и других форматов. Причем ядром вашей программы будет, например, самый современный плеер Windows Media Player версии 11. Но пользовательский интерфейс, т.е. способ управления плеером: кнопки на форме или в виде выпадающего меню, цвет оболочки, значения параметров по умолчанию, размер экрана и проч., вы можете создать свой собственный.

Итак, запустим Visual Studio 2010 и закажем новый проект. Назовем этот но проект Player. Далее в окне New Project выберем шаблон Windows Forms Appliсаtion C# и нажмем кнопку ОК. Чтобы добавить на панель Toolbox элемент управления Windows Media Player, следует подключить библиотеку Windows Media Player. Для этого, щелкая правой кнопкой мыши в пределах панели элементов, в контетекстном меню выберем пункт Choose Items. Далее на вкладке COM Components установим флажок Windows Media Player и щелкнем на кнопке ОК. При этом на панели элементов появится значок Windows Media Player. Перетащите этот значок в форму. Растяните изображения формы и плеера так, как вам представляется это привлекательным. После этого в папках проекта
bin\Debug\ и \obj\x86\Debug\ должны явиться два файла: AxInterop.WMPLib.dll и lnterop.WMPLib.dll. В этих двух файлах находятся динамически вызываемые объекты для работы элемента управления Wi dows Media Player.

Далее для программирования меню перенесем с панели Toolbox в форму значок MenuStrip. Слева вверху формы появится проект первого пункта меню Type Here. Здесь мы проектируем пункты меню будущей программы. Меню Файл имеет пункты Открыть и Выход. А меню Сервис содержит пункты, показанные на рис. 12.5.



Рис. 12.5. Проектирование пунктов меню

Программный код приведен в листинге 12.7.

Листинг 12.7. Проигрыватель Windows Media Player 11

// Программа реализует функции проигрывателя Windows Media Player 11

using System;

using System.Windows.Forms;

//Другие директивы using удалены, поскольку они не используются в данной программе

namespace Player

{

public partial class Form1: Form

{

OpenFileDialog openFileDialog1 = new OpenFileDialog();

public Form1()

{

InitializeComponent();

// ВЕРСИЯ ПЛЕЕРА

base.Text = "Windows Media Player, версия = " + axWindowsMediaPlayer1.versionlnfо;

}

private void открытьToolStripMenuItem_Click(object sender, EventArgs e)

{ // ПУНКТ МЕНЮ "Открыть".

// Пользователь выбирает файл:

openFileDialogl.ShowDialog();

// Передача плееру имени файла

axWindowsMediaPlayer1.URL = openFileDialogl.FileName;

// axWindowsMediaPlayer1.URL = @"C:\WINDOWS\Media\tada.wav";

// Команда на проигрывание файла

axWindowsMediaPlayer1.Ctlcontrols.play();

// ИЛИ ТАК: передача имени файла и сразу PLAY

// axWindowsMediaPlayer1.openPlayer(openFileDialog1.FileName);

}

private void выходToolStripMenuItem_Click(object sender, EventArgs e)
{ // ПУНКТ МЕНЮ "Выход"

Application.Exit();

}

private void полныйЭкранToolStripMenuItem_Click(object sender, EventArgs e)

{ // ПУНКТ МЕНЮ "Полный экран".

// Если плеер пребывает в состоянии PLAY, то можно

// перейти в режим полного экрана:

If axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsPlaying)

axWindowsMediaPlayer1.fullScreen.playState =true;

}

private void паузаToolStripMenuItem_Click(object sender, EventArgs e)

{ // ПУНКТ МЕНЮ "Пауза"

axWindowsMediaPlayer1.Ctlcontrols.pause();

}

private void playToolStripMenuItem_Click(object sender, EventArgs e)

{ // ПУНКТ МЕНЮ "Play"

axWindowsMediaPlayer1.Ctlcontrols.play();

}

private void выклЗвукToolStripMenuItem_Click(object sender, EventArgs e)

{ // ПУНКТ МЕНЮ "Выкл звук"

axWindowsMediaPlayer1.settings.mute = true;

}

private void BклЗвукToolStripMenuItem_Click(object sender, EventArgs e)

{ // ПУНКТ МЕНЮ "Вкл звук"

axWindowsMediaPlayer1.settings.mute = false;

}

private void свойстваToolStripMenuItem_Click(object sender, EventArgs e)

{ // ПУНКТ МЕНЮ "Свойства"

axWindowsMediaPlayerl.ShowPropertyPages();

}

}