Глава 31. Resource Workshop__________________________________881

Замечание

Сущность идеи "захвата ресурса при инициализации" состоит в том, что многие ресурсы, такие как, например, файлы, не могут быть использованы без их инициализации тем или иным способом. За инициализацию отвечает конструктор, а деструктор выполняет задачу высвобождения ресурса. Конструктор должен открыть файл, деструктор — закрыть, а оператор-функция должна обеспечить доступ к файловому указателю. Пользователю нет необходимости помнить о закрытии файла, поскольку деструктор сделает это, как только объект выйдет за пределы области видимости.

Программирование курсора с помощью Windows API. Вид активного курсора в Windows API устанавливается следующим способом, напоминающим стиль С:

HCURSOR hCursor;

hCursor == LoadCursor(hInst, IDC ARROW);

SetCursor(hCursor) ;

В первой строке определяется переменная HCURSOR, во второй* строке вызывается функция API LoadCursor, и в последней — вызывается функция SetCursor с дескриптором курсора в качестве аргумента, hinst — это дескриптор приложения, a IDC_ARROW — макрос, который заменяется препроцессором на MAKEINTRESOURCE (constant). В результате работы этого фрагмента активный курсор примет вид стрелки.

Совет

Использование префикса h характерно для так называемой венгерской нотации. Префикс перед именем переменной указывает на ее тип. Префикс h в имени hCursor указывает, что это дескриптор (handle). Дескрипторы обычно являются целыми числами. Особой необходимости перенимать такой стиль нотации нет, но ее желательно иметь в виду, поскольку в Windows API она широко используется.

В следующем разделе рассматривается фрагмент кода, который выполняет ту же задачу. Он использует функции OWL и демонстрирует более объектно-ориентированный подход.

Программирование курсора с помощью Borland OWL. В тех случаях, когда и в Windows API и в Borland OWL существуют аналогичные конструкции, предпочтительным является OWL. Windows API поддерживает программирование в стиле С, в то время как OWL использует объектно-ориентированный подход. OWL обеспечивает захват ресурса при его инициализации и приводит к более компактной записи:

GetMainWindow()->SetCursor(this, IDC_ARROW) ;

Функция GetMainwindow возвращает указатель на окно и вместо значения hinst использует указатель this. Здесь нет необходимости получать значение дескриптора курсора с помощью функции LoadCursor.