Глава 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.