Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.28;
Скачать: CL | DM;

Вниз

создание формы на WinApi   Найти похожие ветки 

 
Kelvin   (2004-01-08 14:03) [0]

Уважаемые мастера.Расскажите как создать простую форму на WinApi? Но с максимумом комментариев,а не как обычно "пишите этот код". Где только не искал, нигде не могут нормально все объяснить.


 
Игорь Шевченко ©   (2004-01-08 14:11) [1]


> как создать простую форму на WinApi


forms.pas


 
y-soft ©   (2004-01-08 14:22) [2]

>Kelvin   (08.01.04 14:03)  

Плохо, наверное, искали.

Есть множество разжеванных примеров в любом классическом учебнике по программированию для Windows - у того же Петцольда, например.

Раз не понимаете объяснения, то значит еще не совсем понимаете, как устроена стандартная программа Windows (очередь сообщений, дескрипторы, стили и классы окон etc)...


 
YuRock ©   (2004-01-08 19:07) [3]

"Форма" - это надуманное в VCL слово. В API нет форм - только окна. И создаются они с помощью функции CreateWindow


 
GLFox   (2004-01-12 14:04) [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;


 
sniknik ©   (2004-01-12 16:26) [5]

искал действительно плохо, оно везде, даже в потрепаться обуждают причем с кучей примеров
http://delphimaster.net/view/15-1073564361/  
а вот с комментариями обломс, их писать не любят. разве что за деньги (в книгах).


 
Иван Шихалев ©   (2004-01-12 20:21) [6]

http://fpc.by.ru/win32/win32-01.shtml


 
Akvilon ©   (2004-01-13 00:36) [7]

Взято из Справочника по 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 - это оконная процедура по умолчанию, она обеспечивает окну возможность "вести" себя как окну, т.е. перетаскиваться мышкой, сворачиваться, разворачиваться и т.д.



Страницы: 1 вся ветка

Текущий архив: 2004.03.28;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.034 c
1-1078988895
Thick
2004-03-11 10:08
2004.03.28
Динамическое создание визуальных компонентов


3-1077189188
Pul
2004-02-19 14:13
2004.03.28
Поля TIMESTAMP в INTERBASE


14-1078001579
Layner
2004-02-28 23:52
2004.03.28
Люди, никто не ставил на комп где стоит NT2000, 98, 2й ОС?


3-1077697926
Atanas
2004-02-25 11:32
2004.03.28
Вычисление ключа


4-1074070986
alsov
2004-01-14 12:03
2004.03.28
Hook на файл