Скачать книгу

:= 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).

Листинг 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: //Выбор

Скачать книгу