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, с заданными параметрами.