父窗体嵌套子窗体,子窗体移动(非MDI,非顶级窗体)

这几天做的一个程序,搞的相当苦恼!

要再父窗体内嵌套子窗体,而父窗体又不是顶级窗体,又不能设置MDI多文档,还得要能拖动!

搞了好几天,问了很多人,没有什么好的解决方式。

 

这几天自己研究了下,发现了一个比较折中的方式。就是父窗体内容嵌套其他容器,将子窗体填充到该容器中。

(但是这个还是有缺陷的,因为容器背景色的问题)

 

废话不多说 我用的容器时Panel,窗体一共两个,父窗体CarApplyListing 子窗体CarApplyMain

 

 

1.首先申明子窗体所需要的变量

 

/// <summary>
/// 是否已经移动本窗体
/// </summary>
private bool isMove = false;

 

/// <summary>
/// 是否第一次移动
/// </summary>
private bool firstMove = true;

 

/// <summary>
/// 默认坐标(0,0)
/// </summary>
Point p = new Point(0, 0);

 

2.在子窗体中添加两个事件(只要是为了子窗体在父窗体大小空间内拖动,否则它只能在容器的范围内容拖动)

一个是MouseCaptureChanged 这个是当窗体的鼠标焦点切换时触发


·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
  1. /// <summary>  
  2. /// 失去鼠标或者获得鼠标焦点  
  3.  /// </summary>  
  4. /// <param name="sender"></param>  
  5. /// <param name="e"></param>  
  6. private void CarApplyMain_MouseCaptureChanged(object sender, EventArgs e)  
  7. {  
  8.    Panel ccPanel = this.Parent as Panel; // 取得父容器  
  9.     ccPanel.Size = ccPanel.Parent.Size; // 获取Panel父容器大小  
  10.   
  11.     // 记录Panel的原坐标,设置Panel的新坐标  
  12.     Point pPanel = ccPanel.Location;  
  13.     ccPanel.Location = p;  
  14.   
  15.     if (firstMove || isMove)  
  16.     {  
  17.         // 第一次加载获知已经移动本窗体,设置本窗体位置为原Panel位置  
  18.         this.Location = pPanel;  
  19.     }  
  20.   
  21.     isMove = false;  



另外一个是Move 这个当窗体移动时触发(本来想用LocationChange的,但是这个事件会造成子窗体乱跳)

 

  1. /// <summary>  
  2. /// 窗体移动事件  
  3.  /// </summary>  
  4. /// <param name="sender"></param>  
  5. /// <param name="e"></param>  
  6. private void CarApplyMain_Move(object sender, EventArgs e)  
  7. {  
  8.     if (firstMove)  
  9.     {  
  10.         // 第一次加载 退出窗体移动事件  
  11.         firstMove = false;  
  12.         return;  
  13.     }  
  14.   
  15.     if (this.Location != p && !isMove)  
  16.     {  
  17.       Panel  ccPanel = this.Parent as Panel; // 取得父容器  
  18.         ccPanel.Size = this.Size; // 获取Panel父容器大小  
  19.   
  20.         // 重新设置 窗体和其父容器的位置  
  21.         ccPanel.Dock = System.Windows.Forms.DockStyle.None;  
  22.       ccPanel.Location = this.Location;  
  23.   
  24.       isMove = true;  
  25.       this.Location = p; // 重置窗体位置  
  26.     }  
  27. }  

 

 

3.在子窗体关闭时调用父窗体的方法

 

// 设置Panel隐藏
CarApplyListing car = this.Parent.Parent as CarApplyListing;
car.ClosePanel();

 

 4.在父窗体中加入以下方法

 

·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
  1. /// <summary>  
  2. /// 显示摘要单据窗体  
  3.  /// </summary>  
  4. /// <param name="frm">用车申请单窗体</param>  
  5. public void ShowPanel(CarApplyMain frm)  
  6. {  
  7.     carApplyMain = frm;  
  8.   
  9.     // 移除Panel内的所有控件  
  10.     ccPanel.Controls.Clear();  
  11.     // 添加用车申请单窗体  
  12.     ccPanel.Controls.Add(carApplyMain);  
  13.   
  14.     // 显示窗体  
  15.     if (carApplyMain == null || carApplyMain.IsDisposed)  
  16.     {  
  17.         carApplyMain = new CarApplyMain();  
  18.         carApplyMain.Show();  
  19.     }  
  20.     else  
  21.     {  
  22.         carApplyMain.WindowState = FormWindowState.Normal;  
  23.         carApplyMain.Activate();  
  24.         carApplyMain.Show();  
  25.     }  
  26.   
  27.     // 设置Panel大小与窗体相同  
  28.     ccPanel.Size = new System.Drawing.Size(carApplyMain.Size.Width, carApplyMain.Size.Height);  
  29.   
  30.     // 重新设置Panel的位置  
  31.     SetLocation();  
  32.     // 设置Panel显示  
  33.     ccPanel.Visible = true;  
  34. }  
  35.   
  36. /// <summary>  
  37. /// 隐藏摘要单据窗体  
  38. /// </summary>  
  39. public void ClosePanel()  
  40. {  
  41.     // 隐藏Panel   
  42.     this.ccPanel.Visible = false;  
  43. }  
  44.   
  45. /// <summary>  
  46. /// 重新设置坐标  
  47. /// </summary>  
  48. public void SetLocation()  
  49. {  
  50.     // 设置Panel 默认居中  
  51.     ccPanel.Top = (this.Height - ccPanel.Height) / 2;  
  52.     ccPanel.Left = (this.Width - ccPanel.Width) / 2;  
  53. }  

 

5.在父窗体内添加一个按钮,调用ShowPanel方法,把子窗体传进去就OK了。(此法最大的局限就是Panel,它最大化会把整个窗体都覆盖,有点丑就是了)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值