Опубликован: 28.04.2009 | Доступ: свободный | Студентов: 1840 / 107 | Оценка: 4.36 / 4.40 | Длительность: 16:40:00
Специальности: Программист
Лекция 4:

Хранитель экрана

Оконная функция нашего окна будет обрабатывать три сообщения (листинг 4.23):

  • wmpaint - визуализация изображения.
  • wmclose - освобождение ресурсов и удаление окна.
  • wmdestroy - завершает работу приложения.
// Оконная функция
public static IntPtr WindowProc(IntPtr hWnd, uint uMsg, IntPtr wParam, IntPtr lParam)
{
switch (uMsg) 
{ 
// Обработчик сообщения WMPAINT
case (uint)Win32.WindowsMessages.WMPAINT: if
 (firework != null) 
{
// Обновляем состояние сцены
firework.Update(); 
// Визуализируем сцену
firework.Paint(); 
} 
return IntPtr.Zero;
// Обработчик сообщения WM_CLOSE
case (uint)Win32.WindowsMessages.WM_CLOSE: if 
(firework != null) 
{ 
// Освобождаем ресурсы
firework.Dispose();
 firework = null; 
}
// Уничтожаем окно
Win32.DestroyWindow(displayHandle);
return IntPtr.Zero;
// Обработчик события WM_DESTROY
case (uint)Win32.WindowsMessages.WM_DESTROY: 
// Выходим из цикла обработки сообщений
Win32.PostQuitMessage(0);
return IntPtr.Zero;
default:
return Win32.DefWindowProc(hWnd, uMsg, wParam, lParam); 
} 
}
Листинг 4.23.
 Визуализация фейерверка в окне предварительного просмотра

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

Для проверки функционирования окна предварительного просмотра скомпилируйте проект хранителя экрана и установите его при помощи контекстного меню. Если все сделано правильно, то на мониторе в окне предварительного просмотра появится фейерверк искр (рисунок 4.9).

4.7. Создание дистрибутива

После окончания создания хранителя экрана самое время задуматься о его распространении. А именно, о создании дистрибутива, позволяющего неподготовленному пользователю легко инсталлировать и деинсталлировать хранитель экрана. Ведь как гласит народное мудрость, любое приложение встречают по одежке. В принципе, никто не мешает создать дистрибутив прямо на месте, не выходя из Visual Studio 2005. Что мы сейчас и сделаем.

Итак, добавьте в решение новый проект инсталлятора (Add | New Project | Other Project Types | Setup and Deployment | Setup Project). В свойствах ProductName и Manufacture проекта инсталлятора укажите название приложения и организации, которые будет отображаться, к примеру, в окне Add or Remove Programs.

 Добавление в решение проекта инсталлятора

увеличить изображение
Рис. 4.10. Добавление в решение проекта инсталлятора

Примечание

Дистрибутив, созданный подобным образом, использует технологию Windows Installer – сервис установки и конфигурирования программных продуктов, являющийся неотъемлемой частью операционных систем Windows 2000 и выше. Хотя данная технология изначально разрабатывалась для развертыванию и сопровождения корпоративного программного обеспечения, она активно используется большинством разработчиков программного обеспечения. Тем не менее "корпоративные корни" дают о себе знать – дистрибутив, использующий Windows Installer, несколько крупнее дистрибутивов, сгенерированных альтернативными инструментами (например, Nullsoft Scriptable Install System ). В прочем эпоху широкополосных каналов Internet и винчестеров объемом в сотни гигабайт лишние 500 килобайт уже не строят погоды.

Все что требуется от нашего инсталлятора – скопировать файл хранителя экрана в каталог Window и выбрать его в качестве текущего хранителя экрана.

По умолчанию папка, в которое устанавливается приложение, расположена внутри каталога Program Files. Чтобы приложение устанавливалось в каталог Windows в окне File System (Setup) щелкните на элементе Application Folder и измените значение свойства Default Location с [ProgramFilesFolder][Manufacturer]\[ProductName] на [WindowsFolder] (рисунок 4.11). Добавьте в папку Application Folder ссылку на *.scr файл хранителя экрана из каталога ...\bin\Release (эту операцию можно выполнить при помощи команды Add | File… контекстного меню элемента Application Folder ). Обратите внимание, что в папку Application Folder будет автоматически добавлена и ссылка на сборку Microsoft.Xna.Framework.dll, используемую хранителем экрана. В принципе, эту сборку вполне можно исключить из проекта, присвоив свойству Exclude значение true, однако в этом случае в описание хранителя экрана обязательно нужно указать, что для его нормального функционирования наряду с .NET Framework 2.0 и свежей версией DirectX, требуется установить и Microsoft XNA Framework.

 Изменение каталога по умолчанию, в которое устанавливается приложения

Рис. 4.11. Изменение каталога по умолчанию, в которое устанавливается приложения

Полный путь исполняемого файла текущего хранителя экрана хранится в значение scrnsave.exe раздела системного реестра HKEYCURRENT_USER\Control Panel\Desktop. Соответственно, для смены текущего хранителя экрана достаточно всего лишь исправить данное значение системного реестра.

Для реализации этой функциональности в окне Solution щелкните правой кнопкой мыши на проекте инсталлятора и выполните команду контекстного меню View | Registry. На экране появится окно с деревом ключей системного реестра. Выберите ключ hkeycurrentuser и создайте в нем ключ Control Panel (команда контекстного меню New | Key ), а в нем ключ Desktop. В ключе Desktop создайте строковое поле scrnsave.exe (команда контекстного меню New | String Value ) и присвойте ему значение вида [TARGETDIR]mysaver.scr (рисунок 4.12), где

  • [targetdir] - встроенный макрос, указывающий на каталог, в который устанавливается приложение (в нашем случае это \Windows ).
     Регистрация в системном реестре текущего хранителя экрана

    увеличить изображение
    Рис. 4.12. Регистрация в системном реестре текущего хранителя экрана
  • mysaver.scr - имя файла хранителя экрана.

Все было просто замечательно, если бы не один нюанс - значение поля scrnsave.exe должно быть коротким именем файла (это ограничение актуально даже для Windows XP Service Pack 2 ). По видимости, это пережиток, оставшийся со времен Windows 3.x, однако с ним приходится считаться. Обойти его в лоб весьма непросто, так не возможно заранее со 100% вероятностью предсказать короткое имя для заданного длинного имени файла. К счастью заботливые разработчики Windows предусмотрели альтернативный способ установки текущего хранителя экрана, не критичный к длине имени файла хранителя экрана.

Этот способ основан на использовании динамической библиотеки desk.cpl, которая собственно и реализует окно Display Properties. Данная библиотека экспортирует ряд функций, предоставляющие доступ пакетным файлам, скриптам и прикладным приложениям к функциональности окна Display Properties. В частности функция InstallScreenSaver устанавливает текущий хранитель экрана. Для вызова этой функции можно воспользоваться утилитой rundll32: rundll32.exe desk.cpl,InstallScreenSaver {имя файла хранителя экрана}

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

Андрей Леонов
Андрей Леонов

Reference = add reference, в висуал студия 2010 не могу найти в вкладке Solution Explorer, Microsoft.Xna.Framework. Его нету.