Reference = add reference, в висуал студия 2010 не могу найти в вкладке Solution Explorer, Microsoft.Xna.Framework. Его нету. |
Хранитель экрана
4.5. Диалоговое окно конфигурации хранителя экрана
Настало время подумать об управлении пользовательскими настройками хранителя экрана. Работа нашего хранителя экрана управляется двумя параметрами: размером искр и максимальным числом искр, вылетающих в течение кванта времени, равного 5 миллисекунд. Второй параметр не является интуитивно понятным, ведь рядовому пользователю намного проще регулировать количество искр посредством ползунка "мало – много". Поэтому мы пойдем на небольшую хитрость: количество искр будет задаваться целочисленным параметром "плотность искр", лежащим в диапазоне от 0 (минимальное количество искр) до 9 (максимальное количество искр), а число искр, появляющихся каждые 5 секунд, будет рассчитываться уже на основе данного целочисленного параметра.
Итак, откройте вкладку настроек приложения (Properties | Setting) и добавьте в него два целочисленных параметра (рисунок 4.5):
- scintillaSize - размер искр. Значение по умолчанию 2
- scintillaDensity - плотность искр. Значение по умолчанию 5.
Для начала немного подкорректируйте обработчик события Load полноэкранной формы хранителя экрана, чтобы он брал настройки непосредственно из файла конфигурации приложения (листинг 4.14).
public partial class FullscreenForm : Form { Properties.Settings settings; private void FullscreenForm_Load(object sender, EventArgs e) { ... // Загружаем настройки приложения из файла конфигурации (или настройки по умолчанию при // отсутствии файла) settings = new Properties.Settings(); try { // Количество искр, генерируемых каждые 5 мс, рассчитывается методом "научного тыка" firework = new Firework(Handle, (float)settings.scintillaSize, (settings.scintillaDensity + 1) * 5); } ... }Листинг 4.14.
Теперь создайте новую форму и поместите на нее компоненты согласно рисунку 4.6 и таблице 4.2.
Класс | Свойство | Значение |
---|---|---|
SettingsForm (диалоговое окно) | Name | SettingsForm |
Text | Параметры | |
ShowInTaskbar | false | |
TopMost | true | |
MinimizeBox | false | |
MaximizeBox | false | |
GroupBox | Text | Искры |
Label | Text | Размер |
TrackBar | Name | scintillaSizeTrackBar |
Minimum | 1 | |
Maximum | 4 | |
Label | Text | Плотность |
TrackBar | Name | scintillaDensityTrackBar |
Minimum | 0 | |
Maximum | 9 | |
Button | Name | okButton |
Text | Ok | |
Button | Name | cancelButton |
Text | Отмена |
Для автоматической инициализации элементов управления диалогового окна ползунки scintillaSizeTrackBar и scintillaDensityTrackBar необходимо связать со свойствами scintillaSize и scintillaDensity из конфигурационного файла приложения. Это операция легко выполняется посредством свойства Application Settings | Value ползунков (рисунок 4.7).
![Привязка значения ползунка scintillaSizeTrackBar к свойству scintillaSize файла конфигурации](/EDI/25_08_14_1/1408915096-4960/tutorial/527/objects/4/files/04-07.jpg)
Рис. 4.7. Привязка значения ползунка scintillaSizeTrackBar к свойству scintillaSize файла конфигурации
Следующий шаг - оживление формы посредством реализации нехитрых обработчиков сообщений (листинг 4.15).
public partial class SettingsForm : Form { public SettingsForm() { InitializeComponent(); } // Обработчик нажатия кнопки Ok private void okButton_Click(object sender, EventArgs e) { Properties.Settings settings = new Properties.Settings(); // Задаем новые значения свойств файла конфигурации settings.scintillaSize = scintillaSizeTrackBar.Value; settings.scintillaDensity = scintillaDensityTrackBar.Value; // Сохраняем информацию в файле settings.Save(); // Закрываем форму и завершаем приложение Close (); } // Обработчик нажатия кнопки Отмена private void cancelButtonClick(object sender, EventArgs e) { // Просто завершаем приложение, не сохраняя изменения Close (); } }Листинг 4.15.
Как говорилось в начале лекции, диалоговое окно настроек хранителя экрана должно отображаться в 3-х случаях:
- Если приложение запущено без параметров.
- Если приложение запущено с ключом /C.
- Если приложение запущено с параметром вида /C:n, где n - дескриптор диалогового окна Display Properties. Например, /C:299792.
Для начала, мы можем попробовать добавить в функцию Main статического класса Program следующий код:
static void Main() { // Если приложение запущено без параметров или первый параметр начинается на "/C" if ((args.Length == 1) || ((args.Length == 2) && (args [1] .Length >= 2) && (args [1] .ToUpper () .Substring(0, 3) == "/C"))) { // Отображаем диалоговое окно Application.Run(new SettingsForm()); return; } }Листинг 4.16.
В принципе, подобный подход является вполне работоспособным, если не считать одной особенности: диалоговое окно может появиться на совершенно другом конце экрана (и даже на другом мониторе) относительно окна Display Properties. Для хранителя экрана, сделанного на профессиональном уровне, такое поведение не допустимо, поэтому нам необходимо решить данную проблему.
увеличить изображение
Рис. 4.8. Начальное положение диалоговое окна Параметры не связано с текущим положением окна Display Properties