Вопрос
Как можно создать окно с помощью WinAPI и Delphi с какими-нибудь компонентами типа кнопки?
Ответ
Перво-наперво создадим макет диалогового окошка с двумя кнопочками… Ваще-то есть в природе специальные программы для энтого, ну да ладно, мы — люди не гордые и руки у нас прямые. Так вот. Создадим-ка мы файл, который назовем demo.rc:
DLG_DEMO DIALOG 0, 0, 135, 25 STYLE WS_VISIBLE
| WS_CAPTION
| WS_SYSMENU
| WS_GROUP
| DS_FIXEDSYS
| DS_SETFONT
| 0x200 EXSTYLE WS_EX_TOPMOST CAPTION
"Our demo dialog"
CLASS "DDEMO" LANGUAGE LANG_RUSSIAN,
0x1 FONT 8,
"MS Sans Serif"
{
CONTROL "Й-еееее…", 124, BUTTON, BS_PUSHBUTTON
| WS_CHILD
| WS_VISIBLE, 5, 5, 60, 14 CONTROL "Ффууууу…", 123, BUTTON, BS_PUSHBUTTON
| WS_CHILD
| WS_VISIBLE, 70, 5, 60, 14
}
Создали. Таперь его скомпилировать надо. А то линковщик не прожует. Для энтого у нас есть утилитка специальная хитрая, которая в {$DELPHI}\Bin лежит. «brcc32.exe» прозывается. Вот ее-то мы и натравим на наш «demo.rc» посредством командной строки.
И о, чудо, появился «demo.res». А таперь, собссно, самое главное.
Создадим файл «demo.dpr»:
program demo;
uses Windows, Messages;
{$R DEMO.RES} Var Dialog: hWnd; Msg: TMsg; WindowClass: TWndClass;
function DlgCallBack(HdlDlg: hWnd;
Msg: Cardinal;
WParam, LParam: LongInt): LongInt;
stdcall;
begin Result:=0;
case Msg of WM_INITDIALOG: begin Dialog:=HdlDlg;
end;
WM_COMMAND: Case LoWord(WParam) of 124: begin MessageBox(Dialog, 'Стопудово! :)',
'Ага',
MB_OK or MB_ICONINFORMATION);
end;
123: begin MessageBox(Dialog, 'Ну и ладно. :(', nil, MB_OK or MB_ICONWARNING);
PostMessage(Dialog, WM_CLOSE, 0, 0);
end;
End;
WM_CLOSE: begin PostQuitMessage(0);
end;
end; end;
Var Err: LongWord;
begin With WindowClass do begin Style:=cs_HRedraw or cs_VRedraw;
lpfnWndProc:=@DefDlgProc;
cbClsExtra:=0;
cbWndExtra:=DLGWINDOWEXTRA;
hIcon:=LoadIcon(0, idi_Application);
hCursor:=LoadCursor (0, idc_Arrow);
hbrBackground:=GetStockObject(White_Brush);
lpszMenuName:=NIL;
lpszClassName:='DDEMO';
end;
WindowClass.hInstance:=hInstance;
If RegisterClass(WindowClass)=0 then Halt (255);
If DialogBox(hInstance, 'DLG_DEMO', 0, @DlgCallBack)=-1 then MessageBox(0, 'Dialog creation failed', 'Error', MB_OK or MB_ICONSTOP);
end.
И его скомпилируем.
Усе. :) Можно запускать.
Из конференции Expert_FAQ
Copyright 2000-2004 Сообщество Чайников
Контактная информация