您的位置:首页 > 编程语言 > C#

C#仿QQ皮肤-总体层次说明(一)

2010-03-17 21:06 274 查看
阅读全文:http://www.cckan.net/forum.php?mod=viewthread&tid=258

C#仿QQ皮肤-实现原理系列文章导航
/article/4703880.html

前面的文章说了不少的费话,从这一节开始说点实际点的东西,皮肤的实现原理,我通过下面几步跟大家一点一点的抛吧.

第一步 皮肤的分类,一共有两个大类,我是根据实现的对象不同来分的,感觉这样可能会容易理解一下,因为窗体皮肤和控件皮肤还是有一些不同的,窗体的属性和控件的属性不一至,所 以在实现上有少许的差别,在这里我把他们分成两类;

1.窗体皮肤,

2.控件皮肤

1.窗体皮肤

窗体皮肤不用多说大家都 知道就是窗体的皮肤,当然这里面我还细分为窗体,和用户控件两种,也就是From和UserControl

在这里我们实现以下几个窗体和用户控件

1. 基窗体FormBase与基用户控件FormBase1的实现

2. 基窗体FunctionFormBase的实现

3. 主窗体MainForm和Main的实现

4. 用户控件EnterUserControl的实现

5. 皮肤控件窗体SkinForm的实现

6. Windows消息提示框窗体MessageBoxForm的实现

7. 常用用户控件EnterFrom1和窗体EntryForm的实现

一个一个的来说明吧,大家先下载一下最新的皮肤 这样方便理解

第一个,基窗体FormBase与基用户控件FormBase1

这 是两个基窗体吧,应该可以这样讲吧,FormBase是所有以上窗体的基窗体,也就是说上面的窗体创建都要继承这个窗体,而FormBase1 是做什么的呢,呵呵 ,其实他跟FormBase的功能 是完全一样的,只有一点区别就是FormBase是窗体,而FormBase1 是用户控件,实现的方法也是一样的

基窗体的实现是很简单的

第二个,基窗体FunctionFormBase的实现

FunctionFormBase这是一个窗体,跟FormBase的功能是一样的,是其它窗体的基窗体,像皮肤控制窗体SkinForm这样的窗体是要继承它的。

任何一个基窗体里都是用来重绘和拦截Windows消息的,做过自定义滚动条的朋友应该都 知道 什么是Windows消息,.net没有提共控件的直接Scroll,我们只能通过拦截Windows消息来处理了,和处理APIHook来解决问题了,Windows消息一般要处理这样几个VSCROLL,WM_HITTEST,WM_NCMOUSEMOVE等

说到滚动条多说几句,在处理滚动条的时候一般都 要处理这样几个方法

1.第一个是Value值

这里有一段参考代码可以分享一下

代码

private void MoveThumb(int y)
{
int nRealRange = Maximum - Minimum;
int nTrackHeight = (this.Height - (UpArrowImage.Height + DownArrowImage.Height));
float fThumbHeight = ((float)LargeChange / (float)Maximum) * nTrackHeight;
int nThumbHeight = (int)fThumbHeight;

if (nThumbHeight > nTrackHeight)
{
nThumbHeight = nTrackHeight;
fThumbHeight = nTrackHeight;
}
if (nThumbHeight < 56)
{
nThumbHeight = 56;
fThumbHeight = 56;
}

int nSpot = nClickPoint;

int nPixelRange = (nTrackHeight - nThumbHeight);
if (moThumbDown && nRealRange > 0)
{
if (nPixelRange > 0)
{
int nNewThumbTop = y - (UpArrowImage.Height + nSpot);

if (nNewThumbTop < 0)
{
moThumbTop = nNewThumbTop = 0;
}
else if (nNewThumbTop > nPixelRange)
{
moThumbTop = nNewThumbTop = nPixelRange;
}
else
{
moThumbTop = y - (UpArrowImage.Height + nSpot);
}

//figure out value
float fPerc = (float)moThumbTop / (float)nPixelRange;
float fValue = fPerc * (Maximum - LargeChange);
moValue = (int)fValue;
Debug.WriteLine(moValue.ToString());

Application.DoEvents();

Invalidate();
}
}
}

滚动条先到这里吧,具体的到这个控件制作时再具体的说,

我们接着看

第三个 主窗体MainForm和Main窗体

见名思意MainForm,主窗体,这是一个主窗体,是一般化的窗体,只有菜单和皮肤两项菜单,不带有换底纹的功能界面如下


Main窗体就更好说了,就是我前面所有用到 的窗体如下



有点长了,本来打算今天 把框架说完了,看来是不行了,下次接着来吧,下面的四个下次接着来吧,这次多少写的滚动条的代码 有些多了,哎。

完吧!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: