苹果工具栏DOCK实现算法

最近做UI,要做一个仿苹果工具栏效果的UI,在网上搜索了很久,结果都没找到VC的代码,倒是JAVA,VB,C#等代码都有人上传了。用VC做UI确实是很头疼的事情,这里我说一下DOCK工具栏的实现思路,要用到GDI+的。

1.设置Dock工具栏的基本信息:
图标信息(路径,大小)——m_PicInfo[i]
鼠标最大响应距离,最小响应距离——m_Maxdisc,m_Mindisc
图标最大缩放比例,最小缩放比例——m_MaxRate,m_MinRate
图标初始大小——m_Width,m_Height
2.获取动态图标中心,公式中的Width和Height必须是动态图标的宽度和长度,不能用原始长宽,
这也是算法的精髓之一,巧妙的地方总是微不足道的。这里用了递归的思路。
PointCenter(Left.X + Width/2,Left.Y + Height/2)
3.计算鼠标坐标到每个图标中心的距离——disc[i]。
4.根据距离disc[i]计算出每个图标的缩放比例——m_PicInfo[i].Rate
现在我用的公式就是最简单的线性公式:y=ax+b,数学没学好,曲线公式整不出来。
Rate=a*disc+b
把(m_Maxdisc,m_MinRate)和(m_MaxRate,m_Mindisc)两对值代入函数,计算出常量a,b的值,
注意m_Maxdisc是和m_MinRate对应的,就是鼠标距离最远时,图标缩放比例是最小。
a = (MinRate - MaxRate)/(Maxdisc - Mindisc);
b = MinRate - a * Maxdisc;
5.根据m_PicInfo[i].Rate计算出动态图标的大小,下面的m_Width,m_Height是图标初始大小,不是动态的。
m_PicInfo[i].Width = m_Width * m_PicInfo[i].Rate;
m_PicInfo[i].Height = m_Height * m_PicInfo[i].Rate;
6.然后再根据动态图标的大小,计算出动态工具栏的长度——m_DockLen
m_DockLen = m_PicInfo[0].Width + ……m_PicInfo[i].Width
7.得到工具栏长度后,我们就可以确定工具栏在窗口的位置了,主要是横坐标,纵坐标没怎么变化
首先
GetClientRect(rc);
cx = rc.Width();
cy = rc.Height();
获得窗口的大小(cx,cy),Dock工具栏的起始坐标(X,Y),
X = (cx - m_DockLen)/2 //目的是使Dock工具栏对称的显示在中间位置
Y = cy - m_PicInfo[0].Height - c //常量c是工具栏距离窗口最下端的距离,工具栏认放在
//窗口最下端,拖放停靠的功能还有待高手继续开发。
8.最后确定Dock工具栏每个图标的坐标,
m_PicInfo[i].Left.X = X + m_PicInfo[i-1].Width; //i>0,i=0的坐标就是上面的(X,Y)
m_PicInfo[i].Left.Y = cy - m_PicInfo[i].Height - c

9.最后根据每个图标的坐标画出图标。

编译环境:vc2008

代码下载地址:

http://download.csdn.net/source/3172416

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...