\'Стандартные окна 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).
...
Листинг 2.34.
Функция обработки сообщений
function WindowFunc(hWnd:HWND; msg:UINT; wParam:WPARAM;
lParam:LPARAM):LRESULT; stdcall;
var
hOldFont: HFONT;
strBuf: String;
hEditDC: HDC;
begin
case msg of
WM_CLOSE:
if (hWnd = hMainWnd) then PostQuitMessage(0);
WM_CTLCOLOREDIT: //Сообщения от Edit перед перерисовкой
begin
//Зададим тексту Edit выбранный цвет
hEditDC := HDC(wParam);
SetTextColor(hEditDC, curColor);
GetCurrentObject(hEditDC, OBJ_BRUSH);
end;
WM_COMMAND:
if (HIWORD(wParam) = BN_CLICKED) then
begin
//Определим, какая кнопка нажата
case LOWORD(wParam) of
1001: //Открытие файла
begin
SetText(2001, \'Открыт файл:\' + #13 + #10 +
ShowOpen(\'Все файлы|*.*||\'));
end;
1002: //Сохранение файла
begin
SetText(2001, \'Путь для сохранения:\' + #13 + #10 +
ShowSave(\'Все файлы|*.*||\'));
end;
1003: //Выбор цвета
begin
curColor := ShowChooseColor(curColor);
Str(curColor, strBuf);
SetText(2001, \'Выбранный цвет:\' + #13 + #10 + strBuf);
end;
1004: //Выбор шрифта
begin
if (ShowChooseFont(font) = True) then
begin
//Замена шрифта в Edit
hOldFont := HFONT(
SendDlgItemMessage(hMainWnd,2001,WM_GETFONT, 0,0));
hCurFont := CreateFontIndirect(font);
SendDlgItemMessage(hMainWnd, 2001, WM_SETFONT,
Integer(hCurFont),
Integer(True));
SetText(2001, \'Текст, записанный выбранным
шрифтом\');
if (hOldFont <> 0) then DeleteObject(hOldFont);
end;
end;
1010: //Выбор папки
begin
SetText(2001, \'Выбранная папка:\' + #13 + #10 +
ShowChooseFolder());
end;
1011: //Подключение сетевого ресурса
begin
ShowConnection();
end;
1012: //Отключение сетевого ресурса
begin
ShowDisconnect();
end;
1013: //Окно «О программе»
begin
ShowAbout(\'Standart windows\',
\'Демонстрация использования стандартных \' +
\'окон диалога из чистого API-приложения\');
end;
end;
end;
else
begin
//Обработка по умолчанию
WindowFunc := DefWindowProc(hWnd, msg, wParam, lParam);
Exit;
end;
end;
WindowFunc := S_OK; //Сообщение обработано
end;
Обработка сообщений здесь довольно проста, за исключением изменения шрифта текстового поля. Обратите внимание на следующий отрывок листинга 2.34:
...
//Замена шрифта в Edit
hOldFont := HFONT(SendDlgItemMessage(hMainWnd,2001,WM_GETFONT, 0,0));
Читать дальше
Конец ознакомительного отрывка
Купить книгу