我正在使用Delphi XE并尝试更新旧的Delphi代码库。该软件最初是用Delphi 7开发的,并使用了Jonathan Hosking于2001年编写的一个黑客版TPNGButton.TPNGButton支持透明度和发光悬停效果。不幸的是,当项目移植到Delphi XE上时,所有图像都被拉伸以填充整个按钮的区域。
我正在尝试使用TButton创建一个类似的按钮,但我正在撞墙。我创建了一个新的测试项目,并添加了TButton和带有PNG图像的TImageList。我将此图像列表添加到按钮的Image属性,并选择了正确的ImageIndex。这导致按钮具有正确的图像,但图像太小(16x16像素)。
我尝试通过更改TImageList的大小来修复大小问题,但在此之后,即使输入以前的值,我根本看不到图像。当然,即使最新版本的Delphi GUI设计器也缺乏对撤消的支持,因此我必须删除图像列表并添加新的图像列表以将图像恢复到按钮。
有没有更好的方法来获得我想要的按钮,或者我必须自己编写代码或尝试修复被黑客入侵的TPNGButton实现?当然,这不是2011年使用Delphi进行GUI开发的最佳方式吗?
答案 0 :(得分:4)
答案 1 :(得分:0)
Delphi XE在绘制到画布时拉伸图像。始终使用正确的x位置绘制完整尺寸的图像可以避免拉伸。然后,画布外的所有像素将自动剪裁,并显示正确的字形。在TPngButton的Paint方法中更改case语句,如下所示:
Case EtatBtn of
0: FPngImg.Draw(Canvas,Rect(0,0,4 * width, Height)); // Normal
1: FPngImg.Draw(Canvas,Rect(-Width,0,3 * width, Height)); // Mouse Entered
2: FPngImg.Draw(Canvas,Rect(-(Width * 2),0,2*width,Height)); // Pressed
3: FPngImg.Draw(Canvas,Rect(-(Width * 3),0,width,Height)); // Disabled
end; //case