2025-05-12 10:07:51 +03:00

142 lines
3.4 KiB
ObjectPascal

library PowerPaint;
{ A Power Plugin DLL should simply have 3 Procedures.
1 - Init
GetVerbs will have a parameter of pointer.The application will call this
init procedure by passing its instance to it. This is a standart procedure
and should be implemeted same in all plugins.
2 - GetVerbs
GetVerbs will return a pchar including the name of the Verbs called from the
application. Note that these verb names will be taken by the application to
the menu, and each menu click will call the third exported procedure (DoVerb)
with the verb index which is in fact the index of the verb in the string list.
3 - DoVerb
DoVerb has one parameter. It stands for the index of the verb to be
called. In this procedure you will do your actions by using the procedure
and functions that are defined in the interface of the PCPlgLib unit that
you should include in the uses clause of this dll dpr.
}
uses
SysUtils,
Classes,
Windows,
Messages,
Graphics,
Controls,
Forms,
StdCtrls,
Buttons,
Grids,
Dialogs,
PCPlgLib in '../PCPlgLib.pas',
PaintForm in 'PaintForm.pas' {frmPaint};
procedure Init(Owner: Integer); stdcall;
begin
GetAdresses(Owner);
// Plugin specific intialization code
end;
Function GetVerbs:PChar;stdcall;
var res: pchar;
Begin
res := 'Open PowerPaint';
result := res;
End;
Procedure OpenPaint;
var i,f,cnt:Integer;
cName: String;
xBmp: Tbitmap;
fBmp: Integer;
frm: TFrmPaint;
fig,fHandle: Integer;
mStream: TmemoryStream;
buf:Pbyte;
xSize: Integer;
fName: String;
xByte: Byte;
Begin
xBmp := nil;
i := 0;
fig := 0;
fName := 'c:\ppbmp.bmp';
cnt := pcGetPropSelectedCount;
if cnt > 0 then begin
repeat
fHandle := pcGetSelectedHandle(i);
cName := String(pcFigureGetClass(fHandle));
if Copy(uppercase(cName) ,1,4) = 'TBMP' then
begin
fig := fHandle;
end;
inc(i);
until (fig > 0) or (i >= Cnt);
end;
buf := nil;
mStream := nil;
if fig > 0 then begin
pcFigureSaveBitmapToFile(fig,pchar(fName));
Sleep(250);
xBmp := Tbitmap.Create;
xBmp.LoadFromFile(fName);
buf := PByte(pcGetFigureCustomStream(fig,xSize));
if assigned(buf) and (xSize > 0) then begin
mStream := TMemoryStream.Create;
mStream.Write(buf^,xsize);
mStream.Position := 0;
//FreeMem(Buf,xSize);
end;
end else begin
end;
frm := TFrmPaint.Create(nil);
if frm.EditBitmap(xBmp,mStream) then
begin
xBmp.SaveToFile(fName);
if fig > 0 then begin
pcFigureLoadBitmapFromFile(fig,pchar(fName));
end else begin
fig := pcInsertBitmap(0,0,0,pchar(fName),0,1);
end;
if frm.Layers.Count > 1 then begin
mStream := TmemoryStream.Create;
frm.SaveToStream(mStream);
GetMem(buf,mStream.Size);
mStream.Position := 0;
mStream.Read(buf^,mStream.Size);
pcSetFigureCustomStream(fig,mStream.Size,buf^);
mStream.Free;
FreeMem(buf);
end else begin
buf := nil;
xByte := 0;
pcSetFigureCustomStream(fig,0,xByte);
end;
end;
frm.free;
End;
Procedure DoVerb(VerbIndex: integer);stdcall;
Begin
if VerbIndex = 0 then OpenPaint;
end;
exports
Init name 'Init',
GetVerbs name 'GetVerbs',
DoVerb name 'DoVerb';
begin
end.