Функция MessageBoxQ
WINDEF.H. Почти все эти константы являются синонимами. Примерное их определение приведено ниже:
#define PASCAL _stdcall #define CALLBACK PASCAL
Эти определения являются лишь указаниями компилировать функции в стиле Паскаля - с очисткой стека от параметров функцией, а не вызывающей программой.
Если указать модификаторы cdecl, WINAPIV, то вызов функции будет компилироваться в стиле языка С. Стек будет очищен вызывающей программой. Порядок записи параметров в стек не зависит от модификатора. Первый параметр передается последним и потому оказывается в вершине стека.
Теперь следует рассмотреть параметры функции MessageBoxC). Первым параметром обычно указывается идентификатор, в котором возникло обращение к функции MessageBox(). Именно на него MessageBox() не позволит переводить фокус ввода щелчком мыши. Поскольку наше приложение никаких окон не создавало, этот параметр имеет значение NULL.
Вызов функции MessageBoxC) создает на экране изображение, показанное на рис. 1.3. Легко заметить, что второй параметр задает текст в рабочей области, а третий - текст в заголовке созданного окна. Значение последнего параметра (в первом вызове функции это MB_OKCANCEL | MB_ICONEXCLAMATION | MBJDEFBUTT0N1) представляет собой сочетание битовых флагов, определяющих стиль и свойства окна.
Появление флага MB_I CONEХСLАМАТI ON приводит к отображению в окне треугольника с восклицательным знаком. В результате использования флага MB_OKCANCEL в нижней части окна будут отображены две кнопки. Щелчок мышью по любой из них приведет к завершению функции MessageBox() и возврату в переменную I информации о нажатой кнопке. Одна кнопка выбрана по умолчанию. Если пользователь нажмет клавишу ENTER, это произведет такое же действие, как и щелчок по выбранной по умолчанию кнопке. По нажатии клавиши Tab рамка переместится на кнопку Отмена. Каждая кнопка - это тоже маленькое, дочернее по отношению к основному, окно. Поэтому можно считать, что пунктирная рамка отмечает, какому из дочерних окон принадлежит фокус ввода.