C# для профессионалов. Том II
Шрифт:
Следующий ключ для перехода —
HKLM/Software/WroxPress
, но так как мы не уверены, что ключ уже существует, то используем CreateSubKey
для его автоматического создания, если он не существует. Отметим, что CreateSubKey
автоматически предоставляет доступ для записи к рассматриваемому ключу. Когда мы достигнем HKLM/Software/Wrox
. Press/SelfPlacingWindow
, то останется просто вызвать метод RegistryKey.SetValue
несколько раз, чтобы создать или задать соответствующие значения. Существуют, однако, некоторые осложнения. Первое. Можно заметить что мы задействуем пару классов, которые раньше не встречались:
DeskTopPosition
класса Form
указывает позицию верхнего левого угла экрана и имеет тип Point
. Рассмотрим структуру Point
в главе GDI+. Здесь необходимо знать только, что она содержит два целых числа — X
и Y
, которые представляют горизонтальную и вертикальную позиции на экране. Мы также используем три свойства члена класса Color
: R
, G
и B
. Color
представляет цвет, а его свойства задают красный, зеленый и синий компоненты, которые составляют цвет и имеют тип byte
. Также применяется свойство Form
. WindowState
, содержащее перечисление, которое задает текущее состояние окна — minimized
, maximized
или restored
. Отметим, что при преобразовании типов
SetValue
получает два параметра: строку, которая задает имя ключа, и экземпляр System.Object
, содержащий значение. SetValue
имеет возможность выбора формата для хранения значения, он может сохранить его как REG_SZ
, REG_BINARY
или REG_DWORD
, и он в действительности делает правильный выбор в зависимости от заданного типа данных. Поэтому для WindowsState
передается строка и SetValue
определяет, что она должна быть преобразована в REG_SZ
. Аналогично для различных позиций и размеров, которые мы передаем, целые значения будут преобразованы в REG_DWORD
. Однако компоненты цвета являются более сложными, но мы хотим, чтобы они также хранились как REG_DWORD
, потому что они имеют числовые типы. Однако если метод SetValue
видит, что данные имеют тип byte
, он будет сохранять их гак строку REG_SZ
в реестре. Чтобы избежать этого, преобразуем компоненты цвета в int
. Мы также явно преобразуем все значения в тип
object
. На самом деле мы не обязаны этого делать, так как преобразование из любого типа данных в тип object
выполняется неявно, но мы делаем это, чтобы в действительности показать происходящее и напомнить, что SetValue
определен для получения объектной ссылки в качестве второго параметра. Метод
ReadSettings
немного длиннее, так как каждое считанное значение нужно также проинтерпретировать, чтобы вывести значение в окне списка и сделать подходящие изменения в соответствующем свойстве основной формы. ReadSettings
выглядит следующим образом: bool ReadSettings {
RegistryKey SoftwareKey = Registry.LocalMachine.OpenSubKey("Software"));
RegistryKey WroxKey = SoftwareKey.OpenSubKey("WroxPress");
if (WroxKey == null) return false;
RegistryKey SelfPlacingWindowKey = WroxKey.OpenSubKey("SelfPlacingWindow");
if (SelfPlacingWindowKey == null) return false;
else
listBoxMessages.Items.Add("Successfully opened key " + SelfPlacingWindowKey.ToString);
int RedComponent = (int)SelfPlacingWindowKey.GetValue("Red");
int GreenComponent = (int)SelfPlacingWindowKey.GetValue("Green");
int BlueComponent = (int)SelfPlacingWindowKey.GetValue("Blue");
BackColor = Color.FromArgb(RedComponent, GreenComponent, BlueComponent);
listBoxMessages.Items.Add("Background color: " + BackColor.Name);
int X = (int(SelfPlacingWindowKey.GetValue("X");
int Y = (int)SelfPlacingWindowKey.GetValue("Y");
DesktopLocation = new Point(X, Y);
listBoxMessages.Items.Add("Desktop location: " + DesktopLocation.ToString);
Height = (int)SelfPlacingWindowKey.GetValue("Height");
Width = (int)SelfPlacingWindowKey.GetValue("Width");
listBoxMessages.Items.Add("Size: " + new Size(Width, Height).ToString);
string InitialWindowState = (string)SelfPlacingWindowKey.GetValue("WindowState");
listBoxMessages.Items.Add("Window State: " + InitialWindowState);
WindowState =
(FormWindowState)FormWindowState.Parse(WindowState.GetType , InitialWindowState)
return true;
}
В
ReadSettings
HKLM/Software/WroxPress/SelfPlacingWindow
. При этом, однако, мы надеемся найти ключ, чтобы его можно было прочитать. Если его нет, то, вероятно, пример выполняется в первый раз. В этом случае мы хотим прервать чтение ключей, и, конечно, не желаем создавать какие-либо ключи. Теперь мы все время используем метод RegistryKey.OpenSubkey
. Если на каком-то этапе OpenSubkey
возвращает ссылку null, то мы знаем, что ключ реестра отсутствует, и можем вернуть значение false
в вызывающий код. В реальности для считывания ключей используется метод
RegistryKey.GetValue
, который определен как возвращающий объектную ссылку, это означает, что такой метод может на самом деле вернуть экземпляр практически любого класса, который он выберет подобно SetValue
, он возвращает класс объекта, соответствующий типу данных, которые он найдет в ключе. Поэтому можно предполагать, что ключ REG_SZ
будет выдан как строка, а другие ключи — как int
. Мы также преобразуем соответственно возвращаемую из SetValue
ссылку. При возникновении исключения, если кто-то делал какие-то манипуляции с реестром и исказил типы данных, наше преобразование породит исключение, которое будет перехватываться обработчиком в конструкторе Form1
. Остальная часть кода использует еще один тип данных, структуру
Size
, выглядящую пока незнакомой, потому что она будет рассматриваться только в главе GDI+. Структура Size
аналогична Point
, но используется для представления размеров, а не координат. Она имеет два свойства члена — Width
и Height
, и мы используем структуру Size
в данном случае просто как удобный способ представления размера формы для вывода в поле списка.
Поделиться:
Популярные книги
Дворянская кровь
1. Дворянская кровь
Фантастика:
попаданцы
альтернативная история
7.00
рейтинг книги
Газлайтер. Том 16
16. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Барон диктует правила
4. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Стрелок
5. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Шатун. Лесной гамбит
2. Шатун
Фантастика:
боевая фантастика
7.43
рейтинг книги
Проклятый Лекарь V
5. Каратель
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
На границе империй. Том 3
3. Фортуна дама переменчивая
Фантастика:
космическая фантастика
5.63
рейтинг книги
Новый Рал
1. Рал!
Фантастика:
фэнтези
попаданцы
5.70
рейтинг книги
Его наследник
1. Наследники Сильных
Любовные романы:
современные любовные романы
эро литература
5.87
рейтинг книги
Венецианский купец
1. Венецианский купец
Фантастика:
фэнтези
героическая фантастика
альтернативная история
7.31
рейтинг книги
Мастер темных Арканов
1. Мастер темных арканов
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Всплеск в тишине
5. Венецианский купец
Фантастика:
попаданцы
альтернативная история
5.33
рейтинг книги
Начальник милиции
1. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Возвышение Меркурия. Книга 2
2. Меркурий
Фантастика:
фэнтези
5.00