设为首页 友情链接
在线留言 发表文章
加入收藏 广告联系

刺猬首页

| 专案技术 | 网络技术 | 图形图象 | 网络编程 | 网页设计 | 操作系统 | 服务器 | 技术白皮书 | 在线实验室 | 刺猬论坛 |
  | 数据库 | 设计赏析 | 存储频道 | 网络安全 | 私服架设 |  Solaris | 网站评估 | PC维护技巧 | 下载中心 | 博 客 |
专题: | Linux | java | cisco | 防病毒 | 刀片 | SOA | iscsi | ASP.NET | SQL | Oracle |
您现在的位置: IT公社 IT community >> 网络编程 >> ASP.NET >> 教程正文 用户登录 新用户注册
专 题 栏 目
最 新 热 门
最 新 推 荐
相 关 文 章
使用C#开发SmartPhone程…
用C#实现智能设备上的No…
VS2005中使用C#的新特性…
C#获取WAVE文件文件头信…
关于C#中枚举打印机
C#位图处理指针问题
选择 VB.NET 还是 C# ?
数据结构与算法(C#实现)…
使用C#编写LED样式时钟控…
怎样用C#实现完整文档打…
  C#中势将窗体拖拽进行到底           
C#中势将窗体拖拽进行到底
 

  问题描述: 

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

C#中势将窗体拖拽进行到底

(图1) 

  问题实现:

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

C#中势将窗体拖拽进行到底

                    (图2) 

   处理他们的Click事件,拖拽处理MouseDown MouseUp事件。 

  第二种方法:不添加Label只处理鼠标事件,判断鼠标的位置然后决定执行什么操作,这种方法很耗费资源,每次鼠标点击就要判断,鼠标是否在某个区域然后决定是否要处理。不过这个处理用多态包装了。程序看起来比较整齐。

 //定义常量
   private Point point;
   private const int dragMove=172;
   private const int dragMin=72;
   private const int dragClose=72;
   private const int dragDouble=78;
   private const int dragHeight=29;
   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<dragHeight)
   {
   if(e.X<dragMove)
   {
   dragEnum = MouseHandleEnum.Move;
   return;
   }
   if(e.X<dragMove+dragMin)
   {
   dragEnum = MouseHandleEnum.Min;
   return;
   }
   if(e.X<dragMove+dragMin+dragClose)
   {
   dragEnum = MouseHandleEnum.Close;
   return;
   }
   if(e.X<dragMove+dragMin+dragClose+dragDouble)
   {
   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
  {
   /// <summary>
   ///
   /// </summary>
   public interface IDragMouse
   {
   void MouseDo();
   }
  }
 
 //拖拽操作
  namespace DragMouse
  {
   /// <summary>
   ///
   /// </summary>
   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
   }
  }
 
 //其他操作类似。 

  第三种方法:是用责任链这个设计模式来包装鼠标的点击操作,把操作分配到各个责任链的节点上,是程序更加面向对象,有更好的扩展性。

  //两个鼠标事件
  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.yHigh)&&(request.eX<request.dragLength)) // some complex decision making!
   {
   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<this->m_Height)
   {
  //发消息给系统伪装鼠标在Caption Bar 上。
   if(point.x<this->m_Drag)
   {
   PostMessage(WM_NCLBUTTONDOWN,
   HTCAPTION,
   MAKELPARAM(point.x,point.y));
   return;
   }
   if(point.x<this->m_Drag+this->m_Min&

[1] [2] 下一页  

频道声明:本频道的文章除部分特别声明禁止转载的专稿外,可以自由转载.但请务必注明出出处和原始作者 文章版权归本频道与文章作者所有.对于被频道转载文章的个人和网站,我们表示深深的谢意。

原始作者:佚名 录入时间:2006-10-26
信息来源:不详 投稿信箱:itqoo@126.com
教程录入:admin    责任编辑:admin 
  • 上一个教程:

  • 下一个教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    - 关于我们 - 合作伙伴 - 友情链接 - 广告刊登 - 投稿热线 - 在线留言版权声明联系方式 -
    IT公社版权所有 粤ICP备05127012号
    Copyrigh@2005-2006 itqoo.com.Inc All Rights Reserved  推荐分辨率 1024*768
    联系站长:E-Mail:itqoo@126.com     MSN:urchincc@hotmail.com    QQ:点击这里给我发消息
    特别感谢:亿太网络提供空间支持