Unit Controls;

interface
uses Windows, Messages;
var
  hParentWnd: HWND;   //Окно, в котором расположены элементф управления
  hAppInst: Cardinal; 

//Функции создания элементов упраления
function CreateButton(x, y, width, height, id:Integer; caption : String):HWND;
function CreateCheck(x, y, width, height, id: Integer; caption: String;
                     checked: Boolean = False):HWND;
function CreateOption(x, y, width, height, id: Integer; caption: String;
                     group: Boolean = False; checked: Boolean = False):HWND;
function CreateFrame(x, y, width, height, id: Integer; caption: String):HWND;
function CreateCombo(x, y, width, height, id: Integer):HWND;
function CreateList(x, y, width, height, id: Integer):HWND;
function CreateLabel(x, y, width, height, id: Integer; caption: String):HWND;
function CreateEdit(x, y, width, height, id: Integer;
                    strInitText: String = ''):HWND;
function CreateMemo(x, y, width, height, id: Integer;
                    strInitText: String = ''):HWND;

//Процедуры для работы с элементапи управления
procedure AddToCombo(id: Integer; str: String);
procedure AddToList(id: Integer; str: String);
procedure SetEditText(id: Integer; str: String);

implementation
//...создание кнопки
function CreateButton(x, y, width, height, id:Integer; caption : String):HWND;
begin
  CreateButton :=
   CreateWindow('BUTTON', PAnsiChar(caption), WS_CHILD or WS_VISIBLE or
                BS_PUSHBUTTON or WS_TABSTOP, x, y, width, height, hParentWnd,
                HWND(id), hAppInst, nil);
end;
//...создание флажка (с установкой параметра по умолчанию)
function CreateCheck(x, y, width, height, id: Integer; caption: String;
                     checked: Boolean = False):HWND;
var
  res: HWND;
begin
  res :=
   CreateWindow('BUTTON', PAnsiChar(caption), WS_CHILD or WS_VISIBLE or
                BS_AUTOCHECKBOX, x, y, width, height, hParentWnd, HWND(id),
                hAppInst, nil);
  if ((res <> 0) and checked) then
    SendMessage(res, BM_SETCHECK, BST_CHECKED, 0); //Флажок поставлен
  CreateCheck := res;
end;
//...создание переключателя (с установкой параметра по умолчанию)
function CreateOption(x, y, width, height, id: Integer; caption: String;
                     group: Boolean = False; checked: Boolean = False):HWND;
var
  res: HWND;
  nGroup: Integer;
begin
  if (checked) then nGroup := WS_GROUP else nGroup := 0;
  res :=
   CreateWindow('BUTTON', PAnsiChar(caption), WS_CHILD or WS_VISIBLE or
                BS_AUTORADIOBUTTON or nGroup, x, y, width, height, hParentWnd,
                HWND(id), hAppInst, nil);
  if ((res <> 0) and checked) then
    SendMessage(res, BM_SETCHECK, BST_CHECKED, 0); //Флажок поставлен
  CreateOption := res;
end;
//...создание рамки (для группировки элементов управления)
function CreateFrame(x, y, width, height, id: Integer; caption: String):HWND;
begin
  CreateFrame:=
   CreateWindow('BUTTON', PAnsiChar(caption), WS_CHILD or WS_VISIBLE or
                BS_GROUPBOX, x, y, width, height, hParentWnd,
                HWND(id), hAppInst, nil);
end;
//...создание раскрывающегося списка (ComboBox)
function CreateCombo(x, y, width, height, id: Integer):HWND;
begin
  CreateCombo:=
   CreateWindow('COMBOBOX', nil, WS_CHILD or WS_VISIBLE or CBS_DROPDOWN
                or CBS_AUTOHSCROLL,
                x, y, width, height, hParentWnd,
                HWND(id), hAppInst, nil);
end;
//...создание списка (ListBox)
function CreateList(x, y, width, height, id: Integer):HWND;
begin
  CreateList:=
   CreateWindowEx(WS_EX_CLIENTEDGE, 'LISTBOX', nil, WS_CHILD or WS_VISIBLE or LBS_NOTIFY or
                WS_BORDER ,
                x, y, width, height, hParentWnd,
                HWND(id), hAppInst, nil);
end;
//...создание надписи
function CreateLabel(x, y, width, height, id: Integer; caption: String):HWND;
begin
  CreateLabel:=
   CreateWindow('STATIC', PAnsiChar(caption), WS_CHILD or WS_VISIBLE,
                x, y, width, height, hParentWnd,
                HWND(id), hAppInst, nil);
end;
//...создание текстового поля (однострочного)
function CreateEdit(x, y, width, height, id: Integer;
  strInitText: String = ''):HWND;
begin
  CreateEdit:=
   CreateWindow('STATIC', PAnsiChar(strInitText), WS_CHILD or WS_VISIBLE
                or ES_AUTOHSCROLL,
                x, y, width, height, hParentWnd,
                HWND(id), hAppInst, nil);
end;
//...создание текстового поля (многострочного)
function CreateMemo(x, y, width, height, id: Integer;
  strInitText: String = ''):HWND;
begin
  CreateMemo:=
   CreateWindow('EDIT', PAnsiChar(strInitText), WS_CHILD or WS_VISIBLE
                or ES_AUTOVSCROLL or ES_MULTILINE or WS_BORDER,
                x, y, width, height, hParentWnd,
                HWND(id), hAppInst, nil);
end;

//...процедуры добавления строк в списки
procedure AddToCombo(id: Integer; str: String);
begin
  SendDlgItemMessage(hParentWnd, id, CB_ADDSTRING, 0, Integer(PAnsiChar(str)));
end;
procedure AddToList(id: Integer; str: String);
begin
  SendDlgItemMessage(hParentWnd, id, LB_ADDSTRING, 0, Integer(PAnsiChar(str)));
end;
//...установка текста элемента управления Edit или Memo
procedure SetEditText(id: Integer; str: String);
begin
  SetWindowText(GetDlgItem(hParentWnd, id), PAnsiChar(str));
end;
end.
