Delphi 2010关于t按钮褪色/闪烁的图像

Delphi 2010关于t按钮褪色/闪烁的图像,delphi,delphi-2010,Delphi,Delphi 2010,当我设置按钮(来自imagelist组件/PNG)的imageindex和images属性时,启动程序并单击按钮,图像缓慢闪烁/淡入淡出。如何防止出现这种情况以及问题是什么?它似乎是Tbutton的双缓冲属性。设置为false时,图像闪烁,设置为true时,图像工作。这发生在启用aero的Win 7上。恢复旧主题 在互联网上搜索解决方案后,什么也没找到,我查看了TCustomButton代码 Windows上的按钮控件内部有一个包含6个图像的imagelist,如下所示: 索引0:正常图像 索引

当我设置按钮(来自imagelist组件/PNG)的imageindex和images属性时,启动程序并单击按钮,图像缓慢闪烁/淡入淡出。如何防止出现这种情况以及问题是什么?

它似乎是Tbutton的双缓冲属性。设置为false时,图像闪烁,设置为true时,图像工作。这发生在启用aero的Win 7上。

恢复旧主题

在互联网上搜索解决方案后,什么也没找到,我查看了TCustomButton代码

Windows上的按钮控件内部有一个包含6个图像的imagelist,如下所示:

索引0:正常图像
索引1:热图像(当鼠标移动到按钮上时)
索引2:按下图像(同时按住鼠标按钮)
索引3:禁用的图像
索引4:所选图像(当按钮有焦点但未按下或鼠标悬停时)
索引5:(我们需要的,但不能在TButton控件中指定的;我们将讨论它)

在Delphi中的TButton控件中,您可以将ImageList设置为“Images”属性,并可以设置“ImageIndex”、“HotImageIndex”、“PressedImageIndex”、“DisabledImageIndex”和“SelectedImageIndex”。

设置此属性后,TButton控件将创建另一个图像列表,并将属性中指定的索引从“Images”属性中的图像列表复制到新创建的图像列表中,顺序如上文所述。

问题是,当你聚焦控件时,Win 7 Aero的效果是淡入淡出高亮颜色(一点动画),它使用内部图像列表中的第6个图像淡入淡出,但不可能将“淡入淡出”图像索引提供给TButton控件,因此,我创建了一个简单的解决方案,它适合我自己,但我必须在运行时调用它。(例如,您可以从TCustomButton派生一个新类并创建一个新控件,您可以设置一个新的SelectedFadeImageIndex,但我没有这样做)。

我创建了这个过程:


因此,当创建窗口时(在OnCreate事件上),我只需调用MakeButtonImageStopBlinking来支持每个以图像为参数的按钮,现在一切都正常了。

Sry感谢您重温这样一个老话题,但它似乎并不能回答任何问题(或者我无法正确搜索)。


编辑:将DoubleBufferd设置为True将起作用,但它将停止带有焦点的按钮上的小动画。使用上面的解决方案,您可以将DoubleBuffered保留为False,这样您就可以得到所有内容(来自aero的动画和不褪色的图像)。

您可以显示.dfm和表单代码吗?当您说“设置imageindex和images属性”时,这到底是什么意思(在对象检查器中,还是在代码中)?我从来没有见过这样的东西,也无法在D2010或XE的快速测试中重现它。我从ImageList中选择一个图像作为按钮。按钮位于选项卡1上的页面控件上。当我运行应用程序时,图像会淡入淡出。再次,请发布您的代码和dfm。如果没有它,你就没有任何工作可以做,你的问题很可能会结束。说“我选择一张图片”没有帮助。你是怎么选择的?发布你的代码。我从imagelist中指定一个png图像放在tbutton上。请原谅我的英语。下面的风暴也有同样的问题。那么这是在vista或win7上,并且启用了aero glass主题?
    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;