![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создание окна на 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;