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

id), PAnsiChar(str));

      end;

      //Получение текста окна

      function GetText(id: Integer): String;

      var buffer: String;

      begin

      SetLength(buffer, GetWindowTextLength(hParentWnd));

      GetWindowText(hParentWnd, PAnsiChar(buffer), Length(buffer));

      GetText := buffer;

      end;

      //Активизация/деактивизация окна

      procedure SetEnabled(id: Integer; fEnabled: BOOL);

      begin

      EnableWindow(GetDlgItem(hParentWnd, id), fEnabled);

      end;

      Реакция на события элементов управления

      При возникновении какого-либо предусмотренного для элемента управления события родительскому окну посылается сообщение WM_COMMAND.

      Примечание

      Сообщение WM_COMMAND приходит также при перерисовке так называемых «самоперерисовывающихся» (Owner Dr aw) элементов управления. Однако ввиду специфики данного вопроса и ограниченности объема г лавы мы его рассматривать не будем.

      Итак, когда родительское окно получает сообщение WM_COMMAND, то из двух прилагающихся параметров (lParam и wParam) можно извлечь следующие сведения:

      • старшие 16 бит wParam представляют собой целочисленный код уведомления, позволяющий определить, что же именно произошло с элементом управления;

      • младшие 16 бит wParam представляют собой идентификатор элемента управления, состояние которого изменилось (именно этот идентификатор мы передавали вместо дескриптора меню при создании элементов управления);

      • lParam содержит дескриптор (HWND) окна элемента управления, состояние которого изменилось.

      Для выделения старших 16 бит из 32-битного значения можно использовать функцию HiWord. Для получения младших 16 бит можно использовать функцию с именем LoWord. Обе они объявлены в модуле Windows.

      В качестве примеров можно привести следующие коды уведомлений:

      • BN_CLICKED – нажата кнопка;

      • EN_CHANGE – изменен текст в текстовом поле;

      • LBN_SELCHANGE – изменилось выделение в списке;

      • CBN_SELCHANGE – изменилось выделение в раскрывающемся списке.

      Эти и все остальные константы уведомлений стандартных элементов управления объявлены в модуле Messages.

      Примечание

      Коды уведомлений рассматриваемых в этой г лаве элементов управления приводятся в приложении 3.

      Пример приложения

      Рассмотрим небольшой пример, иллюстрирующий принцип работы с элементами управления, помещенными на форму описанным ранее способом. Проект этого приложения называется ControlsDemo.

      Не будем заострять внимание на регистрации класса главного окна приложения, так как она аналогична приведенной в листинге 2.4. Рассмотрим создание окна с элементами управления в нем (листинг 2.21).

Листинг 2.21. Создание главного окна приложения (с элементами управления)

      program ControlsDemo;

      uses

      Windows, Messages,

      Controls in 'Controls.pas';

      {$R *.res}

      var

      hMainWnd: HWND;

      hInst: Cardinal;

      mess: MSG;

      //Функция обработки сообщений

      …

      //Создание окна и цикла обработки сообщений

      begin

      hInst := GetModuleHandle(nil);

      //Регистрация и создание главного окна

      if not RegisterWindow() then Exit;

      hMainWnd := CreateWindow(

      'MyWindowClass', //Имя класса окна

      'Главное окно', //Заголовок окна

      WS_OVERLAPPEDWINDOW,

      CW_USEDEFAULT, //Координата X по умолчанию

      CW_USEDEFAULT, //Координата Y по умолчанию

      CW_USEDEFAULT, //Ширина по умолчанию

      CW_USEDEFAULT, //Высота по умолчанию

      HWND(nil),

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