Если константа STRICT определена, то это будут указатели на данные типа «структура». Первая часть макроопределения DECLARE_HANDLE (name) опишет структуру struct HMENU_{i nt unused;}, имя которой сконструировано объединением параметра макроса и знаков подчеркивания.
Следующая часть макроопределения typedef struct name#_*name объявит указатель typedef struct HMENU_*HMENU на структуру HMENU_.
Поскольку имя типа структуры формируется макрокомандой при помощи операции слияния строк # из параметра name и знака подчеркивания, дескрипторы разного типа нельзя будет считать совместимыми по присваиванию. Таким образом, если в программе объявить переменные HWND hl и HMENU h2, то можно выполнить присваивание hl«h2. Но если предварительно объявить #define STRICT, такое присваивание будет квалифицироваться как ошибка этапа компиляции.
Для дальнейшего изложения потребуются типы данных POINT и RECT, которые определены в файле WINDEF.H. Определение структуры tagPOINT приведено ниже:
typedef struct tagPOINT
{
LONG x; LONG y; } POINT. *PP0INT;
Эта структура удобна для хранения координат точки. Также стоит обратить внимание на структуру tagRECT, которая применяется для задания прямоугольной области на экране. Ее определение тоже нельзя назвать сложным:
typedef struct tagRECT
{
LONG left; LONG top; LONG right: LONG bottom; } RECT. *PRECT;
Следует отметить, что Windows работает с процессорами, выполняющими логические и целочисленные операции с 32-разрядными ячейками. В старшем и младшем словах такой ячейки могут храниться не связанные между собой данные. Поэтому в файле windef.h определены и часто используются макрокоманды L0W0RDCх) и HIWORD(x), позволяющие получить младшее и старшее слово переменной х. Симметричный им макрос MAKELONGCa, b) объединяет два слова в одно двойное слово.
Для усвоения последующего материала следует самостоятельно познакомиться с функциями, перечисленными в следующем списке: О Функция ShowWindow(hWnd.CmdShow) производит с окном hWnd действия, определяемые константой CmdShow.