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

Вниз

Оконная процедура как метод класса...   Найти похожие ветки 

 
SunSay   (2003-02-18 21:54) [0]

Вообщем у меня такая проблема...
Программирование через API Виндуз
Мне нужно сделать класс TForm, который умеет создавать окно,
и перехватывать сообщения:

uses
windows,
messages;

type
TWndMethod = function (hWindow: HWND; Msg: UINT; wParam: wParam; lParam: lParam):LRESULT; stdcall;

TForm = class (TObject)
private
FLeft,
FTop,
FWidth,
FHeight : Word;
...
FHandle : HWND;
...
function WndProc(hWindow: HWND; Msg: UINT; wParam: wParam; lParam: lParam):LRESULT; stdcall;
public
constructor Create(...);
...
WindowProc: TWndMethod;
...
procedure OnCreate; Virtual;
end;

function TForm.WndProc;
begin
case Msg of
...
WM_CREATE: OnCreate;
...
end;
end;


Вся проблема заключается в том, что я не могу назначить процедуру WndProc класса TForm
как оконную процедуру для создаваемого объекта (окна).

constructor TForm.Create(...);
begin
...
WindowProc := @WndProc; //ругается что нельзя назначить метод класса как оконную процедуру
...
WndClassInfo.lpfnWndProc := @WindowProc;
...
end;


Я пытался сделать что-то типа


type
TWndMethod = function (hWindow: HWND; Msg: UINT; wParam: wParam; lParam: lParam):LRESULT of object;


Но тогда программа вообще не может получить хендл создаваемого окна
(всмысле ничче не создается).

Уже три дня над этой {EQYTQ мучаюсь (если бы на исходниках VCL
дельфи стоял счетчик посещений, он наверняка бы у меня зашкалил).

Подскажите, пожалуйста, как можно решить эту проблему (если вы поняли о чем речь).
Буду очень благодарен!!!

_________________________
Да прибудет с тобой святой Kernel32


 
Ihor Osov'yak ©   (2003-02-18 22:08) [1]

forms.AllocateHWnd как источник идеи подойдет?


 
ION T ©   (2003-02-18 23:39) [2]

Методы всегда расчитывают на неявный параметр указывающий на экземпляр класса - self....винда на него не расчитывает.....

_________________________
Да пребудет с тобой святой bzImage


 
PVOzerski ©   (2003-02-19 06:08) [3]

Я когда-то примерялся сделать мини-VCL для FreePascal, пошел "своим путем", не как Borland. Вот кусочки, может, пригодятся. Правда, пока не thread-safe, надо бы LastWinObject улучшить.
...
var
LastWinObject:pointer;


function APIwndproc(hwnd:tHandle;msg,wp,lp:cardinal):longint;stdcall;
var
M:tMessage;
W:tWindow;
begin
M.msg:=msg;
M.WParam:=wp;
M.LParam:=lp;
W:=tWindow(GetWindowLong(hwnd,GWL_USERDATA));
if W=nil then
begin
SetWindowLong(hWnd,GWL_USERDATA,longint(LastWinObject));
W:=tWindow(LastWinObject);
W.fHandle:=hwnd;
end;
W.WndProc(M);
Result:=M.Result;
end;

constructor tWindow.Create;
var
wc:WndClass;
i,l:longint;
found:boolean;
begin
...
_classname:=ClassName;//поле класса tWindow

...
LastWinObject:=pointer(self);
CreateWindow{Ex}({0,}@_classname[1],"",WndStyle,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
0,
0,
hInstance,
nil);
end;
...
procedure tWindow.WndProc(var msg:tMessage);
begin
Dispatch(msg);
end;
....


 
Юрий Зотов ©   (2003-02-19 08:43) [4]

> ругается что нельзя назначить метод класса как оконную
> процедуру

Правильно ругается, у них разные списки параметров. И не надо делать ее методом класса - сделайте ее обычной функцией и назначайте без проблем. Как в примере от PVOzerski.


 
Digitman ©   (2003-02-19 10:06) [5]

uses Forms, ...
...

TMyForm = class (TObject)
private
hWnd: THandle;
procedure MyWndMethod(var message: TMessage);
public
constructor Create;
destructor Destroy; override;
...
end;

...
constructor TMyForm.Create;
begin
inherited Create;
hWnd := AllocateHWnd(MyWndMethod);
end;

destructor TMyForm.Destroy;
begin
DeallocateHWnd(hWnd);
inherited Destroy;
end;

procedure TMyForm.MyWndMethod(var message: TMessage);
begin
Dispatch(Message.Msg);
end;

p.s.
если нужно избежать подключение модуля Forms к проекту, просто перенеси декларацию/реализацию ф-ций Allocate/DeallocateHWnd (и всего, что с ними связано) в свой модуль


 
SunSay   (2003-02-20 17:37) [6]

Thanx
P.S. Большое



Страницы: 1 вся ветка

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

Наверх




Память: 0.48 MB
Время: 0.018 c
1-67320
Sectey
2003-04-08 13:38
2003.04.21
Как заставит другую программу(процесс) записывать данные?


7-67581
Евген
2003-02-26 15:36
2003.04.21
Работа с ИК портом


1-67197
Man
2003-04-08 17:42
2003.04.21
Помогите разобраться с потоком


6-67426
hort
2003-03-01 14:13
2003.04.21
Входящие подключения для Win2k


1-67240
softmaster
2003-04-10 19:35
2003.04.21
Округление