Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Введение новой оконной процедуры [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));


Наверх

Титульная страница Поиск, карта сайта Написать письмо