program ControlsDemo;
uses
  Windows, Messages,
  Controls in 'Controls.pas';
  {$R *.res}
var
  hMainWnd: HWND;
  hInst: Cardinal;
  mess: MSG;

//Функция обработки сообщений
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);
      TextOut(ps.hdc, 10, 10, 'Текст в окне', 12);
      EndPaint(hWnd, ps);
    end;
    WM_CLOSE:
      if (hWnd = hMainWnd) then
        PostQuitMessage(0);  //При закрытии этого окна зарершается приложение
    WM_COMMAND:
    begin
      case LOWORD(wParam) of
      1001: if HIWORD(wParam) = BN_CLICKED then {нажата "Кнопка 1"};
      1002: if HIWORD(wParam) = BN_CLICKED then {нажата "Кнопка 2"};
      2001: if HIWORD(wParam) = BN_CLICKED then {изменен "Флажок 1"};
      2002: if HIWORD(wParam) = BN_CLICKED then {изменен "Флажок 2"};
      3001: if HIWORD(wParam) = BN_CLICKED then {включен "Переключатель 1"};
      3002: if HIWORD(wParam) = BN_CLICKED then {включен "Переключатель 1"};
      3003: if HIWORD(wParam) = BN_CLICKED then {включен "Переключатель 1"};
      4001: if HIWORD(wParam) = CBN_SELCHANGE then {выделение в ComboBox};
      5001: if HIWORD(wParam) = LBN_SELCHANGE then {выделение в ListBox};
      6001: if HIWORD(wParam) = EN_CHANGE then {изменет текст в Edit};
      6002: if HIWORD(wParam) = EN_CHANGE then {изменет текст в Memo};
      end;
    end;
  else
  begin
    //Обработка по умолчанию
    WindowFunc := DefWindowProc(hWnd, msg, wParam, lParam);
    Exit;
  end;
  end;

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

function RegisterWindow():Boolean;
var
  wcx: WNDCLASSEX;
begin
  ZeroMemory(Addr(wcx), SizeOf(wcx));
  //Формирование информации о классе окна
  wcx.cbSize := SizeOf(wcx);
  wcx.hInstance := hInst;
  wcx.hIcon := LoadIcon(0, IDI_ASTERISK);       //Стандартная иконка
  wcx.hIconSm := wcx.hIcon;
  wcx.hCursor := LoadCursor(0, IDC_ARROW);      //Стандартный курсор
  wcx.hbrBackground := COLOR_BTNFACE + 1;            //Стандартный для окна цвет
  wcx.style := 0;
  wcx.cbClsExtra := 0;
  wcx.cbWndExtra := 0;

  //..самые важные параметры
  wcx.lpszClassName := 'MyWindowClass'; //Название класса
  wcx.lpfnWndProc := Addr(WindowFunc);  //Адрес функции обработки сообщений

  //Регистрация класса окна
  RegisterWindow := RegisterClassEx(wcx) <> 0;
end;

begin
  hInst :=   GetModuleHandle(nil);

  //Регистрация и создание главного окна
  if not RegisterWindow() then Exit;
  hMainWnd := CreateWindow(
    'MyWindowClass', //Имя класса окна
    'Главное окно',  //Заголовок окна
    WS_OVERLAPPEDWINDOW or WS_CLIPSIBLINGS,
    CW_USEDEFAULT,   //Координата X по умолчанию
    CW_USEDEFAULT,   //Координата Y по умолчанию
    CW_USEDEFAULT,   //Ширина по умолчанию
    CW_USEDEFAULT,   //Высота по умолчанию
    HWND(nil),        //Нет родительского окна
    HMENU(nil),       //Нет меню
    hInst,
    nil);
  if (hMainWnd = HWND(nil)) then Exit;

  //Инициализация модуля Controls для работы с главным окном
  Controls.hParentWnd := hMainWnd;
  Controls.hAppInst := hInst;

  //Создание элементов управления
  CreateFrame(10, 80, 170, 70, -1, 'Кнопки');
  CreateButton(20, 100, 70, 30, 1001, 'Кнопка 1');
  CreateButton(100, 100, 70, 30, 1002,'Кнопка 2');

  CreateFrame(200, 10, 200, 180, -1, 'Флажки и переключатели');
  CreateCheck(210, 30, 180, 20, 2001, 'Флажок 1');
  CreateCheck(210, 60, 180, 20, 2002, 'Флажок 2', True);
  CreateOption(210, 100, 180, 20, 3001, 'Переключатель 1', True);
  CreateOption(210, 130, 180, 20, 3002, 'Переключатель 2', False, True);
  CreateOption(210, 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(200, 200, 200, 240, -1, 'Текстовые поля');
  CreateEdit(210, 220, 180, 20, 6001, 'Текст в текстовом поле');
  CreateMemo(210, 250, 180, 180, 6002, 'Текст в многострочном' + #13
                                      + #10 + 'текстовом поле');

  //Добавление строк в списки
  AddToCombo(4001, 'Строка 1');
  AddToCombo(4001, 'Строка 2');
  AddToCombo(4001, 'Строка 3');
  AddToList(5001, 'Строка 1');
  AddToList(5001, 'Строка 2');
  AddToList(5001, 'Строка 3');

  ShowWindow(hMainWnd, SW_NORMAL);

  //Запуск цикла обработки сообщений
  while (Longint(GetMessage(mess, 0, 0, 0)) <> 0)
  do begin
    TranslateMessage(mess);
    DispatchMessage(mess);
  end;
end.



