Программирование в Delphi. Трюки и эффекты - страница 28
LoadIcon(0, IDI_ASTERISK));
end;
Правда, в окне О программе Windows XP на информацию о приложении отведено всего две строки (и место для значка). Все остальное место занимают информация о регистрации операционной системы и фирменная эмблема Microsoft Windows XP.
Демонстрационное приложение
Теперь пришла очередь рассмотреть небольшое приложение, использующее описанные выше окна (проект StandartWindows). Окно этого приложения показано на рис. 2.8.
Рис. 2.8. Окно демонстрационного приложения
Размер EXE-файла приложения равен 22 Кбайт.
В листинге 2.33 приведены объявления используемых глобальных переменных, код, реализующий создание окна и элементов управления в нем, а также цикл обработки сообщений (файл StandartWindows.dpr). Функции работы с рассмотренными выше окнами вынесены в отдельный модуль StdWindows (файл StdWindows.pas).
В листингах 2.33-2.34 используются уже знакомые вам функции из модуля Controls.
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(2 0, 20, 200, 30, 1001, 'Открытие файла');
CreateButton(2 0, 60, 200, 30, 1002, 'Сохранение файла');
CreateButton(2 0, 100, 200, 30, 1003, 'Выбор цвета');
CreateButton(2 0, 140, 200, 30, 1004, 'Выбора шрифта');
CreateButton(2 0, 180, 200, 30, 1005, 'Окно поиска текста');
CreateButton(2 0, 22 0, 200, 30, 1006, 'Окно поиска и замены');
CreateButton(23 0, 20, 22 0, 30, 1010, 'Выбор папки');
CreateButton(23 0, 60, 22 0, 30, 1011, 'Подключение сетевого ресурса');
CreateButton(23 0, 100, 22 0, 30, 1012, 'Отключение сетевого ресурса');
CreateButton(23 0, 140, 22 0, 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.