Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.013 c
1-18410
mOOx_
2003-09-19 12:18
2003.10.06
Печать документов


7-18660
Opryshok
2003-07-23 11:22
2003.10.06
подскажите пожалуйста: как узнать %CPU USAGE


4-18689
antonyan
2003-08-01 13:54
2003.10.06
Сообщения Word


1-18318
SergP
2003-09-23 17:08
2003.10.06
Можно ли делать отчет (TQuickRep) из данных массива?


14-18636
Soft
2003-09-17 01:55
2003.10.06
Программа выборочной рассылки электронной почты





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский