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

Вниз

Создание окна на 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 вся ветка

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

Наверх




Память: 0.49 MB
Время: 0.024 c
14-18607
Udjin
2003-09-17 17:58
2003.10.06
Интересный факт


1-18424
Deb
2003-09-24 22:40
2003.10.06
многострочный RadioButton


1-18454
Prima
2003-09-24 17:51
2003.10.06
Помогите с DLL


1-18384
DreamDesire
2003-09-22 17:16
2003.10.06
Область прокрутки для компонентов


1-18348
Kiddy
2003-09-22 11:19
2003.10.06
При компиляции запускается дебагер Delphi