Создание и показ элементов управления Windows

Основные понятия
Пример:Текстовый редактор
Стили элементов управления
Основные понятия
На ряду с созданием окна, вы можете создавать на этом окне элементы управления: кнопки, окна для ввода тектста, списков и т.д. Процесс создания и показа почти такой же, как процесс создания окна, за исключением одного: Вам не нужно описывать и регистрировать класс окна, что существенно упрощает задачу (все эти классы уже зарегистрированы в Windows). Соответственно, чтобы создать элемент, нужно вызвать функцию CreateWindow(), с несколькими нюансами: в качестве имени класса указывается имя одного из зарегистрированных в Windows классов:BUTTON, EDIT, LISTBOX, COMBOBOX,SCROLLBAR,STATIC. Может быть это не всё, ведь Билл Гейтс не говорит нам о своей "великолепной" ОС, но для начинающих этого достаточно. Нужно добавить, что каждый из этих классов имеет свои стили отображения, которые соответственно должны передаваться в параметр dwStyle функции CreateWindow(). И самая главная поправка: в параметр hWndParent передается индентификатор вашего окна (хотя можно и не вашего), который вы получили когда создавали окно.
Примеры
LSearch:=CreateWindow('STATIC','Текст',WS_CHILD or WS_VISIBLE or SS_CENTER,3,2,86,16,HWnd,0,hInstance,0);
'STATIC'-название класса, который отображает надпись.
'Текст' - тот текст, который будет в надписе.
SS_CENTER - это один из стилей класса STATIC (выравнивает текст по центру).
Остальное должно быть понятно, за исключением HWnd-это и есть индентификатор окна, которое будет приобретать данный компонент.
Конечно, вы можете использовать и другие параметры при создании окна (это те, в которые у меня передается 0 (ноль)), к примеру привязать а вашему компоненту меню.Но о меню мы поговорим позже. А покачто давайте создадим маленький текстовой редактор с использованием класса EDIT
Для этого воспользуемся примером из предыдущей статьи, который будем использовать как шаблон.
program Dir;
uses
 Windows,
  Messages,
  shellapi;

const
  sClassName = 'sHandlerWindow';  // Имя класса окна
var
  hWnd,HWndEdit: THandle;
  WndClass: TWndClass;
  Msg: TMsg;

function WindowProc(hWnd: THandle; uMsg, wParam, lParam: Integer): Integer;//Обо всём об этом было объяснено в прошлой статье
  stdcall; export;
begin
  Result := 0;
    case uMsg of
    WM_DESTROY:
      begin
        halt(0);
      end;
  end;
  Result := DefWindowProc(hWnd, uMsg, wParam, lParam);
end;

begin
  FillChar(WndClass, SizeOf(WndClass), 0);
  with WndClass do begin
    hInstance      := SysInit.hInstance;
    lpszClassName  := sClassName;
    lpfnWndProc    := @WindowProc;
    hbrBackground      := GetStockObject(LTGRAY_BRUSH);
    end;
  RegisterClass(WndClass);
  hWnd := CreateWindow(sClassName, '', WS_OVERLAPPEDWINDOW, 200, 200, 300, 300, 0, 0, hInstance, NIL);
  HWndEdit:=CreateWindowEx(WS_EX_CLIENTEDGE, 'Edit', 'Ваш текст', WS_CHILD or WS_VISIBLE or ES_MULTILINE or ES_AUTOHSCROLL or ES_AUTOVSCROLL or WS_HSCROLL or WS_VSCROLL, 3, 18, 220, 100, hWnd, 0, hInstance, nil); 
{А вот последняя строка и есть создание компонента EDIT: заметьте, что я использую функцию CreateWindowEx , чтобы использовать расширенный стиль WS_EX_CLIENTEDGE (в остальном она соответствует функции CreateWindow. Стиль WS_EX_CLIENTEDGE делает компонент трехмерным. Далее идет указание класса (сравните: когда мы создавали окно, мы использовали собственное имя класса, хранящееся в переменной sClassName, а сейчас мы используем имя класса, зарегистрированного в ОС), следующий параметр-это тест по умолчанию, который может буть редактирован пользователем. Далее идет указание стилей компонента: помните, что у каждого компонента свой список стилей, но каждый компонент может вызывать стили окон (это те стили, что начинаются на WS).Подробней о стилях. Параметры положения компонента и его размеры задаются у всех компонентов. Так как мы создаем компонент, привязанный к нашему окну, то мы должны параметру Parent присвоить индентификатор родителя - hWnd , что и делается в девятом параметре.}
//Все отальное объяснялось в предыдущей статье
  if hWnd = 0 then begin
    MessageBox(0, 'Initialisation failed', NIL, ID_OK);
    Exit;
  end;
  ShowWindow(hWnd, SW_normal);
   while GetMessage(Msg, HWnd, 0, 0) do begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
   Halt(Msg.wParam);
end.
Итак, давайте запустим всё это. Перед вами должно появиться окошечко, с компонентом, в который можно вводить текст. Заметьте, что текст можно копировать/вставлять из/в буфер.
Сайт создан в системе uCoz