返回首页

{A}{S0}简介
这是我的第一篇文章,其中我尝试提出一个基本的方法,使鱼眼菜单控制,鼠标在该项目被放大,和周边项目的增加和减少它们的大小,当您移动鼠标。背景
有几种可供选择的菜单,在未来的一个网站联系在一起的,在论坛上的职位。我想知道如何努力,这将是实现像鱼眼菜单,虽然代码是非常基本的,它作为一个起点改善,使其更好地服务。使用代码
作为代码的第一版本,东西是非常杂乱。首先,有西班牙语和英语类和属性的名字,因为我没有发布这篇文章的思想。在本周的过程中,我将正确的,并上传新版本。
有一类所谓的项目,代表每一个不同的菜单项。这个类非常基本的属性,如:

private string _valor;

private float _inicio;

private float _fin;

private bool _over; 

_valor的项目,在这种情况下只是一个字符串值,但它可以是任何支持的类型。 _inicio和_fin Y轴显示,该项目是限制。 _over表示,如果鼠标是目前在指定的项目。
控制,在这种情况下是形式本身,其他三个属性:{C}
_indexOver是可变的,持有鼠标在该项目的索引。因为它可以为null,则该变量为空值。 _itemOver对应到指定的项目,它也可以为NULL。 _items包含的项目清单,在这种情况下是在Form_Load事件中加载。构造
为了减少闪烁和增强的视觉感受和响应,也有一些调用SetStyle方法在其构造的控制:
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);

this.SetStyle(ControlStyles.CacheText, true);

this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

this.SetStyle(ControlStyles.ResizeRedraw, true);

this.SetStyle(ControlStyles.UserPaint, true);

这基本上是配置控制,让我(开发商)负责其绘图,并设置它使用双缓冲区和高速缓存,所以它呈现更快的文本。
在Form_Load方法,我只是填补_items收集使用,但是这可以从一个数据源的信息,接受它作为一个参数,甚至设置为从外部对象的属性。
的两个主要方法是Form1_MouseMove和OnPaint中(这是在这个类中重写)。我不会复制的代码,因为它是在可用的源代码,而是我会给你一些洞察到它做什么。的OnPaint
这种方法是在负责绘制菜单。这就是所谓的形式已被重绘,每次和它覆盖基类的方法(但它不调用它,使整幅画是这种方法)。
首先,这种方法计算的经常项目(如鼠标不高于也不近)的高度,用一个基本的(不准确)以上项目数的形式高度的计算,只是为了获得一个平均身高(此计算将在文章的第二个版本修正)。
然后,它基本上是通过_items集合中的项目清单,以及对财产的检查项目。如果该属性为true,则绘制更大的信件和其他颜色的项目。如果没有,它会检查该项目的鼠标悬停在当前项目的索引。如果索引/ - 1 / - 2,那么它绘制在色彩的项目,并赋予它更大的尺寸。如果不是,它绘制在黑与正常大小的项目。每次制定一个项目是,目前y的位置(目前该变量被命名为X,但它会被纠正)是用来作为下一个项目的起点。因此,如果该项目的高度更大,因为鼠标或在某个项目的接近它,然后下一个项目将被重绘正确。Form1_MouseMove
这种方法控制​​鼠标的移动。首先,它清除_itemOver和_indexOver类的属性。然后,通过_items收集和每一个项目,它调用的埃斯塔(浮动Y)方法。这Item类的公共方法,收到AY的位置,并返回是否项目的_inicio _fin属性(开头和结尾)之间。如果这是真的,那么鼠标以上的项目,因此它设置的项目在属性设置为true和更新_itemOver和_indexOver类的属性。如果它是假的,那么对财产设置为false。通过收集,如果鼠标在某个项目(检查_itemOver或为空值_indexOver)后,它会将Cursors.Hand鼠标光标。否则,它会将它Cursors.Default。
最后,它调用this.Invalidate()方法,强制重绘,有了它,调用OnPaint方法,重绘菜单。Form1_MouseClick
这最后的方法只显示当前项目,如果有任何选择。它可以用来调用一个委托,返回一个值,或任何人都希望从菜单。兴趣点
这样做我所学到的是,它真的很容易创建自己的控件,用自己的功能和扩展。NET Framework功能。下一步是什么?
在未来的更新,我将计划在本周末结束,做,我会:更新的代码添加注释重写的代码在一个更好的阶级结构所有的西班牙名字更容易,英文名称更改使用户的一种形式,而不是控制阅读您的建议,尝试和改进此菜单历史03/12/2007 - 第一版本

回答

评论会员:ksomi 时间:2011/12/14
伟大的文章和漂亮的辛勤工作。一个好主意。继续作出贡献。
如何尽快"不是现在"变成"从来没有"。
每一个成就开始决定尝试
拍摄月球。即使你错过了,你的明星之间的土地。


评论会员:马蒂亚斯Szulman 时间:2011/12/14
嗨,
是U??

AAA
评论会员:戴夫Kreskowiak 时间:2011/12/14
感谢你这个整齐的文章,我喜欢这个主意,我不会去寻找错误CUZ我只是关心的总体思路,我们可以随时自己小的错误..如此反复,感谢你漂亮的贡献。
微笑:一个曲线,可以直接设置了很多东西!(\ /)
(O.o)
(><){ BR}
评论会员:约翰主教 时间:2011/12/14
错误号码{S2}
微笑:一个曲线,可以直接设置了很多东西!(\ /)
(O.o)
(><){ BR}
评论会员:马克克利夫顿 时间:2011/12/14
我张贴的作者,但有点着急,并张贴在这里

一个错误的号码{S2}遗憾。
如何尽快"不是现在"变成"从来没有"。
每一个成就开始决定尝试
拍摄月球。即使你错过了,你的明星之间的土地。


评论会员:马蒂亚斯Szulman 时间:2011/12/14
没关系{S4}的,漂亮的,以满足您虽然
微笑:一个曲线,可以直接设置了很多东西!(\ /)
(O.o)
(><){ BR}
评论会员:大卫斯通 时间:2011/12/14
转到最后一个项目,你可以不选择它。

"爱国主义是恶棍的最后避难所。" - 塞缪尔约翰逊


评论会员:马克克利夫顿 时间:2011/12/14
!谢谢你的意见
我会寻找错误和hopeffully,我将有固定的下一个版本(下周五,如果一切顺利的话)

马蒂亚斯Szulman
评论会员:JazzJackRabbit 时间:2011/12/14
给我一个径向菜单的想法。

。NET是一个永不落幕的珍宝盒,我每天得到另谋宝石
:马蒂亚斯Szulman
评论会员:游客 时间:2011/12/14
我认为这是不错的考虑周围的导通时间的。我给你4就可以了,只是因为我认为这需要多一点幕后的解释。但总体而言,好样的!戴夫Kreskowiak微软的MVP-VisualBasic中