Форум: "KOL";
Текущий архив: 2004.02.13;
Скачать: [xml.tar.bz2];
Внизкак можно заменить 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 вся ветка
Форум: "KOL";
Текущий архив: 2004.02.13;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c