【原创作者】:丛兴滋(cncxz)[E-mail:cncxz@126.com]
【关 键 词】:MdiContainer winForm 背景图片 c#
一直看系统默认的MdiContainer窗体背景图片的呈现方式不爽,只有简单的填充效果(即图片大小固定,以截取右上角或重复出现的方式填满整个工作区)。
感觉有两种背景呈现效果是比较常用的,其一是在工作区显示一张完整的风景图片做背景,并在窗口大小变化的时候自动调节;其二是在工作区的某处显示一个单独的logo。
鉴于此,写了这个System.Windows.Forms.Form的扩展类。
一、分析和介绍
利用dotNet自带的工具Spy++可以清晰地看到MdiContainer窗体的大致结构:窗体本身、用于包含其他 MDI Child窗体的容器MDIClient、窗体上的其他控件,而我们的背景就是绘制在MDIClient上面的。
所以首先要做的就是定位到MdiContainer窗体的MDIClient,具体代码如下:
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.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;
" 公共属性 "
" 枚举相关 "
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;
}
}
}
}
}
}
四、项目文件下载
https://files.cnblogs.com/cncxz/fbgMDIform.rar