Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Создание окна на WinAPI


dmtr ©   (2003-07-29 11:33:00) 

Банальный пример - создаю окно:
program Proj;

uses
Windows, Messages, Forms;

var
hwnd: integer;
msg: TMSG;
wc: WNDCLASSEX;

function WndProc(hwnd, msg: DWord; wParam, lParam: integer): integer; stdcall;
begin
case msg of
wm_destroy:
begin
PostQuitMessage(0);
Result := 0;
exit;
end;
end;
Result := 0;
end;

begin
wc.cbSize := sizeof(WNDCLASSEX);
wc.style := CS_OWNDC;
wc.lpfnWndProc := @WndProc;
wc.cbClsExtra := 0;
wc.cbClsExtra := 0;
wc.hInstance := application.handle;
wc.hIcon := LoadIcon(0, IDI_APPLICATION);
wc.hCursor := LoadCursor(0, IDC_ARROW);
wc.hbrBackground := GetStockObject(BLACK_BRUSH);
wc.lpszMenuName := nil;
wc.lpszClassName := "CLASS1";
wc.hIconSm := LoadIcon(0, IDI_APPLICATION);

if RegisterClassEx(wc) = 0 then
begin
MessageBox(0, "can not register a class", "error", MB_OK);
exit;
end;

hwnd := CreateWindowEx(0, "CLASS1", "my first delphi window", WS_OVERLAPPEDWINDOW or WS_VISIBLE,
50, 50, 500, 500, 0, 0, application.Handle, nil);
if hwnd = 0 then
begin
MessageBox(0, "can not create a window", "error", MB_OK);
exit;
end;

UpdateWindow(hwnd);

while true do
begin
if not PeekMessage(msg, 0, 0, 0, PM_REMOVE) then
begin
if msg.message = WM_QUIT then
break
else
begin
TranslateMessage(msg);
( msg)

Банальный пример - создаю окно:
program Proj;

uses
Windows, Messages, Forms;

var
hwnd: integer;
msg: TMSG;
wc: WNDCLASSEX;

function WndProc(hwnd, msg: DWord; wParam, lParam: integer): integer; stdcall;
begin
case msg of
wm_destroy:
begin
PostQuitMessage(0);
Result := 0;
exit;
end;
end;
Result := 0;
end;

begin
wc.cbSize := sizeof(WNDCLASSEX);
wc.style := CS_OWNDC;
wc.lpfnWndProc := @WndProc;
wc.cbClsExtra := 0;
wc.cbClsExtra := 0;
wc.hInstance := application.handle;
wc.hIcon := LoadIcon(0, IDI_APPLICATION);
wc.hCursor := LoadCursor(0, IDC_ARROW);
wc.hbrBackground := GetStockObject(BLACK_BRUSH);
wc.lpszMenuName := nil;
wc.lpszClassName := "CLASS1";
wc.hIconSm := LoadIcon(0, IDI_APPLICATION);

if RegisterClassEx(wc) = 0 then
begin
MessageBox(0, "can not register a class", "error", MB_OK);
exit;
end;

hwnd := CreateWindowEx(0, "CLASS1", "my first delphi window", WS_OVERLAPPEDWINDOW or WS_VISIBLE,
50, 50, 500, 500, 0, 0, application.Handle, nil);
if hwnd = 0 then
begin
MessageBox(0, "can not create a window", "error", MB_OK);
exit;
end;

UpdateWindow(hwnd);

while true do
begin
if not PeekMessage(msg, 0, 0, 0, PM_REMOVE) then
begin
if msg.message = WM_QUIT then
break
else
begin
TranslateMessage(msg);
DispatchMessage(msg);
end;
end
end;
end.

При создании окна срабатывает обработчик ошибки, т.е. hwnd = 0, какие изменения надо внести в код?


Asteroid   (2003-08-01 03:47:00) [1]

И раз такое дело, Forms не нужен :)


dmtr   (2003-07-29 16:57:00) [2]

2 Suntechnic © (29.07.03 15:22)
Да действительно дело было именно в этом.


> Дополнительно:
> 1. Нет ShowWindow после UpdateWindow

При создании окна используется флаг WS_VISIBLE так что вызов ShowWindow не нужен


Suntechnic   (2003-07-29 15:22:00) [3]

Тело оконной процедуры правильно напиши. Должно быть что то типа этого

begin
case Msg of
WM_DESTROY:
begin
PostQuitMessage(0);
Result := 0;
end
else
( HWnd,Msg,WParam,LParam)

Тело оконной процедуры правильно напиши. Должно быть что то типа этого

begin
case Msg of
WM_DESTROY:
begin
PostQuitMessage(0);
Result := 0;
end
else
Result := DefWindowProc(HWnd,Msg,WParam,LParam);
end;
end;


Игорь Шевченко   (2003-07-29 13:59:00) [4]

И третье - где GetLastError ?


Semin Aleksei   (2003-07-29 13:43:00) [5]

Твоя оконная процедура всегда возвращает 0, а это неверно.

Дополнительно:
1. Нет ShowWindow после UpdateWindow
2. Как ты думаешь, что возвратит Application.Handle?


dmtr   (2003-07-29 13:22:00) [6]

Так класс как раз и регестрируется, а вот окно не создается
hwnd := CreateWindowEx(0, "CLASS1", "my first delphi window", WS_OVERLAPPEDWINDOW or WS_VISIBLE,
50, 50, 500, 500, 0, 0, application.Handle, nil);
if hwnd = 0 then
begin
( 0, "can not create a window", "error", MB_OK)

Так класс как раз и регестрируется, а вот окно не создается
hwnd := CreateWindowEx(0, "CLASS1", "my first delphi window", WS_OVERLAPPEDWINDOW or WS_VISIBLE,
50, 50, 500, 500, 0, 0, application.Handle, nil);
if hwnd = 0 then
begin
MessageBox(0, "can not create a window", "error", MB_OK);
exit;
end;



AlexRush   (2003-07-29 12:02:00) [7]

Посмотри из-за чего клас не регистрируется,например с пом. процедуры:

procedure SystemErrorMsg(context:string);
var a:array[0..MAX_PATH]of char;
begin
FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM,
nil,
GetLastError(),
0,
@a[0],
MAX_PATH,
nil);
MessageBoxA(0,@a[0],PChar("System Error In: "+context),$10);
end;

и вставь в свой код:

if RegisterClassEx(wc) = 0 then
begin
SystemErrorMsg("RegisterClassEx");
exit;
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо