Александр Чиртик

Программирование в Delphi. Трюки и эффекты


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

текста окна

      procedure SetText(id: Integer; str: String);

      begin

      SetWindowText(GetDlgItem(hParentWnd, 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 Draw) элементов управления. Однако ввиду специфики данного вопроса и ограниченности объема главы оно рассматриваться не будет.

      Таким образом, когда родительское окно получает сообщение 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, //Ширина по