俺想实现图文混排编辑器,但问题极多,请高手指点迷津

skertone 2005-03-17 05:04:24
俺想用RxRichedit(或用RichEdit自已申明接口)实现图文混排

但是插入的图片要不可以拉大拉小(以{\pic方式}

要不就是双击后会用画图打开来(以{\*\Object}方式)

有没办法解决呢?

像QQ MSN的输入区哪样,人家的图片不能拉动改变大小

也不能双击打开呀。。。。郁闷 RxRichEdit里根本没控制这个滴属性

还请高手指点。。。
----------------------------------------------
研究几天后抄到不少资料后俺用以下方式加入图片使其不能被选择

function InsertBitmapObject(Editor: THandle;BmpFile: String): Boolean;
var
RichEditOLE: IRichEditOle;
FOle: IOleObject;
FormatEtc: TFormatEtc;
FStorage: ISTORAGE;
FClientSite: IOleClientSite;
FLockBytes: ILockBytes;
ReObject: TReObject;
xt: TGuid;
FTemp: IUnknown;
begin
Result := False;
if not FileExists(BmpFile) then Exit;
try
if not GetRichOleInterface(Editor,RichEditOLE,FClientSite) then Exit;

CreateIStorage(FStorage);

with FormatEtc do
begin
cfFormat := 0;
ptd := nil;
dwAspect := DVASPECT_CONTENT;
lindex := -1;
tymed := TYMED_NULL;
end;

//从文件中创建一个Ole对象
if OleCreateFromFile(GUID_NULL,
PWideChar(WideString(BmpFile)),
IID_IUnknown,
0,
@FormatEtc,
FClientSite,
FStorage,
FOle) <> S_OK then Exit;

FTemp := FOle;
FTemp.QueryInterface(IID_IOleObject, FOle);
OleSetContainedObject(FOle, True);
ReObject.cbStruct := SizeOf(TReObject);
FOle.GetUserClassID(xt);

with ReObject do
begin
clsid := xt;
cp := ULong(REO_CP_SELECTION);
dvaspect := DVASPECT_CONTENT;
dwFlags := ULong(REO_STATIC) or ULong(REO_BELOWBASELINE);
dwUser := 0;
oleobj := FOle;
olesite := FClientSite;
stg := FStorage;
sizel.cx := 0;
sizel.cy := 0;
end;
RichEditOLE.InsertObject(ReObject);
finally
RichEditOLE:=nil;
FOle := nil;
end;
Result := True;
end;

用下以注册消息窗口方式滤掉双击消息
RichEdit_SetOleCallback(FEditor,TRichEditOleCallback.Create);
FNewProc := MakeObjectInstance(EditorMsgProc);
FOldProc := Pointer(SetWindowLong(FEditor,GWL_WNDPROC,LongInt(FNewProc)));

begin
case Msg.Msg of
WM_LBUTTONDBLCLK: ; //滤掉掉鼠标双击
EM_SETRECT: ;
else
Msg.Result := CallWindowProc(FOldProc,FEditor,Msg.Msg,Msg.WParam,Msg.LParam)
end;

同时我用以下方式来枚举并取得已存在的Object!!并改之。。。。

var
ii: Integer;
RichEditOle : IRichEditOle;
ReObject : TReObject;
begin
RichEdit_GetOleInterface(Editor,RichEditOle);
Result := RichEditOle.GetObjectCount;

if Result > 0 then
for ii := Result - 1 downto 0 do
begin
FillChar(ReObject, SizeOf(ReObject), 0);
ReObject.cbStruct := SizeOf(ReObject);

OleCheck(RichEditOle.GetObject(Longint(ii),ReObject,REO_GETOBJ_ALL_INTERFACES));

ReObject.dwFlags := 2;
OleCheck(ReObject.oleobj.Update);

end;

但是我Update之后,ReObject的对象属性并没更新啊,,我是想改其dwFlags!!

何改,不知哪里出问题了。。。郁闷 ing.......痛苦ing...
...全文
247 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
skertone 2005-03-28
  • 打赏
  • 举报
回复
结了
skertone 2005-03-28
  • 打赏
  • 举报
回复
项目时间所逼只有采用自定义存储方格式了,感谢楼上各位帮顶结帖,大家平分分了吧
caiso 2005-03-27
  • 打赏
  • 举报
回复
帮顶一下
码农天天向上 2005-03-26
  • 打赏
  • 举报
回复
顶顶
Heyongfeng 2005-03-21
  • 打赏
  • 举报
回复
关注
herman~~ 2005-03-19
  • 打赏
  • 举报
回复
帮顶
skertone 2005-03-19
  • 打赏
  • 举报
回复
没办法,自己顶!!
todouwang 2005-03-18
  • 打赏
  • 举报
回复
代码有点长,顶一下先
skertone 2005-03-18
  • 打赏
  • 举报
回复
终于有人来看看啦,俺还是精简一下

现在有两个问题

1.在RichEdit Insert一个Object后 保存成*.rtf文件,再Load出来时这个object跟保存前属性不一样!!

Insert时真充了以下内容
with ReObject do
begin
clsid := xt;
cp := ULong(REO_CP_SELECTION);
dvaspect := DVASPECT_CONTENT;
dwFlags := ULong(REO_STATIC) or ULong(REO_BELOWBASELINE);
dwUser := 0;
oleobj := FOle;
olesite := FClientSite;
stg := FStorage;
sizel.cx := 0;
sizel.cy := 0;
end;
RichEditOLE.InsertObject(ReObject);

Load 出来后再读出这个ReObject发现内容值不一样了

2.为了实现Insert的Object(多是bmp图片) 不能被用户拉动改变大小使用了

ReObject.dwFlags := ULong(REO_STATIC) or ULong(REO_BELOWBASELINE);

这样的代码可以让其OLEObject不能拉动改变大小,但是对已经存在的OLEObject俺读出其ReObejct结构修改其dwFlags更新竟无效!!
如下代码:
//..here..Get OLEInterface and ReObject Struct.........
ReObject.dwFlags := 2; //这个 2表示不能拉动改变对象大小
OleCheck(ReObject.oleobj.Update);

end;
是不是哪里我做错了,还是保存成*.rtf 肯本就没有ReObject里的信息?

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧