Листинг 2.33.
Глобальные переменные, код создания окна и цикл обработки сообщений
program StandartWindows;
{$R *.res}
uses
Windows, Messages, CommDlg,
Controls in \'Controls.pas\',
StdWindows in \'StdWindows.pas\
var
hMainWnd: HWND;
hInst: Cardinal;
mess: MSG;
curColor: COLORREF;
font: LOGFONT;
hCurFont: HFONT;
…
function RegisterWindow():Boolean;
…
begin
hInst := GetModuleHandle(nil);
//Регистрация и создание главного окна
if not RegisterWindow() then Exit;
hMainWnd := CreateWindow(
\'MyWindowClass\', //Имя класса окна
\'Стандартные окна Windows\', //Заголовок окна
WS_CAPTION or WS_SYSMENU or WS_CLIPCHILDREN or WS_CLIPSIBLINGS,
CW_USEDEFAULT, //Координата X по умолчанию
CW_USEDEFAULT, //Координата Y по умолчанию
470, 420,
HWND(nil), //Нет родительского окна
HMENU(nil), //Нет меню
hInst,
nil);
if (hMainWnd = HWND(nil)) then Exit;
//Инициализация модуля Controls для работы с главным
//окном приложения
Controls.hParentWnd := hMainWnd;
Controls.hAppInst := hInst;
//Инициализация модуля StdWindows для работы с главным
//окном приложения
StdWindows.hParentWnd := hMainWnd;
StdWindows.hAppInst := hInst;
//Создание кнопок для открытия диалоговых окон
CreateButton(20, 20, 200, 30, 1001, \'Открытие файла\');
CreateButton(20, 60, 200, 30, 1002, \'Сохранение файла\');
CreateButton(20, 100, 200, 30, 1003, \'Выбор цвета\');
CreateButton(20, 140, 200, 30, 1004, \'Выбор шрифта\');
CreateButton(20, 180, 200, 30, 1005, \'Окно поиска текста\');
CreateButton(20, 220, 200, 30, 1006, \'Окно поиска и замены\');
CreateButton(230, 20, 220, 30, 1010, \'Выбор папки\');
CreateButton(230, 60, 220, 30, 1011, \'Подключение сетевого
ресурса\');
CreateButton(230, 100, 220, 30, 1012, \'Отключение сетевого
ресурса\');
CreateButton(230, 140, 220, 30, 1013, \'Системное окно "О про-
грамме"\');
//Текстовое поле для результата
CreateMemo(20, 270, 430, 100, 2001);
ShowWindow(hMainWnd, SW_NORMAL);
//Запуск цикла обработки сообщений
while (Longint(GetMessage(mess, 0, 0, 0)) <> 0) do
begin
if (IsDialogMessage(hMainWnd, mess) = False) then
begin
TranslateMessage(mess);
DispatchMessage(mess);
end;
end;
end.
Код функции RegisterWindow опущен, так как он аналогичен приведенному в листинге 2.4. Функции работы с рассмотренными ранее диалоговыми окнами вынесены в модуль StdWindows (файл StdWindows. pas).
Особенностью цикла обработки сообщений в этом примере является использование API-функции IsDialogMessage, которая позволяет реагировать на некоторые действия пользователя так, как это делается в диалоговых окнах. Примером может быть перемещение фокуса между окнами при нажатии клавиши Tab.
Перед функцией RegisterWindow (на месте многоточия перед ее объявлением в листинге 2.33) находится функция обработки сообщений, имеющая следующий вид (листинг 2.34).