俺想实现图文混排编辑器,但问题极多,请高手指点迷津
俺想用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...