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

Вниз

как можно заменить AllocateHWnd ?   Найти похожие ветки 

 
BelchonokH   (2003-05-18 19:09) [0]

Такое дело, в КОЛ есть какая-нибудь замена AllocateHWnd из висиэла? В контроле используется WSAAsyncSelect и там требуется HWnd полученный процедурой AllocateHWnd, что делать???


 
Avenger [NhT]   (2003-05-18 19:17) [1]

А зачем замена? Возми из Vcl финкцию как это сделано в TCPSocket


 
Centronix   (2003-05-19 16:48) [2]

unit KOLObjects;

interface

uses Windows, Messages;

type
TWindowProc = function(Wnd: HWND; Msg: Cardinal; wParam, lParam: LongInt): LongInt; stdcall;

function AllocateHWnd(WndProc: TWindowProc): HWND;
procedure DeallocateHWnd(Wnd: HWND);

implementation

var
UtilWindowClass: TWndClass = (
Style: 0;
lpfnWndProc: @DefWindowProc;
cbClsExtra: 0;
cbWndExtra: 0;
hInstance: 0;
hIcon: 0;
hCursor: 0;
hbrBackground: 0;
lpszMenuName: nil;
lpszClassName: "TKUtilWindow");

function AllocateHWnd(WndProc: TWindowProc): HWND;
var
TempClass: TWndClass;
ClassRegistered: Boolean;
begin
UtilWindowClass.hInstance := HInstance;
ClassRegistered:=GetClassInfo(HInstance, UtilWindowClass.lpszClassName, TempClass);
If not ClassRegistered or (TempClass.lpfnWndProc<>@DefWindowProc) then begin
If ClassRegistered then Windows.UnregisterClass(UtilWindowClass.lpszClassName, HInstance);
( UtilWindowClass) [2]
unit KOLObjects;

interface

uses Windows, Messages;

type
TWindowProc = function(Wnd: HWND; Msg: Cardinal; wParam, lParam: LongInt): LongInt; stdcall;

function AllocateHWnd(WndProc: TWindowProc): HWND;
procedure DeallocateHWnd(Wnd: HWND);

implementation

var
UtilWindowClass: TWndClass = (
Style: 0;
lpfnWndProc: @DefWindowProc;
cbClsExtra: 0;
cbWndExtra: 0;
hInstance: 0;
hIcon: 0;
hCursor: 0;
hbrBackground: 0;
lpszMenuName: nil;
lpszClassName: "TKUtilWindow");

function AllocateHWnd(WndProc: TWindowProc): HWND;
var
TempClass: TWndClass;
ClassRegistered: Boolean;
begin
UtilWindowClass.hInstance := HInstance;
ClassRegistered:=GetClassInfo(HInstance, UtilWindowClass.lpszClassName, TempClass);
If not ClassRegistered or (TempClass.lpfnWndProc<>@DefWindowProc) then begin
If ClassRegistered then Windows.UnregisterClass(UtilWindowClass.lpszClassName, HInstance);
Windows.RegisterClass(UtilWindowClass);
end;
Result:=CreateWindowEx(WS_EX_TOOLWINDOW, UtilWindowClass.lpszClassName, "", WS_POPUP, 0, 0, 0, 0, 0, 0, HInstance, nil);
If Assigned(WndProc) then SetWindowLong(Result, GWL_WNDPROC, Longint(@WndProc));
end;

procedure DeallocateHWnd(Wnd: HWND);
begin
DestroyWindow(Wnd);
end;

end.

А для получения ссылки на объект используй GetProp/SetProp и ID_SELF:
function HWndProc(Wnd: HWND; Msg: Cardinal; wParam, lParam: LongInt): LongInt; stdcall;
var
ASocket: PAsyncSocket;
begin
Result:=0;
ASocket:=PAsyncSocket(GetProp(Wnd, ID_SELF));
If not Assigned(ASocket) then Exit;
If Msg = WM_SOCKET then ...
...

function NewAsyncSocket;
...
Result.fWndHandle:=AllocateHWnd(HWndProc);
SetProp(Result.fWndHandle, ID_SELF, THandle(Result));
...

По размеру меньше, чем VCL-ный вариант...


 
BaRToV   (2003-05-22 03:37) [3]


ASocket:=PAsyncSocket(GetProp(Wnd, ID_SELF));
If not Assigned(ASocket) then Exit;
If Msg = WM_SOCKET then ...
...

function NewAsyncSocket;
...
Result.fWndHandle:=AllocateHWnd(HWndProc);
SetProp(Result.fWndHandle, ID_SELF, THandle(Result));


Хм... Ну вообще-то все это дело делается по другому.
И самое что плохое, это точ-то ты НЕвозможно получить от Applet"а сообщения.
Если у тебя работает этот код - замыль мне его!!!


 
BaRToV   (2003-05-22 04:05) [4]

Result := CallWindowProc(Pointer(OldWnd), NewWnd, Msg, wParam, lParam);

Тоже не все сообщения получает...


 
Centronix   (2003-05-30 20:33) [5]


> И самое что плохое, это точ-то ты НЕвозможно получить от
> Applet"а сообщения.

А при чем тут апплет ? Там спрашивали про хендл окна для WSAAsyncSelect...


 
BaRToV   (2003-05-31 10:49) [6]

2 Centronix

> А при чем тут апплет ?
AllocateHWnd создает новое окно и возращает хэнд, но так получилось что мне надо, чтоб это окно обрабатывала и сообщения Аплета.
Как это сделать?... (спрашиваю потомучто просто так не получается - как всегда)


 
Кладов   (2003-05-31 11:21) [7]

Тогда лучше не создавать окно, а перехватить сообщения апплета, но не AttachProc или OnMessage, а через SetWindowLong( Applet.GetWindowHandle, GWL_WNDPROC, ... ) - тогда будет перехватываться еще до того как сработает все остальное. Отсоединяться корректно не забывайте по WM_DESTROY, ну и в деструкторе компонента.


 
BaRToV   (2003-05-31 13:54) [8]

2 Кладов
Понял ;0)



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

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

Наверх




Память: 0.49 MB
Время: 0.039 c
6-38984
Эрик
2003-12-11 08:50
2004.02.13
Как сконвертировать представление ip-адреса в формате IPv4?


1-38806
Sour
2004-02-03 11:08
2004.02.13
Как получить все сочетания символов


14-39057
Феликс
2004-01-23 21:46
2004.02.13
Вопрос по физике


1-38768
moyavital
2004-02-03 18:09
2004.02.13
Склонение по падежам


8-38965
AlexT1000
2003-09-04 12:00
2004.02.13
Как получить каждый кадр с Web камеры в память?