我有一个带有TOleContainer控件的Delphi(BDS 2006)应用程序。它内部有一个OLE对象,即MS Office 2003中的MS Equation公式(名称为“ Equation.3”)。

如何从公式图像中提取矢量图元文件以将其插入到网页或其他不具有OLE支持的文档中?

TOleContainer内部仅具有“ Equation.3”对象,没有其他可能性。
我试图使用.Copy方法通过剪贴板制作它,但是它复制了一个空图像。

最佳答案

OLE容器具有可以访问的基础IOLEObject接口。您可以使用自己的画布将其传递给OLEDraw函数。您可以使用位图画布或图元文件画布,然后以所需格式保存图像。

OleDraw(OleContainer.OleObjectInterface,DVASPECT_CONTENT,Bmp.Canvas.Handle,R);


{
  DrawOleOnBmp
  ---------------------------------------------------------------------------
  Take a OleObject and draw it to a bitmap canvas.  The bitmap will be sized
  to match the normal size of the OLE Object.
}
procedure DrawOleOnBmp(Ole: IOleObject; Bmp: TBitmap);
var
  ViewObject2: IViewObject2;
  ViewSize: TPoint;
  AdjustedSize: TPoint;

  DC: HDC;
  R: TRect;
begin

  if Succeeded(Ole.QueryInterface(IViewObject2, ViewObject2)) then
  begin
    ViewObject2.GetExtent(DVASPECT_CONTENT, -1, nil, ViewSize);

    DC := GetDC(0);
    AdjustedSize.X := MulDiv(ViewSize.X, GetDeviceCaps(DC, LOGPIXELSX), 2540);
    AdjustedSize.Y := MulDiv(ViewSize.Y, GetDeviceCaps(DC, LOGPIXELSY), 2540);
    ReleaseDC(0, DC);

    Bmp.Height := AdjustedSize.Y;
    Bmp.Width := AdjustedSize.X;

    SetRect(R, 0, 0, Bmp.Width, Bmp.Height);

    OleDraw(Ole, DVASPECT_CONTENT, Bmp.Canvas.Handle, R);
  end
  else
  begin
    raise Exception.Create('Could not get the IViewObject2 interfact on the OleObject');
  end;

end;

10-02 11:13