dotNet 桌面程序改造计划.窗口篇.Visual Studio.NET 风格的mdi窗口



下图是一个正常的 mdi ,窗口 样式,不是很好看是吧。



其实、实现这个很简单有几行代码就可以搞定了。
起因是一个朋友问我怎么实现、我才想起来搞的,以前也做过,不过不是用.net
经过数次试验终于在 .net 下搞定,特此发文和 CSDN 的朋友们分享,
时间匆忙有错别字的地方,或不够详细的地方请不要骂我.

具体实现方法:
  1. 建立一个mdi窗口 Form1
    using System.Runtime.InteropServices;
    this.IsMdiContainer = true;

  2. 声明变量若干
    private System.Windows.Forms.MdiClient m_MdiClient;
    public const int MDIS_ALLCHILDSTYLES = 0x0001;
    public const int GWL_STYLE = -16;
    public const int GWL_EXSTYLE = -20;

  3. 声明API若干
    [DllImport("user32.dll", CharSet=CharSet.Auto)]
    public static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
    [DllImport("user32.dll", CharSet=CharSet.Auto)]
    public static extern IntPtr GetWindowLong( IntPtr hWnd,int nIndex);

  4. 在Form1构造函数
    public Form1()
    {
    	//
    	// Windows 窗体设计器支持所必需的
    	//
    	InitializeComponent();
    	this.WindowState= FormWindowState.Maximized;
    	int iCnt=this.Controls.Count;
    	for(int i=0;i<iCnt;i++)
    	{
    		if(this.Controls[i] is System.Windows.Forms.MdiClient)
    		{
    			this.m_MdiClient=(System.Windows.Forms.MdiClient)this.Controls[i];
    
    
    			int style = GetWindowLong(m_MdiClient.Handle,GWL_STYLE).ToInt32();
    			style |=MDIS_ALLCHILDSTYLES;
    			//设置 MDI 区域样式加入, MDIS_ALLCHILDSTYLES
    			//去掉 mdi 子窗口[右上角按钮的关键]的一步
    			SetWindowLong(m_MdiClient.Handle,GWL_STYLE,style);
    
    			//设置 MDI 区域扩展样式 
    			//去掉 mdi 窗口凹陷,根据 windows 编成多年的经验
    			//扩展样式为 0 一定就是平的
    			SetWindowLong(m_MdiClient.Handle,GWL_EXSTYLE,0);
    			m_MdiClient.ControlAdded += 
    				new ControlEventHandler(m_MdiClient_ControlAdded);
    			break;
    		}
    	}
    }
    

  5. 写m_MdiClient_ControlAdded 事件
    private void m_MdiClient_ControlAdded(object sender, ControlEventArgs e)
    {
    	Form Frm = e.Control as Form;
    	if (Frm!=null)
    	{
    		//将加入的 mdi 子窗口,样式进行更改,然后 最大化
    		Frm.FormBorderStyle= FormBorderStyle.None;  
    		Frm.WindowState=FormWindowState.Maximized;
    
    	}
    }
    
  6. 再 Form1 的load 事件里
    private void Form1_Load(object sender, System.EventArgs e)
    {
    	Form2 f2 =new Form2();
    	f2.MdiParent=this;
    	f2.Show();
    	f2.Activate();
    }
    
  7. 建立一个 Form2 上面放个 DataGrid Dock,属性 选 Fill 选,运行程序就可看到 效果

转载本文请标注,转载地址、以及作者。

曲滨 2005-3-13

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值