知识大全 C#中势将窗体拖拽进行到底

Posted 操作

篇首语:不飞则已,一飞冲天;不鸣则已,一鸣惊人。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 C#中势将窗体拖拽进行到底相关的知识,希望对你有一定的参考价值。

C#中势将窗体拖拽进行到底  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  问题描述    想在 Net下实现对一些非规则窗体 没有Caption FormBorderStyle = System Windows Forms FormBorderStyle None;窗体的拖拽 最小化 最大化 特殊操作的实现(如图 所示) 在黄色的区域即区域 里实现对窗体的拖拽操作 在橙色区域即区域 里实现对窗体的最小化操作 在蓝色区域即区域 里实现对窗体的关闭操作 在绿色区域即区域 里实现对窗体的特殊操作(如双倍窗体)   

  

  (图 ) 

  问题实现   第一种方法 添加Label为Label添加Click事件 (如图 所示) 如果要用这种方法实现 就要为每一个颜色区域进行切图 并要保证有正确的切图长和宽 然后设置Label的背景为这个图片

  

  (图 )    处理他们的Click事件 拖拽处理MouseDown MouseUp事件  第二种方法 不添加Label只处理鼠标事件 判断鼠标的位置然后决定执行什么操作 这种方法很耗费资源 每次鼠标点击就要判断 鼠标是否在某个区域然后决定是否要处理 不过这个处理用多态包装了 程序看起来比较整齐   //定义常量    private Point point;    private const int dragMove= ;    private const int dragMin= ;    private const int dragClose= ;    private const int dragDouble= ;    private const int dragHeight= ;    private MouseHandleEnum dragEnum;      //定义MouseDown事件   private void DragMain_MouseDown(object sender System Windows Forms MouseEventArgs e)       point X=e X;    point Y=e Y;    if(e Y       if(e.X       dragEnum = MouseHandleEnum.Move;    return;       if(e.X       dragEnum = MouseHandleEnum.Min;    return;       if(e.X       dragEnum = MouseHandleEnum.Close;    return;       if(e.X       dragEnum = MouseHandleEnum.Double;    return;                     //定义MouseUp事件   private void DragMain_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)       point.X=e.X-point.X;    point.Y=e.Y-point.Y;    IDragMouse idragMouse;    switch(dragEnum)       case MouseHandleEnum.Move :    idragMouse = new MouseMove(point,this);    break;    case MouseHandleEnum.Min :    idragMouse = new MouseMin(point,this);    break;    case MouseHandleEnum.Close :    idragMouse = new MouseClose(point,this);    break;    case MouseHandleEnum.Double :    idragMouse = new MouseDouble(point,this);    break;    default:    idragMouse = null;    break;       if(idragMouse!=null)    idragMouse.MouseDo();         //定义基类   namespace DragMouse      public enum MouseHandleEnum       None=0,    Move=1,    Min=2,    Close=3,    Double=4,      public class DragMouseBase       protected Point point;    public Form form;    public DragMouseBase(Point point, Form form)       this.point = point;    this.form = form;           

  //定义接口   namespace DragMouse       ///

   ///    ///    public interface IDragMouse       void MouseDo();         //拖拽操作   namespace DragMouse       ///    ///    ///    public class MouseClose : DragMouseBase,IDragMouse       public MouseClose(Point point,Form form):base(point,form)       //    // TODO: Add constructor logic here    //       #region IDragMouse Members       public void MouseDo()       Application.Exit();    // TODO: Add MouseClose.MouseDo implementation          #endregion         //其他操作类似。.wInGwIt.cOm   第三种方法:是用责任链这个设计模式来包装鼠标的点击操作,把操作分配到各个责任链的节点上,是程序更加面向对象,有更好的扩展性。         //两个鼠标事件   private void DragMain_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)       request.GetInformation(e.X,e.Y);               private void DragMain_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)       request.SetScreenPoint(e.X,e.Y);            //封装的请求类    public class Request       public int iScreenX;    public int iScreenY;       public int eX;    public int eY;       public readonly int yHigh;    public readonly int dragLength;    public readonly int minLength;    public readonly int closeLength;    public readonly int doubleLength;       private DragHandler dragHandler;    private MinHandler minHandler;    private CloseHandler closeHandler;    private DoubleHandler doubleHandler;       public Form parentForm;       public void SetScreenPoint(int iX,int iY)       iScreenX = iX;    iScreenY = iY;    dragHandler.HandleRequest(this);          public void GetInformation(int ex,int ey)       eX=ex;    eY=ey;          public Request(int yhigh,int draglength,Form form)       yHigh = yhigh;    dragLength = draglength;    parentForm = form;    dragHandler = new DragHandler();    minHandler =new MinHandler();    closeHandler = new CloseHandler();    doubleHandler = new DoubleHandler();       dragHandler.SetSuccessor(minHandler);    minHandler.SetSuccessor(closeHandler);    closeHandler.SetSuccessor(doubleHandler);            public Request(int yhigh,int draglength,int minlength,Form form):this(yhigh,draglength,form)       minLength = minlength;            public Request(int yhigh,int draglength,int minlength,int closelength,Form form):this(yhigh,draglength,minlength,form)       closeLength = closelength;            public Request(int yhigh,int draglength,int minlength,int closelength, int doublelength , Form form):this(yhigh,draglength,minlength,closelength,form)       doubleLength = doublelength;            //拖拽操作    public class DragHandler : Handler       override public void HandleRequest(Request request)       // determine if we can handle the request    if ((request.eY       request.parentForm.Left += request.iScreenX-request.eX;    request.parentForm.Top += request.iScreenY-request.eY;       // request handling code goes here       else       // not handled here - pass on to next in the chain    if (successorHandler != null)    successorHandler.HandleRequest(request);             //其他操作类似     第四种方法:(只是有想法还没有找到成功的实现办法)   在MFC中可以用PostMessage或者SendMessag发消息,当鼠标单击,但不在窗体的CaptionTitle上时,发一个消息告诉系统鼠标在CaptionTitle(每个窗口自己TitleBar)上,这样窗口的拖拽就可以由系统托管了。现在实现了在窗口中任意位置单击鼠标拖拽窗体。但是没有实现上面要求的那些多样化操作。       if(point.y m_Height)      //发消息给系统伪装鼠标在Caption Bar 上。    if(point.x m_Drag)       PostMessage(WM_NCLBUTTONDOWN,    HTCAPTION,    MAKELPARAM(point.x,point.y));    return;       if(point.x m_Drag+this->m_Min&&point.x>this->m_Drag)       PostMessage(WM_NCLBUTTONDOWN,    HTMINBUTTON,    MAKELPARAM(point.x,point.y));    return;       if(point.x m_Drag+this->m_Min+this->m_Close&&point.x>this->m_Drag+this->m_Min)       PostMessage(WM_NCLBUTTONDOWN,    HTCLOSE,    MAKELPARAM(point.x,point.y));    return;       if(point.x m_Drag+this->m_Min+this->m_Close+this->m_Double&&point.x>this->m_Drag+this->m_Min+this->m_Close)       CRgn *rgn = new CRgn();    CRect *rect =new CRect();    this->GetWindowRect(*rect);    this->SetWindowRgn(*rgn,true);    return;          cha138/Article/program/net/201311/13231

相关参考

知识大全 C#中使用Setting保存用户自定义窗体位置

C#中使用Setting保存用户自定义窗体位置  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!方法&

知识大全 C#中实现文字在窗体中从左到右移动

C#中实现文字在窗体中从左到右移动  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  程序开发步骤 

知识大全 C#窗体的应用

C#窗体的应用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在做Winform窗体程序的时候遇

知识大全 C#窗体全屏功能

C#窗体全屏功能  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  窗体全屏的方法  隐藏任务栏设置

知识大全 c#窗体事件

  从网上看到了一个窗体拖动事件超级简洁至少现在这个阶段我是看起来有困难的有兴趣的哥们们可以讨论下usingSystemusingSystemCollectionsGenericusingSystem

知识大全 C#实现窗体和任意控件的拖动

C#实现窗体和任意控件的拖动  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  程序内有大部分注释了

知识大全 C#使用Panel实现窗体动态侧边栏

C#使用Panel实现窗体动态侧边栏  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  可以实现侧边

知识大全 自定义事件实现不同窗体间的通讯C#篇

自定义事件实现不同窗体间的通讯C#篇  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  C#中的事件

知识大全 c#实现文字由左向右滚动

  在C#中可以通过Label控件TextBox控件窗体和PictureBox控件来显示文字窗体和PictureBox控件主要是通过DrawString方法实现而TextBox控件和Label控件是专

知识大全 在Windows应用程序中支持拖拽的TreeView控件

在Windows应用程序中支持拖拽的TreeView控件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下