![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Введение новой оконной процедуры [D5, D6, Win95/98, Win2k, WinXP]
Serega_____ © (2004-03-04 11:15:00)Есть простое окошко, сделанное на API и поле ввода на нем, нужно
ввести отдельную оконную процедуру для этого поля ввода...,чтобы, например обработать нажатие Enter'a в нем.
Использую след. код,прога вылетае с ошибкой времени выполнения(run time), может кто поможет или предложит др. способ...,заранее спасибо.
program Test;
uses Windows, Messages;
var
wc: TWndClassEx;
Mes: TMsg;
MainWnd, EditWnd: HWND;
PrevProc: LongInt;
function MainWndProc(Wnd: HWND; Msg: Cardinal; WP: WParam; LP: LParam): LResult; stdcall;
Begin
case Msg of
WM_DESTROY:
begin
PostQuitMessage(0);
Result:= 0;
end;
else Result:= DefWindowProc(Wnd, Msg, WP, LP);
end;
End;
function EditWndProc(Wnd: HWND; Msg: Cardinal; WP: WParam; LP: LParam): LResult; stdcall;
Begin
case Msg of
WM_KEYDOWN:
begin
if WP = VK_RETURN then MessageBox(0, 'Тест', 'Тест', 0);
Result:= 0;
end;
else Result:= CallWindowProc(@PrevProc, Wnd, Msg, WP, LP);
end;
End;
BEGIN // Тело программы
wc.cbSize:= sizeof(wc);
wc.style:= CS_HREDRAW or CS_VREDRAW;
wc.lpfnWndProc:= @MainWndProc;
wc.cbClsExtra:= 0;
wc.cbWndExtra:= 0;
wc.hInstance:= HInstance;
wc.hIcon:= LoadIcon(0, IDI_APPLICATION);
wc.hCursor:= LoadCursor(0, IDC_ARROW);
wc.hbrBackground:= COLOR_BTNFACE+1;
wc.lpszMenuName:= nil;
wc.lpszClassName:= 'TestClass';
RegisterClassEx(wc);
MainWnd:= CreateWindowEx (0, 'TestClass', 'Test', WS_OVERLAPPEDWINDOW or WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, Hinstance, nil);
EditWnd:= CreateWindowEx(WS_EX_CLIENTEDGE, 'EDIT', nil,
WS_CHILD or WS_VISIBLE ,
10, 10, 100, 20, MainWnd, 0, 0, nil);
PrevProc:= SetWindowLong(EditWnd, GWL_WNDPROC, LongInt(@EditWndProc));
while GetMessage(Mes, 0, 0, 0) do
begin
TranslateMessage(Mes);
DispatchMessage(Mes);
end;
END.
Serega_____ (2004-03-04 11:48:00) [1]ага, спасибо, все номально
YuRock (2004-03-04 11:24:00) [2]Главная ошибка в приведенном коде: в строке
else Result:= CallWindowProc(@PrevProc, Wnd, Msg, WP, LP);
надо убрать собаку перед PrevProc (можно написать вместо этого Pointer(PrevProc));