program WinApiWindows;
uses Windows, Messages;
const HBTN = 1; HLABEL = 2;
var
window: TWndClassex;
Form, Button, Label1, ChildForm: hwnd; //переменные для хендлов созданных объектов
mmsg: msg; // переменная для обработки сообщений
function windowproc(wnd: hwnd; msg: integer; wparam: wparam; lparam: lparam):lresult;stdcall;
begin
case msg of
wm_destroy:
begin
postquitmessage(0);
result := 0;
exit;
end;
WM_COMMAND:
begin
case LoWord( wParam ) of
HBTN:
begin
ChildForm:=createwindowex(0, 'child_window','child wnd', WS_OVERLAPPEDWINDOW or WS_CLIPSIBLINGS, 30,30,150,130,Form,0,hinstance,nil); // возможно запоминать ChildForm'ы в массив, а то при следующем нажатии кнопки предыдущий хендл "потеряетса"...
SetParent(ChildForm, Form);
ShowWindow(ChildForm, SW_SHOW);
end;
end;
end;
else
result := defwindowproc(wnd,msg,wparam,lparam);
end;
end;
function childwindowproc(wnd: hwnd; msg: integer; wparam: wparam; lparam: lparam):lresult;stdcall; // второй обработчик (для дочерних окон)
begin
result := defwindowproc(wnd,msg,wparam,lparam);
end;
procedure CreateWinApiForm;
begin
//заполняем структуру нового класса окна
window.cbsize := sizeof (window);
window.style := cs_hredraw or cs_vredraw;
window.lpfnwndproc := @windowproc; // указываем классу на адресс функции обработывающей сообщения
window.cbclsextra := 0;
window.cbwndextra := 0;
window.hinstance := hinstance;
window.hicon := loadicon(0,idi_application);
window.hcursor := loadcursor(0,idc_arrow);
window.hbrbackground:=1;
window.lpszmenuname := nil;
window.lpszclassname := 'main_window';
registerclassex(window);// регистрируем в системе новый класс окна
// создаем окно
Form:= createwindowex(0,'main_window','Hello World from WinApi', WS_OVERLAPPEDWINDOW,300,300,350,130,0,0,hinstance,nil);
label1:=CreateWindow('static','Ты уже посмотрел на размер?',WS_POPUP or WS_CHILD or BS_CENTER or SS_CENTER,6,25,330,40,Form,HLABEL,hInstance,nil);
Button:=CreateWindow('button','Кликать сюда',WS_VISIBLE or WS_CHILD or WS_CLIPSIBLINGS,6,73,110,25,Form,HBTN,hInstance,nil);
// показываем окно
ShowWindow(Form,SW_SHOW);
end;
procedure RegChildClass; // зарегистрируем класс для дочерних окон
begin
//заполняем структуру нового класса окна
window.cbsize := sizeof (window);
window.style := cs_hredraw or cs_vredraw;
window.lpfnwndproc := @childwindowproc; // указываем классу на адресс функции обработывающей сообщения
window.cbclsextra := 0;
window.cbwndextra := 0;
window.hinstance := hinstance;
window.hicon := loadicon(0,idi_application);
window.hcursor := loadcursor(0,idc_arrow);
window.hbrbackground:=2;
window.lpszmenuname := nil;
window.lpszclassname := 'child_window';
registerclassex(window);// регистрируем в системе новый класс окна
end;
begin
CreateWinApiForm;
RegChildClass;
while getmessage(mmsg,0,0,0) do
begin
translatemessage(mmsg); // переводит сообщения виртуальных клавиш в символьные сообщения
dispatchmessage(mmsg); // функция сообщения оконному обработчику событий, у нас это WindowProc
end;
end.