Чтение онлайн

на главную - закладки

Жанры

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
в данном случае просто как удобный способ представления размера формы для вывода в поле списка.

Поделиться:
Популярные книги

Кодекс Крови. Книга ХVI

Борзых М.
16. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Крови. Книга ХVI

Калибр Личности 1

Голд Джон
1. Калибр Личности
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Калибр Личности 1

Усадьба леди Анны

Ром Полина
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Усадьба леди Анны

Искатель 1

Шиленко Сергей
1. Валинор
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Искатель 1

Студиозус

Шмаков Алексей Семенович
3. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Студиозус

Вернуть невесту. Ловушка для попаданки

Ардова Алиса
1. Вернуть невесту
Любовные романы:
любовно-фантастические романы
8.49
рейтинг книги
Вернуть невесту. Ловушка для попаданки

Восход. Солнцев. Книга I

Скабер Артемий
1. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга I

Вечный. Книга I

Рокотов Алексей
1. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга I

Вторая жизнь

Санфиров Александр
Фантастика:
боевая фантастика
альтернативная история
6.88
рейтинг книги
Вторая жизнь

Клан

Русич Антон
2. Долгий путь домой
Фантастика:
боевая фантастика
космическая фантастика
5.60
рейтинг книги
Клан

Снегурка для опера Морозова

Бигси Анна
4. Опасная работа
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Снегурка для опера Морозова

Законы Рода. Том 7

Flow Ascold
7. Граф Берестьев
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Законы Рода. Том 7

Месть бывшему. Замуж за босса

Россиус Анна
3. Власть. Страсть. Любовь
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Месть бывшему. Замуж за босса

Цеховик. Книга 1. Отрицание

Ромов Дмитрий
1. Цеховик
Фантастика:
попаданцы
альтернативная история
5.75
рейтинг книги
Цеховик. Книга 1. Отрицание