原创 form扩展类(fbgMDIform)定制Mdi主窗体背景(附c#源码)收藏

新一篇: webSetup介绍 | 旧一篇: CSS控制表格居中(使用expression)

    【原创作者】:丛兴滋(cncxz)[E-mail:cncxz@126.com]
    【关 键 词】:MdiContainer  winForm  背景图片  c#

   
    一直看系统默认的MdiContainer窗体背景图片的呈现方式不爽,只有简单的填充效果(即图片大小固定,以截取右上角或重复出现的方式填满整个工作区)。
   
    感觉有两种背景呈现效果是比较常用的,其一是在工作区显示一张完整的风景图片做背景,并在窗口大小变化的时候自动调节;其二是在工作区的某处显示一个单独的logo。
   
    鉴于此,写了这个System.Windows.Forms.Form的扩展类。
   
   
    一、分析和介绍
   
    利用dotNet自带的工具Spy++可以清晰地看到MdiContainer窗体的大致结构:窗体本身、用于包含其他 MDI Child窗体的容器MDIClient、窗体上的其他控件,而我们的背景就是绘制在MDIClient上面的。
   
    所以首先要做的就是定位到MdiContainer窗体的MDIClient,具体代码如下:
   
    private System.Windows.Forms.MdiClient bgMDIClient;
    foreach(System.Windows.Forms.Control myControl in this.Controls)
      {
       if(myControl.GetType().ToString() == "System.Windows.Forms.MdiClient")
       {
        bgMDIClient = (System.Windows.Forms.MdiClient)myControl;
       break;
       }
     }
    
     找到MDIClient之后就可以通过其BackgroundImage属性来设置背景图片了,当然,具体的呈现风格可以通过一些自定义属性来控制。
    
     窗体加载的时候需要设置bgMDIClient.BackgroundImage,窗体调整大小的时候需要重设bgMDIClient.BackgroundImage,所以应该在窗体的Load和SizeChanged事件中执行相关代码。
    
     下面我列举一下fbgMDIform相对于System.Windows.Forms.Form的自定义属性。
    
     属性名:MDIbg_Type
     类  型:enum
     介  绍:背景图片呈现风格:File填充,以截取右上角或重复出现的方式填满整个工作区;Draw拉伸,一张图片拉伸后布满工作区;Logo标志,一张图片,其他属性控制具体位置。
    
     属性名:MDIbg_Image
     类  型:Image
     介  绍:MDIContainer背景图片。
    
     属性名:MDIbg_Align
     类  型:enum
     介  绍:MDIbg_Image的左右对齐方式,取值为Left、Center、Right,MDIbg_Type设置为Logo时有效。
    
     属性名:MDIbg_Valign
     类  型:enum
     介  绍:MDIbg_Image的上下对齐方式,取值为Top、Middle、Bottom,MDIbg_Type设置为Logo时有效。
    
     属性名:MDIbg_bgImage
     类  型:Image
     介  绍:MDIContainer第二背景图片,MDIbg_Type设置为Logo时,此属性对应图片以拉伸的形式在MDIbg_Image的下一层布满工作区,若留空则由背景色替代。
    
    
    
     二、使用说明
    
     可以调用编译生成的dll,也可以直接在工程中使用.cs源文件,具体步骤为:
    
     A、调用dll:直接在项目中执行【添加继承的窗体】,设置好窗体名称,点击【打开】,然后【浏览】定位到对应dll,【打开】后名为fbgMDIform的组件会出现在待选列表中,点【确定】返回,接下来设置相关属性即可。
    
     B、使用.cs源文件:把源文件拷到对应项目目录下,执行【添加现有项】将源文件引入项目,然后照A执行,不用在定位到dll了,fbgMDIform直接就在待选列表中了。
    
    
     注意:若窗体的IsMdiContainer属性为false,相关自定义属性是不起作用的。
    
    
     三、.cs源代码

using System;
using System.ComponentModel;
using System.Collections;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
 namespace myControls
{
 /// <summary>
 /// fat background MDI form (fbgMDIform),可定制Mdi主窗体背景。
 /// </summary>
 public class fbgMDIform:System.Windows.Forms.Form
 {
  private MDIbg_TypeList _mdibg_type;
  private Image _mdibg_image;
  private Image _mdibg_bgimage;  

  private MDIbg_AlignList _mdibg_align;
  private MDIbg_ValignList _mdibg_valign;

  private System.Windows.Forms.MdiClient bgMDIClient;

  #region" 公共属性 "

  [Browsable(true),Description("背景图片呈现风格:File填充,以截取右上角或重复出现的方式填满整个工作区;Draw拉伸,一张图片拉伸后布满工作区;Logo标志,一张图片,其他属性控制具体位置。"), Category("MDI背景扩展设置")]
  public MDIbg_TypeList MDIbg_Type
  {
   get 
   {
    object obj=_mdibg_type;
    return (obj==null)?MDIbg_TypeList.File:(MDIbg_TypeList)obj;
   }
   set { _mdibg_type=value;  }
  }


  [Browsable(true),Description("MDIContainer背景图片"),Category("MDI背景扩展设置")]
  public Image MDIbg_Image
  {
   get { return _mdibg_image; }
   set { _mdibg_image=value;  }
  }


  [Browsable(true),Description("MDIContainer第二背景图片,MDIbg_Type设置为Logo时,此属性对应图片以拉伸的形式在MDIbg_Image的下一层布满工作区,若留空则由背景色替代。"), Category("MDI背景扩展设置")]
  public Image MDIbg_bgImage
  {
   get { return _mdibg_bgimage; }
   set { _mdibg_bgimage=value;  }
  }


  
  [Browsable(true),Description("MDIbg_Image的左右对齐方式,取值为Left、Center、Right,MDIbg_Type设置为Logo时有效。"), Category("MDI背景扩展设置")]
  public MDIbg_AlignList MDIbg_Align
  {
   get 
   {
    object obj=_mdibg_align;
    return (obj==null)?MDIbg_AlignList.Left:(MDIbg_AlignList)obj;
   }
   set { _mdibg_align=value;  }
  }


  [Browsable(true),Description("MDIbg_Image的上下对齐方式,取值为Top、Middle、Bottom,MDIbg_Type设置为Logo时有效。"), Category("MDI背景扩展设置")]
  public MDIbg_ValignList MDIbg_Valign
  {
   get 
   {
    object obj=_mdibg_valign;
    return (obj==null)?MDIbg_ValignList.Top:(MDIbg_ValignList)obj;
   }
   set { _mdibg_valign=value;  }
  }


  #endregion
  
  #region" 枚举相关 "

  //呈现风格枚举
  public enum MDIbg_TypeList:byte
  {   
   File, //File填充,多张图片重复后布满工作区     
   
   Draw, //Draw拉伸,一张图片拉伸后布满工作区
   
   Logo //Logo标志,一张图片,其他属性控制具体位置   
  }


  //图片左右对齐方式枚举
  public enum MDIbg_AlignList:byte
  {   
   Left, //居左     
   
   Center, //居中
   
   Right //居右   
  }


  //图片上下对齐方式枚举
  public enum MDIbg_ValignList:byte
  {   
   Top, //居上     
   
   Middle, //居中
   
   Bottom //居下
   
  }

  #endregion 

  public fbgMDIform()
  {
   this.SizeChanged += new System.EventHandler(this.MDI_Set);
   this.Load+=new EventHandler(this.MDI_Set);   
      
  }  

  private void MDI_Set(object sender, System.EventArgs e){
   if(this.IsMdiContainer){    
    foreach(System.Windows.Forms.Control myControl in this.Controls)
    {
     if(myControl.GetType().ToString() == "System.Windows.Forms.MdiClient")
     {
      bgMDIClient = (System.Windows.Forms.MdiClient)myControl;     
      break;
     }
    }
    
    if(bgMDIClient.ClientSize.Width>0&&bgMDIClient.ClientSize.Height>0&&MDIbg_Image!=null){

     System.Drawing.Bitmap myImg = new Bitmap(bgMDIClient.ClientSize.Width,bgMDIClient.ClientSize.Height);   
     System.Drawing.Graphics myGraphics = System.Drawing.Graphics.FromImage(myImg); 
     myGraphics.Clear(this.BackColor);

     switch (this.MDIbg_Type)
     {
      case MDIbg_TypeList.File:
       //填充
       myImg = new Bitmap(this.MDIbg_Image);
       myGraphics = System.Drawing.Graphics.FromImage(myImg);
       myGraphics.Clear(this.BackColor);
       myGraphics.DrawImage(this.MDIbg_Image,0,0,myImg.Width+1,myImg.Height+1);
       bgMDIClient.BackgroundImage =myImg;
       myGraphics.Dispose();
       break;
      case MDIbg_TypeList.Draw:
       //拉伸             
       myGraphics.DrawImage(this.MDIbg_Image,0,0,myImg.Width+1,myImg.Height+1);
       bgMDIClient.BackgroundImage = myImg;
       myGraphics.Dispose(); 
       break;
      case MDIbg_TypeList.Logo:
       //标志       
       myGraphics.Clear(this.BackColor);
       
       if(this.MDIbg_bgImage!=null){
        myGraphics.DrawImage(this.MDIbg_bgImage,0,0,myImg.Width+1,myImg.Height+1);
       }
       //定位
       int myX,myY;
      switch(this.MDIbg_Align){
       case MDIbg_AlignList.Left:
        myX=0;
        break;
       case MDIbg_AlignList.Right:
        myX=myImg.Width-MDIbg_Image.Width;
        break;

       case MDIbg_AlignList.Center:
        myX=(myImg.Width-MDIbg_Image.Width)/2;
        break;
       default:
        myX=0;
        break;
      }
      switch(this.MDIbg_Valign)
      {
       case MDIbg_ValignList.Top:
        myY=0;
        break;
       case MDIbg_ValignList.Bottom:
        myY=myImg.Height -MDIbg_Image.Height;
        break;

       case MDIbg_ValignList.Middle:
        myY=(myImg.Height -MDIbg_Image.Height)/2;
        break;
       default:
        myY=0;
        break;
      }
       myGraphics.DrawImage(this.MDIbg_Image,myX,myY,this.MDIbg_Image.Width,this.MDIbg_Image.Height);
       bgMDIClient.BackgroundImage = myImg;
       myGraphics.Dispose();
       break;
      default:
       //填充
       bgMDIClient.BackgroundImage =this.MDIbg_Image;       
       break;
     }
    }
    
   
   
   }
  }

 }
}
     
     
    
*注:文章发布后可能会有修改的地方,本人blog上是最新的。
    

发表于 @ 2005年11月18日 07:01:00|评论(loading...)|编辑

新一篇: webSetup介绍 | 旧一篇: CSS控制表格居中(使用expression)

评论

#雪无痕 发表于2006-06-16 19:12:00  IP: 218.85.182.*
怎么没有源码下载
#wwtop 发表于2006-07-02 18:25:00  IP: 202.99.213.*
if(bgMDIClient.ClientSize.Width>0&&bgMDIClient.ClientSize.Height>0&&MDIbg_Image!=null){
这个条件永远不成立,因为bgMDIClient.ClientSize.Width总是为0,怎么办呢?
这个总是执行不成功,why?
发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © cncxz