Форум: "WinAPI";
Текущий архив: 2003.10.06;
Скачать: [xml.tar.bz2];
ВнизСоздание окна на WinAPI Найти похожие ветки
← →
dmtr (2003-07-29 11:33) [0]Банальный пример - создаю окно:
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, какие изменения надо внести в код?
← →
AlexRush (2003-07-29 12:02) [1]Посмотри из-за чего клас не регистрируется,например с пом. процедуры:
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;
← →
dmtr (2003-07-29 13:22) [2]Так класс как раз и регестрируется, а вот окно не создается
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;
← →
Semin Aleksei (2003-07-29 13:43) [3]Твоя оконная процедура всегда возвращает 0, а это неверно.
Дополнительно:
1. Нет ShowWindow после UpdateWindow
2. Как ты думаешь, что возвратит Application.Handle?
← →
Игорь Шевченко (2003-07-29 13:59) [4]И третье - где GetLastError ?
← →
Suntechnic (2003-07-29 15:22) [5]Тело оконной процедуры правильно напиши. Должно быть что то типа этого
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;
← →
dmtr (2003-07-29 16:57) [6]2 Suntechnic © (29.07.03 15:22)
Да действительно дело было именно в этом.
> Дополнительно:
> 1. Нет ShowWindow после UpdateWindow
При создании окна используется флаг WS_VISIBLE так что вызов ShowWindow не нужен
← →
Asteroid (2003-08-01 03:47) [7]И раз такое дело, Forms не нужен :)
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.10.06;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c