当我设置Button的imageindex和images属性时(从imagelist组件/ pngs),启动程序并单击按钮,图像缓慢闪烁/淡入淡出。如何防止这种以及似乎是什么问题?
答案 0 :(得分:8)
重振旧话题......
在互联网上搜索解决方案后没有发现任何内容,我查看了TCustomButton代码。
事实上,Windows上的按钮控件有一个带有6个图像的图像列表,如下所示:
索引0:正常图像
index 1:热图像(当鼠标移过按钮时)
索引2:按下图像(按住鼠标按钮d)
索引3:禁用图像
索引4:所选图像(当按钮有焦点但未按下或鼠标悬停在其上时)
索引5 :(我们需要的那个,不能在TButton控件中指定;我们将讨论它)
在Delphi的TButton控件中,您可以将ImageList设置为“Images”属性,并可以设置“ImageIndex”,“HotImageIndex”,“PressedImageIndex”,“DisabledImageIndex”和“SelectedImageIndex”。
设置此属性后,TButton控件将创建另一个图像列表,并按照上面指定的顺序将您在属性中指定的索引从“Images”属性中的图像列表复制到新创建的图像列表。
问题是,当您对焦控件时,Win 7 Aero具有淡入和淡出高亮颜色(一点动画)的效果,并且它使用了内部图像列表中的第6个图像淡入和淡出,但是为TButton控件提供“FADE”图像索引是不可能的,所以我创建了一个适合我自己的简单解决方案,但我必须在RunTime中调用。 (您可以从TCustomButton派生一个新类并创建一个新控件,例如,您可以设置一个新的SelectedFadeImageIndex,但我没有)。
我创建了这个程序:
procedure MakeButtonImageStopBlinking(AButton: TCustomButton);
var
ButtonImageList: TButtonImageList;
Icon: HICON;
begin
SendMessage(AButton.Handle, BCM_GETIMAGELIST, 0, LPARAM(@ButtonImageList));
Icon := ImageList_GetIcon(ButtonImageList.himl, 0, ILD_NORMAL);
ImageList_AddIcon(ButtonImageLIst.himl, Icon);
DestroyIcon(Icon);
end;
所以,当窗口被创建时(在OnCreate事件上),我只需要调用MakeButtonImageStopBlinking来提供每个按钮,它将图像作为参数,现在一切正常。
想要加速这样一个老话题,但似乎没有任何答案(或者我无法正常搜索)。
编辑:将DoubleBufferd设置为True将起作用,但它将从具有焦点的按钮停止小动画。使用上面的解决方案,您可以将DoubleBuffered保留为False,您将获得所有这些(来自aero的动画并且没有淡出图像)。
答案 1 :(得分:3)
它似乎是Tbutton的doubleBuffered属性。设置为false时,图像闪烁,设置为true时,它正在工作。这种情况发生在启用了aero的Win 7上。