⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 richeditole.cs

📁 破解的飞信源代码
💻 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 + -