画笔中的图片如何保存。(tolecontainer中) (30分)

  • 主题发起人 主题发起人 Jamw
  • 开始时间 开始时间
J

Jamw

Unregistered / Unconfirmed
GUEST, unregistred user!
我用OLECONTAINER在程序中嵌入“画笔”。能够打开画笔,并在其中画画。
但不知如何才能保存为BMP格式。
或者用什么方法可以使“画笔”能够打开OLECONTAINER保存的结果。
 
procedure TForm1.SaveBmpBtnClick(Sender: TObject);
var
Data: IDataObject;
SM: TStgMedium;
FormatEtc: TFormatEtc;
Bmp: TBitmap;
begin
OleContainer1.DoVerb(ovShow);
Data := OleContainer1.OleObjectInterface as IDataObject;

FormatEtc.cfFormat := CF_BITMAP;
FormatEtc.tymed := TYMED_GDI;
FormatEtc.ptd := nil;
FormatEtc.dwAspect := DVASPECT_CONTENT;
FormatEtc.lindex := -1;

Bmp := TBitmap.Create;
try
OleCheck(Data.GetData(FormatEtc, SM));
try
Bmp.LoadFromClipboardFormat(CF_BITMAP, SM.hBitmap, 0);
Bmp.SaveToFile('C:/My Documents/Test.bmp');
finally
ReleaseStgMedium(SM);
end;
finally
Bmp.Free;
end;
end;
 
to DragonPC_???
你的这些变量类型是在什么单元定义的?为什么我这显示没有定义呢?
 
为什么下面这句在我这通不过呢?我用的DELPHI5+PWIN98
Data := OleContainer1.OleObjectInterface as IDataObject;
显示如下错误:Operator not applicable to this operand type.
而且说没有定义OleCheck这个过程
 
use ActiveX, OLE2, ComObj ;
 
>> 为什么下面这句在我这通不过呢?我用的DELPHI5+PWIN98
>> Data := OleContainer1.OleObjectInterface as IDataObject;
试着换为:
OleCheck(OleContainer1.OleObjectInterface.QueryInterface(IDataObject, Data));

OLECheck应该在 ComObj 单元里面,use ComObj ;,如果不在这个单元,你自己找找就是了,
不要这都要到处问吗。
 
批评的对。不过现在我对OLE还不怎么了解。又急着做出来,只好通过别人的例子来学习了。
请见谅。
OleObjectInterface.QueryInterface中第一个参数是TGUID类型的。而IDATAOBJECT是CLASS
REFERENCE。这两者怎么样才能变成同类型的呢?
 
还想请问一下。你上面的程序中好象没有将OLECONTAINER中的内容复制到剪贴板的语句呀。
能说明一下吗?谢谢。
 
>> OleObjectInterface.QueryInterface中第一个参数是TGUID类型的。而IDATAOBJECT是CLASS
>> REFERENCE。这两者怎么样才能变成同类型的呢?
IDataObject是接口,一定就有GUID声明,注册表里面也会有痕迹,这是绝对的。这个函数的具
体调用方法我也记不清楚了,请自己求证。对不起。

>> 还想请问一下。你上面的程序中好象没有将OLECONTAINER中的内容复制到剪贴板的语句呀。
>> 能说明一下吗?谢谢。
OLECONTAINER应该有copy、PasteFromClipboard方法的,我没有实验,所以没有发言权。另
外Jamw兄,我的代码应该是没有问题的,因为那是我以前的源码片段里面截取下来的,你的
问题可能是新的Delphi更改了接口方面的实现,可惜我现在已经不是一个Delphi程序员了,
所以电脑没有安装Delphi,这些东西不调试,我就不好说了。

看看其它高手有什么意见吧,我这段时间实在太忙了,不方便和你一块研究。:(
 
谢谢你的答复。高手们,帮帮忙。多提些方法。
 
高手,这个问题我想了好久也没有答案,今天终于找到了,这个程序在d5+win98下可用
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, OleCtnrs, ActiveX, ComObj, ComCtrls;

type
TForm1 = class(TForm)
OleContainer1: TOleContainer;
Button1: TButton;
DateTimePicker1: TDateTimePicker;
Button2: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
Data: IDataObject;
SM: TStgMedium;
FormatEtc: TFormatEtc;
Bmp: TBitmap;
begin
OleContainer1.DoVerb(ovShow);
Data := OleContainer1.OleObjectInterface as IDataObject;

FormatEtc.cfFormat := CF_BITMAP;
FormatEtc.tymed := TYMED_GDI;
FormatEtc.ptd := nil;
FormatEtc.dwAspect := DVASPECT_CONTENT;
FormatEtc.lindex := -1;

Bmp := TBitmap.Create;
try
OleCheck(Data.GetData(FormatEtc, SM));
try
Bmp.LoadFromClipboardFormat(CF_BITMAP, SM.hBitmap, 0);
Bmp.SaveToFile('e:/Test.bmp');
finally
ReleaseStgMedium(SM);
end;
finally
Bmp.Free;
end;
end;

end.
 
我可真笨。这种问题都没找出来。
谢谢WHF。也谢谢DRAGONPC——???的回答。
 
多人接受答案了。
 
现在是2003年5月23日,时过一年多不知道上面几位还好吗? 真要谢谢楼主提出和我同样的问题
更要感谢给出答案的whf和DragonPC_??? 谢谢你们 可解决了我的棘手的问题了!!祝好运!
 
后退
顶部