按钮上的色彩变化及光影效果的产生!(20分)

  • 主题发起人 manta_mine
  • 开始时间
M

manta_mine

Unregistered / Unconfirmed
GUEST, unregistred user!
[:(]
请问各位老大:
在form上添加一个按钮,在按钮上再加一张图片!
图片的上中部加一个立体的可以根据参数而变换颜色的灯!
这该怎么作?
 
有空的兄弟们过来瞧瞧!
 
bitbtn就能做
或者用
panel+image+label来模拟
 
这样效果不太好!我试过了!我要的是个按钮。bitbtn只可以加一个图片。panel+inagel+label达不到按钮的效果!
 
不难。
两种解决方法:
1、几幅bmp和一个TImage, 这样你可以用photoshop等专业图片制作软件先做好各种状态下的按钮图片(按下, 加亮等), 然后根据鼠标动作加载不同的图片即可。
优点: 按钮效果极佳。编程极简单。
缺点: 用途唯一, 消耗内存资源重, 只能表现几种固定状态。 不能产生动画效果。
2、做一个控件用代码实现。
优点: 通用, 而且能达到动画的效果。
缺点: 实现比较繁琐。 如果不能找到一种好的算法, 做出来的效果不佳。 另, 如果不能尽量优化代码的话, 将占用大量cpu时间并且出现反应迟钝或闪烁的毛病。
 
Another_eYes大侠呀,专业的算法一般人都不会啊,有没有open source又行之有效的?呵呵。我觉得
我觉得新的msn explorer的按钮效果就不错,不知道用的什么方法?鼠标挪上去,给边缘加了一个渲
染的效果。应该是用的方法2吧?
还有苹果的Aqua流动界面,好酷哦,应该也是算法。
我用方法一做过几个,可是在2000上,有时和SpeedButton一样,鼠标挪出去了,还不变。绝大部分情
况正常。呵呵,不知道怎么办?
 
open source的图像算法库网上有很多。 随便搜索一下就是一大堆。 如果单是边缘渲染的话那非常简单。我的做法是先取图片的mask, 然后GaussianBlur渲染这个mask, 再按生成的新Mask中的值作为百分比往目标上填色,最后画上图片就达到目的了。 速度很快的。
至于你说的方法一遇到的情况, 产生这个Bug的情况只有一种:你的图片离它的Container边界太近。 鼠标移动的快点的话, 由于很快移出Container的边界了, 因此图片自己根本不会收到CM_MOUSELEAVE消息。 要验正这点有一个很简单的方法, 将图片放到一个Panel中,Panel的大小正好放下图片。 然后你移动鼠标吧, 即使再慢, 图片也不会收到CM_MOUSELEAVE消息的(有意思的是它会收到CM_MOUSEENTER消息)。
要解决有一个简单方法(我就是这么用的): 在CM_MOUSEENTER时打开一个Timer, CM_MOUSELEAVE时关闭。 Timer中定时检查鼠标坐标是否在图片边界范围内, 如果不在则通知图片重画鼠标离开状态并关闭Timer. 这样即使收不到CM_MOUSELEAVE消息也能正确显示图片状态。 Timer的Interval也不必设得很短, 150ms足够。 人眼区分不出差异。 这样占用系统资源也小。
另外说一句: 我是每个Form用一个Timer和一个TList作为检察列表, 所有Form上控件的CM_MOUSELEAVE检查都由这个Timer完成(控件的CM_MOUSEENTER中“注册”自己到这个Timer的检查列表中, CM_MOUSELEAVE或OnTimer发现鼠标已经离开后则在Timer检查列表中删除自己), 正常情况下这个检查列表中的元素数不会超过2个, 因此消耗的cpu时间可以忽略不计。
 
谢谢。我试试去:)
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
866
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
顶部