![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
создание формы на WinApi [D7, WinXP]
Kelvin © (2004-01-08 14:03:00)Уважаемые мастера.Расскажите как создать простую форму на WinApi? Но с максимумом комментариев,а не как обычно "пишите этот код". Где только не искал, нигде не могут нормально все объяснить.
Akvilon (2004-01-13 00:36:00) [1]Взято из Справочника по winapi http://www.soobcha.ru/rushelp
program winmin;
uses
windows, messages;
{'модули windows и messages самые необходимые — они обязательно должны быть
объявлены в начале каждой Вашей программы!}
var
wc : TWndClassEx; //Переменная шаблона класса окна
MainWnd : HWND; //Описатель главного окна
Mesg : TMsg; //Переменная для цикла сбора сообщений
{ Далее следует оконная процедура главного окна. Обратите внимание на служебное
слово stdcall оно вынуждает компиллятор генерировать особый вид кода, который
может быть вызван любой windows-программой, без этого служебного слова
программа не сможет работать вообще!}
function WindowProc(wnd:HWND; Msg : Integer; Wparam:Wparam; Lparam:Lparam):Lresult;
stdcall;
Begin
{Далее происходит цикл обработки сообщений}
case msg of
wm_destroy : //Сообщение посылаемое при уничтожении окна
Begin
postquitmessage(0); exit;
Result:=0;
End
else Result:=DefWindowProc(wnd,msg,wparam,lparam);
end;
End;
{Переменные xPos,yPos,nWidth,nHeight в принципе не нужны, однако я их завел
(и вам рекомендую) для лучшей читабельности программы}
var
xPos,yPos,nWidth,nHeight : Integer;
begin //Тело программы
{ Далее идет заполнение шаблона класса окна}
wc.cbSize:=sizeof(wc);
wc.style:=cs_hredraw or cs_vredraw;
wc.lpfnWndProc:=@WindowProc;
wc.cbClsExtra:=0;
wc.cbWndExtra:=0;
wc.hInstance:=HInstance;
wc.hIcon:=LoadIcon(0,idi_application);
wc.hCursor:=LoadCursor(0,idc_arrow);
wc.hbrBackground:=COLOR_BTNFACE+1;
wc.lpszMenuName:=nil;
wc.lpszClassName:='WinMin : Main';
RegisterClassEx(wc); //Регистрация нового класса в системе
{'заполнение переменных xPos,yPos,nWidth,nHeight}
xPos:=100;
yPos:=150;
nWidth:=400;
nHeight:=250;
{ Создание главного окна}
MainWnd:=CreateWindowEx (
0, //флаги расширенных стилей
'WinMin : Main', //имя класса окна, данное при заполнении структуры wc
'Win Min', //заголовок окна
ws_overlappedwindow, //флаги стилей окна
{подробнdее о стилях см. после текста программы}
xPos, //горизонтальная позиция окна
yPos, //вертикальная позиция окна
nWidth, //ширина окна
nHeight, //высота окна
0, //описатель родительского окна (parent) или окна-владельца (owner)
0, //описатель меню окна (меню нет, нет и описателя)
Hinstance, //описатель приложения
nil //address of window-creation data
);
ShowWindow(MainWnd,CmdShow); //Отображаем окно
//Цикл обработки сообщений
//он может слегка видоизменяться, но эти строчки присутсвуют всегда
While GetMessage(Mesg,0,0,0) do
begin
TranslateMessage(Mesg);
DispatchMessage(Mesg);
end;
end.
Комментарий: Осталось только уточнить ряд деталей. Во-первых, ВСЕ присутствующее в данной программе (кроме комментариев, разумеется) ОБЯЗАТЕЛЬНО. Укоротить принципиально невозможно, можно, конечно, убрать некоторые переменные, но это сути дела не меняет. Во-вторых, в оконной процедуре могут присутствовать и другие строчки, принимающие сообщения. В-третьих, вызов в оконной процедуре функции DefWindowProc жизненно необходим. DefWindowProc - это оконная процедура по умолчанию, она обеспечивает окну возможность "вести" себя как окну, т.е. перетаскиваться мышкой, сворачиваться, разворачиваться и т.д.
Иван Шихалев (2004-01-12 20:21:00) [2]http://fpc.by.ru/win32/win32-01.shtml
sniknik (2004-01-12 16:26:00) [3]искал действительно плохо, оно везде, даже в потрепаться обуждают причем с кучей примеров
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1073564361&n=3
а вот с комментариями обломс, их писать не любят. разве что за деньги (в книгах).
GLFox (2004-01-12 14:04:00) [4]Вот примерчик (создает минимайзнетую окошку):
procedure CreateWindow(hInst:THandle; sName:String);
var WndClassEx:TWndClassEx;
begin
Self.hInst:=hInst;
with WndClassEx do begin
cbSize:=SizeOf(TWndClassEx);
style:=0{CS_HREDRAW or CS_VREDRAW};
lpfnWndProc:=@MainWndProc;
cbClsExtra:=0;
cbWndExtra:=0;
hInstance:=hInst;
hIcon:=0{LoadIcon(hInst,'MAINICON')};
hCursor:=0{LoadCursor(hInst,IDC_ARROW)};
hbrBackground:=0{COLOR_BTNFACE+1};
lpszMenuName:=nil;
lpszClassName:=WndClassName;
hIconSm:=0;
end;
RegisterClassEx(WndClassEx);
hWindow:=CreateWindowEx(WS_EX_TOPMOST or WS_EX_TOOLWINDOW, WndClassName, PChar(sName),
WS_MINIMIZE, 0,0,0,0, 0, 0, hInst, nil);
if hWindow=0 then begin
MessageBox(0,GetSysError(GetLastError),AppTitle,MB_OK+MB_ICONSTOP);
end;
end;
YuRock (2004-01-08 19:07:00) [5]"Форма" - это надуманное в VCL слово. В API нет форм - только окна. И создаются они с помощью функции CreateWindow
y-soft (2004-01-08 14:22:00) [6]>Kelvin (08.01.04 14:03)
Плохо, наверное, искали.
Есть множество разжеванных примеров в любом классическом учебнике по программированию для Windows - у того же Петцольда, например.
Раз не понимаете объяснения, то значит еще не совсем понимаете, как устроена стандартная программа Windows (очередь сообщений, дескрипторы, стили и классы окон etc)...
Игорь Шевченко (2004-01-08 14:11:00) [7]
> как создать простую форму на WinApi
forms.pas