Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
3-38751
jenya_d
2004-01-20 09:49
2004.02.13
Ошибки при работе с БД IB55 во время работы отладчика Delphi


14-39077
тихий вовочка
2004-01-24 08:12
2004.02.13
Drag and drop


14-39043
ИМХО
2004-01-26 02:24
2004.02.13
Наушники <-> колонки


3-38731
VID
2004-01-18 02:56
2004.02.13
К теме о странном поведении fibplus при неудачном коннекте


1-38803
Eli
2004-02-02 13:27
2004.02.13
ClipBoard.AsText - ????? вместо букв





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский