|
Reference = add reference, в висуал студия 2010 не могу найти в вкладке Solution Explorer, Microsoft.Xna.Framework. Его нету. |
Хранитель экрана
Оконная функция нашего окна будет обрабатывать три сообщения (листинг 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.7. Создание дистрибутива
После окончания создания хранителя экрана самое время задуматься о его распространении. А именно, о создании дистрибутива, позволяющего неподготовленному пользователю легко инсталлировать и деинсталлировать хранитель экрана. Ведь как гласит народное мудрость, любое приложение встречают по одежке. В принципе, никто не мешает создать дистрибутив прямо на месте, не выходя из Visual Studio 2005. Что мы сейчас и сделаем.
Итак, добавьте в решение новый проект инсталлятора (Add | New Project | Other Project Types | Setup and Deployment | Setup Project). В свойствах ProductName и Manufacture проекта инсталлятора укажите название приложения и организации, которые будет отображаться, к примеру, в окне Add or Remove Programs.
Примечание
Дистрибутив, созданный подобным образом, использует технологию 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.
Полный путь исполняемого файла текущего хранителя экрана хранится в значение 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 ).
- 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, с заданными параметрами.



