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

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


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

True);

      CreateOption(2 10, 100, 180, 20, 3001, 'Переключатель 1', True);

      CreateOption(2 10, 130, 180, 20, 3002, 'Переключатель 2', False, True);

      CreateOption(2 10, 160, 180, 20, 3003, 'Переключатель 3', True);

      CreateFrame(420, 10, 300, 180, –1, 'Списки и статические надписи');

      CreateLabel(430, 30, 70, 20, -1, 'Надпись');

      CreateCombo(510, 30, 200, 100, 4001);

      CreateList(430, 60, 280, 120, 5001);

      CreateFrame(2 00, 200, 200, 240, –1, 'Текстовые поля');

      CreateEdit(2 10, 22 0, 180, 20, 6001, 'Текст в текстовом поле');

      CreateMemo(2 10, 25 0, 180, 180, 6002, 'Текст в многострочном'+ #13

      + #10 + 'текстовом поле');

      //Добавление строк в списки

      AddToCombo(4001, 'Строка 1');

      AddToCombo(4001, 'Строка 2');

      AddToCombo(4001, 'Строка 3');

      AddToList(5 001, 'Строка 1');

      AddToList(5 001, 'Строка 2');

      AddToList(5 001, 'Строка 3');

      ShowWindow(hMainWnd, SW_NORMAL);

      //Запуск цикла обработки сообщений

      while (Longint(GetMessage(mess, 0, 0, 0)) <> 0)

      do begin

      TranslateMessage(mess);

      DispatchMessage(mess);

      end;

      end.

      Код листинга 2.21 заодно демонстрирует использование некоторых из приведенных ранее функций работы с элементами управления. Выглядит созданное окно так, как показано на рис. 2.3.

      Рис. 2.3. Окно с элементами управления

      Принцип построения функции обработки сообщений для этого окна описан в листинге 2.22.

Листинг 2.22. Функция обработки сообщений

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

      function WindowFunc(hWnd:HWND; msg:UINT;

      wParam:WPARAM; lParam:LPARAM):LRESULT; stdcall;

      var

      ps: PAINTSTRUCT;

      begin

      case msg of

      WM_PAINT:

      begin

      //Перерисовка содержимого окна

      BeginPaint (hWnd, ps);

      Text Out (ps.hdc, 10, 10, 'Текст в окне', 12);

      EndPaint(hWnd, ps);

      end;

      WM_CLOSE:

      if (hWnd = hMainWnd) then

      PostQuit Message(0); //При закрытии этого окна завершается

      //приложение

      WM_COMMAND:

      begin

      case LOWORD(wParam) of

      //нажата "Кнопка 1"

      1001: if HIWORD(wParam) = BN_CLICKED then;

      //нажата "Кнопка 2"

      1002: if HIWORD(wParam) = BN_CLICKED then;

      //установлен "Флажок 1"

      2001: if HIWORD(wParam) = BN_CLICKED then;

      //установлен "Флажок 2"

      2002: if HIWORD(wParam) = BN_CLICKED then;

      //установлен "Переключатель 1"

      3001: if HIWORD(wParam) = BN_CLICKED then;

      //установлен "Переключатель 2"

      3002: if HIWORD(wParam) = BN_CLICKED then;

      //установлен "Переключатель 3"

      3003: if HIWORD(wParam) = BN_CLICKED then;

      //выделение в ComboBox

      4001: if HIWORD(wParam) = CBN_SELCHANGE then;

      //выделение в ListBox

      5001: if HIWORD(wParam) = LBN_SELCHANGE then;

      //изменен текст в Edit

      6001: if HIWORD(wParam) = EN_CHANGE then;

      //изменен текст в Memo

      6002: if HIWORD(wParam) = EN_CHANGE then;

      end;

      end;

      else

      begin

      //Обработка по умолчанию

      WindowFunc:= DefWindowProc(hWnd, msg, wParam, lParam);

      Exit;

      end;

      end;

      WindowFunc:= S_OK; //Сообщение обработано

      end;

      Приведенная в листинге 2.22 функция не претендует на то, чтобы быть эталоном в порядке классификации сообщений от элементов управления. Иногда бывает полезно сразу классифицировать сообщения не по элементам управления, которые их прислали, а по типу самих сообщений. К тому же в ряде случаев можно предусмотреть один обработчик сообщений сразу для нескольких элементов управления, например, для группы переключателей. В таком случае полезным окажется параметр lParam сообщения WM COMMAND.

      Кстати, размер исполняемого файла этого приложения равен всего 19 Кбайт.

      Стандартные окна Windows

      Теперь рассмотрим,