Программирование в Delphi. Трюки и эффекты. Александр Чиртик
Чтение книги онлайн.

Читать онлайн книгу Программирование в Delphi. Трюки и эффекты - Александр Чиртик страница 28

СКАЧАТЬ цикла обработки сообщений

      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(2 001, 'Открыт файл:'+ #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(2 001, 'Выбранная папка:'+ #13 + #10 +

      ShowChooseFolder());

      end;

      1011: //Подключение сетевого ресурса

      begin

      ShowConnection();

      end;

      1012: //Отключение сетевого ресурса

      begin

      ShowDisconnect();

      end;

      1013: //Окно "О программе"

      begin

      ShowAbout('Standart windows',

      'Демонстрация использования стандартных '+

      'окон из чистого СКАЧАТЬ