function CreateOption(x, y, width, height, id: Integer; caption: String;
group: Boolean; checked: Boolean):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 or WS_TABSTOP, x, y, width,
height, hParentWnd, HMENU(id), hAppInst, nil);
if ((res <> 0) and checked) then
//Переключатель установлен
SendMessage(res, BM_SETCHECK, BST_CHECKED, 0);
CreateOption:= res;
end;
Для создания подписанной рамки, группирующей элементы управления, можно воспользоваться функцией CreateFrame, приведенной в листинге 2.10.
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,
HMENU(id), hAppInst, nil);
end;
Для создания раскрывающегося списка (ComboBox) пригодится функция Create-Combo, приведенная в листинге 2.11.
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 or WS_TABSTOP, x, y, width, height,
hParentWnd, HMENU(id), hAppInst, nil);
end;
Для создания простого списка (ListBox) вполне подойдет функция CreateList, описанная в листинге 2.12.
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 or WS_TABSTOP, x, y, width,
height, hParentWnd, HMENU(id), hAppInst, nil);
end;
Функция CreateLabel, приведенная в листинге 2.13, создает статическую надпись (Label), предназначенную только для вывода текста.
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, HMENU(id), hAppInst, nil);
end;
Однострочное текстовое поле с привычной рамкой создается функцией CreateEdit (листинг 2.14).
function CreateEdit(x, y, width, height, id: Integer; strInitText: String):HWND;
begin
CreateEdit:=
CreateWindowEx(WS_EX_CLIENTEDGE, 'EDIT', PAnsiChar(strInitText),
WS_CHILD or WS_VISIBLE or ES_AUTOHSCROLL or WS_TABSTOP,
x, y, width, height, hParentWnd,
HMENU(id), hAppInst, nil);
end;
Код создания многострочного текстового поля (аналог Memo) отличается от кода создания однострочного поля только указанием дополнительного флага ES_MULTILINE (листинг 2.15).
function CreateMemo(x, y, width, height, id: Integer; strInitText: String):HWND;
begin
CreateMemo:=
CreateWindowEx(WS_EX_CLIENTEDGE, 'EDIT', PAnsiChar(strInitText),
WS_CHILD or WS_VISIBLE or ES_AUTOVSCROLL or ES_MULTILINE
or WS_TABSTOP, x, y, width, height, hParentWnd,
HMENU(id), hAppInst, nil);
end;
Приведенные здесь функции не претендуют на абсолютную универсальность и гибкость. Они введены для того, чтобы упростить создание элементов управления в тех частных случаях, которые будут приведены далее в примерах этой главы.
Использование элементов управления
Элементы управления, как и все окна, управляются путем отсылки им сообщений. Этим же способом они уведомляют родительские окна о некоторых произошедших событиях (например, выделении элемента в списке, нажатии кнопки и т. д.).
Описание наиболее используемых сообщений для рассматриваемых элементов управления приведено