CefSharp中的可拖动无边框窗口我找到了一些有用的例子(比如Chrome的无框窗口),这是我尝试过的:}可拖动区域然后,在C#代码中我实现添加了IDragHandler类:internalclassPromtDragHandler:IDragHandler{boolIDragHandler.OnDragEnter(IWebBrowserbrowserControl,IBrowserbrowser,IDragDatadragData,DragOperationsMaskmask){returnfalse;}voidIDragHandler.OnDraggableRegionsChanged(IWebBrowserListIBbrowserControl,method}OnDraggableRegionsChanged在开始时触发一次,当我拖动元素“标题区域”的一些文本时OnDragEnter触发。但我不知道下一步该怎么做才能让我的窗口移动?更新。如评论中所述,CefTestApp支持此拖动功能。在源代码中,我们有从DragHandler调用的方法OnSetDraggableRegions://重置可拖动区域。::SetRectRgn(draggable_region_,0,0,0,0);//确定新的可拖动区域。std::vector::const_iteratorit=regions.begin();for(;it!=regions.end();++it){HRGNregion=::CreateRectRgn(it->bounds.x,it->bounds.y,it->bounds.x+it->bounds.宽度,it->bounds.y+it->bounds.height);::CombineRgn(draggable_region_,draggable_region_,region,it->draggable?RGN_OR:RGN_DIFF);::DeleteObject(区域);}//子类化子窗口过程以进行命中测试。//如果它已经被子类化,这将是一个空操作。如果(hwnd_){WNDENUMPROCproc=!regions.empty()?子类WindowsProc:UnSubclassWindowsProc;::EnumChildWindows(hwnd_,proc,reinterpret_cast(draggable_region_));我还是不太明白,关于可拖动区域(一开始只触发一次)如何帮助移动窗口?有人可以向我解释这个逻辑或提供C#这段代码的等价物是什么?UPDATE2我做到了。这是我添加到表格代码中的内容:IntPtrDragableRegionNative=Native.CreateRectRgn(0,0,0,0);voidRegionsChangedCallback(DraggableRegion[]Regions){Native.SetRectRgn(DragableRegionNative,0,0,0,0);如果(区域==null)返回;foreach(varRegioninRegions){varRegionNative=Native.CreateRectRgn(Region.X,Region.Y,Region.X+Region.Width,Region.Y+Region.Height);Native.CombineRgn(DragableRegionNative,DragableRegionNative,RegionNative,Region.Draggable?(int)Native.CombineRgnStyles.RGN_OR:(int)Native.CombineRgnStyles.RGN_DIFF);Native.DeleteObject(RegionNative);}}点dragOffset=newPoint();protectedoverridevoidOnMouseDown(MouseEventArgse){base.OnMouseDown(e);if(e.Button==MouseButtons.Left){dragOffset=this.PointToScreen(e.Location);dragOffset.X-=Location.X;dragOffset.Y-=Location.Y;}}protectedoverridevoidOnMouseMove(MouseEventArgse){base.OnMouseMove(e);if(e.Button==MouseButtons.Left){点newLocatinewLocation.X-=dragOffset.X;newLocation.Y-=dragOffset.Y;位置=新位置;}}voidchromeb_IsBrowserInitializedChanged(objectsender,IsBrowserInitializedChangedEventArgse){if(chromewb.I){ChromeWidgetMessageInterceptor.SetupLoop(chromewb,(m)=>{if(m.Msg==(int)Native.WM.WM_LBUTTONDOWN){var点=Native.ParsePoint(m.LParam.ToInt32());if(Native.PtInRegion(DragableRegionNative,point.X,point.Y))this.InvokeEx(()=>Native.PostMessage(this.Handle,(uint)m.Msg,m.WParam,m.LParam));}});正如你所看到的,从chrome浏览器中拦截WM_LBUTTONDOWN事件就足够了,然后检查鼠标点是否属于标题区域,如果是,一旦表单将获得WM_LBUTTONDOWN就将此消息发送到主表单事件,内置表单方法OnMouseDown和OnMouseMove执行其他工作。以上就是C#学习教程:CefSharp中可拖动无边框窗口分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
