SCHMaster

|
Posted: Thu Feb 03, 2005 15:22 Post subject: |
|
|
Nik
Quote: | Тут есть пара проблем: с одной стороны я использую не станадартный компонент (который, в принципе можно заменить); с другой - на чистом WinApi я до сих пор не писал, так что любой помощи буду рад...
В принципе пример того, как работает AmpView можно глянуть в исходниках AmpView Classic (они выложены на wincmd.ru). |
Компоненты тут непричем. А помощь - невопрос. Что непонятно - свисти.
Code: | // Cтруктура отображенного в память файла - как создать и юзать
набери в поисковике - CreateFileMapping и MapViewOfFile
PMainData = ^TMainData;
TMainData = record
MainForm:HWND;
....
....
end;
...
var
DMainData:PMainData; // Глобальная (!!!!) переменная
wc : TWndClass;
I:Integer = 0
function ListLoad(ParentWin: HWND; FileToLoad: pchar; ShowFlags: integer): HWND; stdcall;
var
WndClass: array [0..255] of Char;
begin
Result := 0;
GetClassName(GetParent(ParentWin), WndClass, SizeOf(WndClass));
if not (WndClass <> 'TTOTAL_CMD') then Exit; //С QuiqView такой фокас не прокатит
if not (.... выполняем проверку - подходит файл млм нет...) then Exit;
if DMainData^.MainForm = 0 then
begin
DMainData^.MainForm:=CreateMyPluginWindow// Твой плагин
if DMainData^.MainForm = 0 then Exit;
end
else
begin
I:=SendMessage(DMainData^.MainForm,WM_MAINCOMMAND,MYCMD,0);
if I = 0 then Exit; // Сообщкние окну плагина о новом файле, можно WM_COPYDATA, можно что-то свое - главное передать имя файла.
end;
Result :=CallKiller(ParentWin);
if Result = 0 then Exit;
SetWindowPos(ParentWin,0,-100,-100,0,0,SWP_HIDEWINDOW);// Убираем с глаз-долой листер
end;
и "само убийство"
function WindowProc(wnd:HWND; Msg : Integer; Wparam:Wparam; Lparam:Lparam):Lresult; stdcall;
var
Style:Longint;
LW:HWND;
Begin
LW:=GetParent(wnd);
PostMessage(LW,WM_KEYDOWN, 27, 0);
Result := DefWindowProc(wnd,msg,wparam,lparam);
End;
function CallKiller(aListerWindow:HWND):HWND;
begin
result:=CreateWindowEx(WS_EX_CONTROLPARENT,'LISTER_KILLER','LISTER_KILLER',WS_CHILD or WS_VISIBLE or WS_CLIPSIBLINGS
,0,0,10,10,aListerWindow,0,Hinstance,nil);
end;
exports
....
begin
....
WC.lpfnWndProc := @WindowProc;
WC.style := CS_VREDRAW or CS_HREDRAW;
WC.hInstance := hInstance;
WC.hIcon := 0;
WC.hCursor := LoadCursor(0,IDC_ARROW);
WC.hbrBackground := CreateSolidBrush( COLOR_BTNFACE+1 );
WC.lpszMenuName := nil;
WC.cbClsExtra := 0;
WC.cbWndExtra := 0;
wc.lpszClassName := 'LIST_KILL';
Windows.RegisterClass(wc);
...
end. |
|
|