📄 richeditole.cs
字号:
namespace Imps.Client.Pc.BizControls
{
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
internal class RichEditOle
{
private ChatRichTextBox _richEdit;
private Imps.Client.Pc.BizControls.IRichEditOle _RichEditOle;
public const int EM_GETOLEINTERFACE = 0x43c;
public const int WM_USER = 0x400;
public RichEditOle(ChatRichTextBox richEdit)
{
this._richEdit = richEdit;
}
[DllImport("ole32.dll")]
internal static extern int CreateILockBytesOnHGlobal(IntPtr hGlobal, bool fDeleteOnRelease, out Imps.Client.Pc.BizControls.ILockBytes ppLkbyt);
public void InsertControl(Control control)
{
if (control != null)
{
Imps.Client.Pc.BizControls.ILockBytes ppLkbyt;
Imps.Client.Pc.BizControls.IStorage ppstgOpen;
Imps.Client.Pc.BizControls.IOleClientSite site;
Guid guid = Marshal.GenerateGuidForType(control.GetType());
CreateILockBytesOnHGlobal(IntPtr.Zero, true, out ppLkbyt);
StgCreateDocfileOnILockBytes(ppLkbyt, 0x1012, 0, out ppstgOpen);
this.IRichEditOle.GetClientSite(out site);
REOBJECT lpreobject = new REOBJECT();
lpreobject.cp = this._richEdit.TextLength;
lpreobject.clsid = guid;
lpreobject.pstg = ppstgOpen;
lpreobject.poleobj = Marshal.GetIUnknownForObject(control);
lpreobject.polesite = site;
lpreobject.dvAspect = 1;
lpreobject.dwFlags = 2;
lpreobject.dwUser = 1;
this.IRichEditOle.InsertObject(lpreobject);
Marshal.ReleaseComObject(ppLkbyt);
Marshal.ReleaseComObject(site);
Marshal.ReleaseComObject(ppstgOpen);
}
}
public bool InsertImageFromFile(string strFilename)
{
Imps.Client.Pc.BizControls.ILockBytes ppLkbyt;
Imps.Client.Pc.BizControls.IStorage ppstgOpen;
Imps.Client.Pc.BizControls.IOleClientSite site;
object ppvObj;
CreateILockBytesOnHGlobal(IntPtr.Zero, true, out ppLkbyt);
StgCreateDocfileOnILockBytes(ppLkbyt, 0x1012, 0, out ppstgOpen);
this.IRichEditOle.GetClientSite(out site);
Imps.Client.Pc.BizControls.FORMATETC pFormatEtc = new Imps.Client.Pc.BizControls.FORMATETC();
pFormatEtc.cfFormat = (CLIPFORMAT) 0;
pFormatEtc.ptd = IntPtr.Zero;
pFormatEtc.dwAspect = DVASPECT.DVASPECT_CONTENT;
pFormatEtc.lindex = -1;
pFormatEtc.tymed = TYMED.TYMED_NULL;
Guid riid = new Guid("{00000112-0000-0000-C000-000000000046}");
Guid rclsid = new Guid("{00000000-0000-0000-0000-000000000000}");
ChatRichTextBox.OleCreateFromFile(ref rclsid, strFilename, ref riid, 1, ref pFormatEtc, site, ppstgOpen, out ppvObj);
if (ppvObj == null)
{
Marshal.ReleaseComObject(ppLkbyt);
Marshal.ReleaseComObject(site);
Marshal.ReleaseComObject(ppstgOpen);
return false;
}
Imps.Client.Pc.BizControls.IOleObject pUnk = (Imps.Client.Pc.BizControls.IOleObject) ppvObj;
Guid pClsid = new Guid();
pUnk.GetUserClassID(ref pClsid);
ChatRichTextBox.OleSetContainedObject(pUnk, true);
REOBJECT lpreobject = new REOBJECT();
lpreobject.cp = this._richEdit.TextLength;
lpreobject.clsid = pClsid;
lpreobject.pstg = ppstgOpen;
lpreobject.poleobj = Marshal.GetIUnknownForObject(pUnk);
lpreobject.polesite = site;
lpreobject.dvAspect = 1;
lpreobject.dwFlags = 2;
lpreobject.dwUser = 0;
this.IRichEditOle.InsertObject(lpreobject);
Marshal.ReleaseComObject(ppLkbyt);
Marshal.ReleaseComObject(site);
Marshal.ReleaseComObject(ppstgOpen);
Marshal.ReleaseComObject(pUnk);
return true;
}
public REOBJECT InsertOleObject(Imps.Client.Pc.BizControls.IOleObject oleObject, Size size, int index)
{
Imps.Client.Pc.BizControls.ILockBytes ppLkbyt;
Imps.Client.Pc.BizControls.IStorage ppstgOpen;
Imps.Client.Pc.BizControls.IOleClientSite site;
if (oleObject == null)
{
return null;
}
CreateILockBytesOnHGlobal(IntPtr.Zero, true, out ppLkbyt);
StgCreateDocfileOnILockBytes(ppLkbyt, 0x1012, 0, out ppstgOpen);
this.IRichEditOle.GetClientSite(out site);
Guid pClsid = new Guid();
oleObject.GetUserClassID(ref pClsid);
ChatRichTextBox.OleSetContainedObject(oleObject, true);
REOBJECT lpreobject = new REOBJECT();
lpreobject.cp = -1;
lpreobject.clsid = pClsid;
lpreobject.pstg = ppstgOpen;
lpreobject.poleobj = Marshal.GetIUnknownForObject(oleObject);
lpreobject.polesite = site;
lpreobject.dvAspect = 1;
lpreobject.dwFlags = 2;
lpreobject.dwUser = (uint) index;
lpreobject.sizel = size;
this.IRichEditOle.InsertObject(lpreobject);
Marshal.ReleaseComObject(ppLkbyt);
Marshal.ReleaseComObject(site);
Marshal.ReleaseComObject(ppstgOpen);
return lpreobject;
}
[DllImport("ole32.dll")]
private static extern int StgCreateDocfileOnILockBytes(Imps.Client.Pc.BizControls.ILockBytes plkbyt, uint grfMode, uint reserved, out Imps.Client.Pc.BizControls.IStorage ppstgOpen);
public void UpdateObjects()
{
int objectCount = this.IRichEditOle.GetObjectCount();
for (int i = 0; i < objectCount; i++)
{
REOBJECT lpreobject = new REOBJECT();
this.IRichEditOle.GetObject(i, lpreobject, GETOBJECTOPTIONS.REO_GETOBJ_ALL_INTERFACES);
Point positionFromCharIndex = this._richEdit.GetPositionFromCharIndex(lpreobject.cp);
Rectangle rc = new Rectangle(positionFromCharIndex.X, positionFromCharIndex.Y, 50, 50);
this._richEdit.Invalidate(rc, false);
}
}
public void UpdateObjects(int index)
{
REOBJECT lpreobject = new REOBJECT();
this.IRichEditOle.GetObject(index, lpreobject, GETOBJECTOPTIONS.REO_GETOBJ_ALL_INTERFACES);
if (lpreobject.dwUser == 1)
{
Point location = this._richEdit.GetPositionFromCharIndex(lpreobject.cp);
Rectangle rc = new Rectangle(location, lpreobject.sizel);
this._richEdit.Invalidate(rc, false);
}
}
public Imps.Client.Pc.BizControls.IRichEditOle IRichEditOle
{
get
{
if (this._RichEditOle == null)
{
this._RichEditOle = ChatRichTextBox.SendMessage(this._richEdit.Handle, 0x43c, 0);
}
return this._RichEditOle;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -