• PCB Winform中的WebBrowser扩展拖放(拖拽)功能 实现方法


    我们在Winform支持网页通常增加WebBrowser控件实现,相当于内嵌浏览器浏览网页使用,

    而此WebBrowser默认情况是文件拖入功能是不支持的,

    如何才能支持呢。在这里介绍如何实现方法

    一.直接上源码吧,

           下载后直接用,其实不要了解太深入,会用就行了啦(用之前,网页需有加入JS drop功能)

          下载地址   http://pcbren.cn/ShareFiles/WebbrowserDemoDrop.zip

    二.实现拖拽是重构WebBrowser浏览器Drag事件,让浏览器支持拖拽功能,以下为部份代码:

        public partial class ExtendedWebBrowser : System.Windows.Forms.WebBrowser, MsHtmHstInterop.IDocHostUIHandler, MsHtmHstInterop.IDropTarget, IEInterface.IWebBrowser2
        {
            
            public event Events.DragEnterEventHander ExDragEnter;
            private Events.DragEnterEventArgs dragEnterEventArgs;
            public event Events.DragOverEventHander ExDragOver;
            private Events.DragOverEventArgs dragOverEventArgs;
            public event Events.DragLeaveEventHander ExDragLeave;
            public event Events.DragDropEventHander ExDragDrop;
            private Events.DragDropEventArgs dragDropEventArgs;
            private bool registerAsDropTarget = true;
            private bool registerAsBrowser = true;
            private bool slient = true;
            MsHtmHstInterop.IDropTarget pDropTarget;//保存原有的拖放对象
            private bool isDragToInputBox = false;//判断是否是在向输入框中拖放
    
            public ExtendedWebBrowser()
            {
                InitializeComponent();
                this.AllowWebBrowserDrop = true;
                Navigate("about:blank");
                MsHtmHstInterop.ICustomDoc idoc = this.Document.DomDocument as MsHtmHstInterop.ICustomDoc;
                idoc.SetUIHandler(this as MsHtmHstInterop.IDocHostUIHandler);
                dragEnterEventArgs = new Events.DragEnterEventArgs();
                dragOverEventArgs = new Events.DragOverEventArgs();
                dragDropEventArgs = new Events.DragDropEventArgs();
            }
    
    
    
            #region 获取新窗口Url
            AxHost.ConnectionPointCookie cookie;
            WebBrowserExtendedEvents events;
    
            //This method will be called to give you a chance to create your own event sink
            protected override void CreateSink()
            {
                //MAKE SURE TO CALL THE BASE or the normal events won't fire
                base.CreateSink();
                events = new WebBrowserExtendedEvents(this);
                cookie = new AxHost.ConnectionPointCookie(this.ActiveXInstance, events, typeof(LuckyPang.ControlLibrary.IEInterface.DWebBrowserEvents2));
            }
    
            protected override void DetachSink()
            {
                if (null != cookie)
                {
                    cookie.Disconnect();
                    cookie = null;
                }
                base.DetachSink();
            }
    
            //This new event will fire when the page is navigating
            public event EventHandler<WebBrowserExtendedNavigatingEventArgs> ExtendedNavigating;
    
            protected void OnExtendedNavigating(string url, string frame, out bool cancel)
            {
                EventHandler<WebBrowserExtendedNavigatingEventArgs> h = ExtendedNavigating;
                WebBrowserExtendedNavigatingEventArgs args = new WebBrowserExtendedNavigatingEventArgs(url, frame);
                if (null != h)
                {
                    h(this, args);
                }
                //Pass the cancellation chosen back out to the events
                cancel = args.Cancel;
            }
    
            public event EventHandler<WebBrowserExtendedNewWindowEventArgs> ExtendedNewWindow;
    
            protected void OnExtendedNewWindow(string url,out bool cancel)
            {
                EventHandler<WebBrowserExtendedNewWindowEventArgs> h = ExtendedNewWindow;
                WebBrowserExtendedNewWindowEventArgs args = new WebBrowserExtendedNewWindowEventArgs(url);
                if (null != h)
                {
                    h(this, args);
                }
                //Pass the cancellation chosen back out to the events
                cancel = args.Cancel;
            }
    
            public event EventHandler<Events.WebBrowserExtendedWindowClosingEventArgs> ExtendedWindowClosing;
            protected void OnExtendWindowClosing(out bool cancel)
            {
                EventHandler<Events.WebBrowserExtendedWindowClosingEventArgs> h = ExtendedWindowClosing;
                Events.WebBrowserExtendedWindowClosingEventArgs args = new Events.WebBrowserExtendedWindowClosingEventArgs();
                if (null != h)
                {
                    h(this, args);
                }
                //Pass the cancellation chosen back out to the events
                cancel = args.Cancel;
            }
    
            //This class will capture events from the WebBrowser
            class WebBrowserExtendedEvents : System.Runtime.InteropServices.StandardOleMarshalObject, LuckyPang.ControlLibrary.IEInterface.DWebBrowserEvents2
            {
                ExtendedWebBrowser _Browser;
                private bool m_bPop;
                public WebBrowserExtendedEvents(ExtendedWebBrowser browser)
                { _Browser = browser; }
    
                //Implement whichever events you wish
                public void BeforeNavigate2(object pDisp, ref object URL, ref object flags, ref object targetFrameName, ref object postData, ref object headers, ref bool cancel)
                {
                    _Browser.OnExtendedNavigating((string)URL, (string)targetFrameName, out cancel);
                }
    
                public void NewWindow3(ref object ppDisp, ref bool Cancel, uint dwFlags, string bstrUrlContext, string bstrUrl)
                {
                    _Browser.OnExtendedNewWindow(bstrUrl, out Cancel);
                }
    
                #region DWebBrowserEvents2 成员
    
                public void StatusTextChange(string Text)
                {
                    throw new NotImplementedException();
                }
    
                public void ProgressChange(int Progress, int ProgressMax)
                {
                    throw new NotImplementedException();
                }
    
                public void CommandStateChange(int Command, bool Enable)
                {
                    throw new NotImplementedException();
                }
    
                public void DownloadBegin()
                {
                    m_bPop = false;
                }
    
                public void DownloadComplete()
                {
                    m_bPop = true;
                }
    
                public void TitleChange(string Text)
                {
                    throw new NotImplementedException();
                }
    
                public void PropertyChange(string szProperty)
                {
                    throw new NotImplementedException();
                }
    
                public void NewWindow2(ref object ppDisp, ref bool Cancel)
                {
                    Cancel = m_bPop;
                }
    
                public void NavigateComplete2(object pDisp, ref object URL)
                {
                    throw new NotImplementedException();
                }
    
                public void DocumentComplete(object pDisp, ref object URL)
                {
                    throw new NotImplementedException();
                }
    
                public void OnQuit()
                {
                    throw new NotImplementedException();
                }
    
                public void OnVisible(bool Visible)
                {
                    throw new NotImplementedException();
                }
    
                public void OnToolBar(bool ToolBar)
                {
                    throw new NotImplementedException();
                }
    
                public void OnMenuBar(bool MenuBar)
                {
                    throw new NotImplementedException();
                }
    
                public void OnStatusBar(bool StatusBar)
                {
                    throw new NotImplementedException();
                }
    
                public void OnFullScreen(bool FullScreen)
                {
                    throw new NotImplementedException();
                }
    
                public void OnTheaterMode(bool TheaterMode)
                {
                    throw new NotImplementedException();
                }
    
                public void WindowSetResizable(bool Resizable)
                {
                    throw new NotImplementedException();
                }
    
                public void WindowSetLeft(int Left)
                {
                    throw new NotImplementedException();
                }
    
                public void WindowSetTop(int Top)
                {
                    throw new NotImplementedException();
                }
    
                public void WindowSetWidth(int Width)
                {
                    throw new NotImplementedException();
                }
    
                public void WindowSetHeight(int Height)
                {
                    throw new NotImplementedException();
                }
    
                public void WindowClosing(bool IsChildWindow, ref bool Cancel)
                {
                    _Browser.OnExtendWindowClosing(out Cancel);
                }
    
                public void ClientToHostWindow(ref int CX, ref int CY)
                {
                    throw new NotImplementedException();
                }
    
                public void SetSecureLockIcon(int SecureLockIcon)
                {
                    throw new NotImplementedException();
                }
    
                public void FileDownload(ref bool Cancel)
                {
                    throw new NotImplementedException();
                }
    
                public void NavigateError(object pDisp, ref object URL, ref object Frame, ref object StatusCode, ref bool Cancel)
                {
                    throw new NotImplementedException();
                }
    
                public void PrintTemplateInstantiation(object pDisp)
                {
                    throw new NotImplementedException();
                }
    
                public void PrintTemplateTeardown(object pDisp)
                {
                    throw new NotImplementedException();
                }
    
                public void UpdatePageStatus(object pDisp, ref object nPage, ref object fDone)
                {
                    throw new NotImplementedException();
                }
    
                public void PrivacyImpactedStateChange(bool bImpacted)
                {
                    throw new NotImplementedException();
                }
    
                #endregion
            }
            #endregion
    
            #region IDocHostUIHandler 成员
    
            void MsHtmHstInterop.IDocHostUIHandler.EnableModeless(int fEnable)
            {
                throw new NotImplementedException();
            }
    
            void MsHtmHstInterop.IDocHostUIHandler.FilterDataObject(MsHtmHstInterop.IDataObject pDO, out MsHtmHstInterop.IDataObject ppDORet)
            {
                ppDORet = pDO;
            }
    
            void MsHtmHstInterop.IDocHostUIHandler.GetDropTarget(MsHtmHstInterop.IDropTarget pDropTarget, out MsHtmHstInterop.IDropTarget ppDropTarget)
            {
                this.pDropTarget = pDropTarget;//保存默认的对象
                ppDropTarget = this as MsHtmHstInterop.IDropTarget ;//把当前对角注册为拖放对象
            }
    
            void MsHtmHstInterop.IDocHostUIHandler.GetExternal(out object ppDispatch)
            {
                if (this.ObjectForScripting != null)
                {
                    ppDispatch = this.ObjectForScripting;
                }
                else
                {
                    ppDispatch = null;
                }
            }
    
            void MsHtmHstInterop.IDocHostUIHandler.GetHostInfo(ref MsHtmHstInterop._DOCHOSTUIINFO pInfo)
            {
                pInfo.dwFlags = 0x00040000;
            }
    
            void MsHtmHstInterop.IDocHostUIHandler.GetOptionKeyPath(out string pchKey, uint dw)
            {
                throw new NotImplementedException();
            }
    
            void MsHtmHstInterop.IDocHostUIHandler.HideUI()
            {
                throw new NotImplementedException();
            }
    
            void MsHtmHstInterop.IDocHostUIHandler.OnDocWindowActivate(int fActivate)
            {
                throw new NotImplementedException();
            }
    
            void MsHtmHstInterop.IDocHostUIHandler.OnFrameWindowActivate(int fActivate)
            {
                throw new NotImplementedException();
            }
    
            void MsHtmHstInterop.IDocHostUIHandler.ResizeBorder(ref MsHtmHstInterop.tagRECT prcBorder, MsHtmHstInterop.IOleInPlaceUIWindow pUIWindow, int fRameWindow)
            {
                throw new NotImplementedException();
            }
    
            void MsHtmHstInterop.IDocHostUIHandler.ShowContextMenu(uint dwID, ref MsHtmHstInterop.tagPOINT ppt, object pcmdtReserved, object pdispReserved)
            {
                throw new NotImplementedException();
            }
    
            void MsHtmHstInterop.IDocHostUIHandler.ShowUI(uint dwID, MsHtmHstInterop.IOleInPlaceActiveObject pActiveObject, MsHtmHstInterop.IOleCommandTarget pCommandTarget, MsHtmHstInterop.IOleInPlaceFrame pFrame, MsHtmHstInterop.IOleInPlaceUIWindow pDoc)
            {
                if (pActiveObject != null)
                {
                    pActiveObject.GetWindow((IntPtr )0);
                }
            }
    
            void MsHtmHstInterop.IDocHostUIHandler.TranslateAccelerator(ref MsHtmHstInterop.tagMSG lpmsg, ref Guid pguidCmdGroup, uint nCmdID)
            {
                throw new NotImplementedException();
            }
    
            void MsHtmHstInterop.IDocHostUIHandler.TranslateUrl(uint dwTranslate, ref ushort pchURLIn, IntPtr ppchURLOut)
            {
                throw new NotImplementedException();
            }
    
            void MsHtmHstInterop.IDocHostUIHandler.UpdateUI()
            {
                throw new NotImplementedException();
            }
    
            #endregion
    
            #region IDropTarget 成员
    
            public new void DragEnter(MsHtmHstInterop.IDataObject pDataObj, uint grfKeyState, MsHtmHstInterop._POINTL pt, ref uint pdwEffect)
            {
                pDropTarget.DragEnter(pDataObj, grfKeyState, pt, ref pdwEffect);//调用默认方法
                //获取拖动的参数
                if (ExDragEnter != null)
                {
                    DataObject dobj = null;
                    if (pDataObj != null)
                    {
                        dobj = new DataObject(pDataObj);//拖动数据
                        Point p = new Point(pt.x, pt.y);//鼠标在容器上的位置
                        dragEnterEventArgs.SetParameters(dobj, grfKeyState, p, pdwEffect);
                        ExDragEnter(this, dragEnterEventArgs);//此处为自定义事件
                        if (dragEnterEventArgs.handled)//自定义事件的返回值
                        {
                            pdwEffect = dragEnterEventArgs.pdwEffect;
                        }
                    }
                }
            }
    
            public new void DragLeave()
            {
                pDropTarget.DragLeave();//调用默认的方法
                if (ExDragLeave != null)
                {
                    ExDragLeave(this);//自定义事件
                }
            }
    
            public new void DragOver(uint grfKeyState, MsHtmHstInterop._POINTL pt, ref uint pdwEffect)
            {
                uint temp = pdwEffect;//保存原有的拖放效果,当调用默认的
                                      //操作时此参数会改变,并根据此来判
                                      //断是否向输入框中拖放
    
                pDropTarget.DragOver(grfKeyState, pt, ref pdwEffect);//调用默认方法        
                if (pdwEffect > 0)//如果值变为了零,那么是向输入框中拖放了
                {
                    isDragToInputBox = true;//标记设为true
                    temp = 0;
                }
                else
                {
                    isDragToInputBox = false;//否则标记设为false
                    pdwEffect = temp;
                }
                if (ExDragOver != null)//自定义事件处理
                {
                    Point p = new Point(pt.x, pt.y);
                    dragOverEventArgs.SetParameters(grfKeyState, p, temp);
                    if (dragOverEventArgs.handled)
                    {
                        pdwEffect = dragOverEventArgs.pdwEffect;
                    }
                }
            }
    
            public void Drop(MsHtmHstInterop.IDataObject pDataObj, uint grfKeyState, MsHtmHstInterop._POINTL pt, ref uint pdwEffect)
            {
                if (ExDragDrop != null)//自定义事件处理
                {
                    if (pDataObj != null && !isDragToInputBox )//如果没有向输入框中拖放则触发此事件
                                                               //否则按默认处理
                    {
                        DataObject dobj = new DataObject(pDataObj);
                        Point p = new Point(pt.x, pt.y);
                        dragDropEventArgs.SetParameters(dobj, grfKeyState, p, pdwEffect);
                        ExDragDrop(this, dragDropEventArgs);
                        if (dragDropEventArgs.handled)
                        {
                            pdwEffect = dragDropEventArgs.pdwEffect;
                        }
                    }
                }
                pDropTarget.Drop(pDataObj, grfKeyState, pt, ref pdwEffect);//调用默认方法
            }
    
            #endregion
    
            #region IWebBrowser2 成员
    
            public bool RegisterAsDropTarget
            {
                get
                {
                    return registerAsDropTarget;
                }
                set
                {
                    registerAsDropTarget = value;
                }
            }
            public bool Silent
            {
                get
                {
                    return slient;
                }
                set
                {
                    slient = value;
                }
            }
    
            public bool RegisterAsBrowser 
            { 
                get
                {
                    return registerAsBrowser; 
                }
                set
                {
                    registerAsBrowser = value;
                }
            }
            #endregion
        }
    View Code


    三.拖拽界面展示:

  • 相关阅读:
    [leetcode]791. Custom Sort String自定义排序字符串
    [leetcode]304. Range Sum Query 2D
    [leetcode]339. Nested List Weight Sum嵌套列表加权和
    [leetcode]81. Search in Rotated Sorted Array II旋转过有序数组里找目标值II(有重)
    [leetcode]170. Two Sum III
    [leetcode]341. Flatten Nested List Iterator展开嵌套列表的迭代器
    [leetcode]445. Add Two Numbers II 两数相加II
    Node 连接mysql数据库
    Restful 表述性状态传递
    node Express 框架
  • 原文地址:https://www.cnblogs.com/pcbren/p/9597422.html
Copyright © 2020-2023  润新知