DrawBackground
前面所有的东西都准备好了,现在就可以画背景了。在哪里调用?当然在OnPaint里面。每一次窗体变化都会调用这个函数。(不知道这种方式和直接拉个picturebox然后设置背景哪个好?这种直接画的方式会不会因为onpaint的频繁调用而受到影响?)
因为原来左上方的图标被背景图片遮住了,所以在这个方法中也就顺便将图标和标题画上去了。
private void DrawBackground(Graphics g)
{
if (_topLeft.BackgroundBitmap == null) //确认已经读取图片
{
return;
}
#region 绘制背景
ImageAttributes attribute = new ImageAttributes();
attribute.SetWrapMode(WrapMode.TileFlipXY);
_topLeft.DrawSelf(g, null);
_topMiddle.DrawSelf(g, attribute);
_topRight.DrawSelf(g, null);
_centerLeft.DrawSelf(g, attribute);
contentPanel.BackgroundImage = _centerMiddle.BackgroundBitmap; //中间的背景色用内容panel背景代替
_centerRight.DrawSelf(g, attribute);
_bottomLeft.DrawSelf(g, null);
_bottomMiddle.DrawSelf(g, attribute);
_bottomRight.DrawSelf(g, null);
attribute.Dispose(); //释放资源
#endregion
#region 绘制标题和LOGO
//绘制标题
if (!string.IsNullOrEmpty(Text))
{
g.DrawString(Text, Font, new SolidBrush(ForeColor),
ShowIcon ? new Point(_titlePoint.X + 18, _titlePoint.Y) : _titlePoint);
}
//绘制图标
if (ShowIcon)
{
g.DrawIcon(Icon, new Rectangle(4, 4, 18, 18));
}
#endregion
}
{
if (_topLeft.BackgroundBitmap == null) //确认已经读取图片
{
return;
}
#region 绘制背景
ImageAttributes attribute = new ImageAttributes();
attribute.SetWrapMode(WrapMode.TileFlipXY);
_topLeft.DrawSelf(g, null);
_topMiddle.DrawSelf(g, attribute);
_topRight.DrawSelf(g, null);
_centerLeft.DrawSelf(g, attribute);
contentPanel.BackgroundImage = _centerMiddle.BackgroundBitmap; //中间的背景色用内容panel背景代替
_centerRight.DrawSelf(g, attribute);
_bottomLeft.DrawSelf(g, null);
_bottomMiddle.DrawSelf(g, attribute);
_bottomRight.DrawSelf(g, null);
attribute.Dispose(); //释放资源
#endregion
#region 绘制标题和LOGO
//绘制标题
if (!string.IsNullOrEmpty(Text))
{
g.DrawString(Text, Font, new SolidBrush(ForeColor),
ShowIcon ? new Point(_titlePoint.X + 18, _titlePoint.Y) : _titlePoint);
}
//绘制图标
if (ShowIcon)
{
g.DrawIcon(Icon, new Rectangle(4, 4, 18, 18));
}
#endregion
}
说完了主要方法,下面看看提供的几个属性:
这里想提的就是skinfolder这个属性。按照理想的样子这里选择的时候应该直接弹出已有皮肤的选项直接选择。但是问题是我没有找到在设计模式下读取程序所在目录的方法(设计模式下Application.StartupPath读取到的是vs的目录),所以只好采取这种方法让设计者选择皮肤目录。在设计的时候程序到这个目录下读取配置信息,实际运行的时候程序自动截取skinfolder这个属性中的皮肤名字,再通过application.startuppath读取皮肤。
一些细节
1.该窗体默认已经嵌入了一套皮肤(春色),所以即使您没有皮肤文件夹也能照样显示,只不过就一套皮肤罢了。
2.使用方法:项目中引用QLFUI.DLL,然后在要使用的类中将继承类由Form类改为QLFUI.Mainfrm即可。
3.因为前面的系列已经有了窗体详细的实现,所以换肤这里我只主要讲了下换肤的部分。窗体制作的细节就不再赘述了。