TMenuItem
内的TPopupMenu
如果包含图片,则会闪烁。
请注意,整个项目都是闪烁的,而不仅仅是图像区域(不要介意稍微改变颜色,这是一个压缩问题)。
我已经在这个问题上工作了几个小时,但遗憾的是找不到解决方案,或者至少找不到解释。这个问题类似于我的上一个问题(Remove flickering from TSpeedButton),所以我猜不是每个人都能重现这个问题。我可以在3个不同的Windows 7系统(2个物理,1个VM)上重现它,但不能在我的Windows 10系统上重现(与TSpeedButton
闪烁相同)。即使你无法重现它,也许你可以想出一个理由和解决方案。
我调试了Vcl单元(主要是Vcl.Menus),以为我可以为图像创建一个自定义的双缓冲绘制方法。但事实证明,这幅画不是问题。来自TMenuItem
画布的阅读是
画布在TPopupList.WndProc
中创建。如果我删除了行DrawMenuItem()
,则闪烁消失(同样是图像)。这是奇怪的部分。如果我访问画布的某些属性(没有在其上绘制任何东西),闪烁又回来了!例如,添加以下行(而不是DrawMenuItem()
)会导致闪烁,而不会绘制任何图像:
OutputDebugString(PChar(IntToHex(Canvas.Brush.Color)));
我无法在不访问画布内容(使用Canvas.CopyRect
或BitBlt
复制)或至少读取一种像素颜色的情况下创建双缓冲解决方案。
这是一个样本dfm(使用Delphi 10.2.3创建):
object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 295
ClientWidth = 341
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
PopupMenu = PopupMenu1
PixelsPerInch = 96
TextHeight = 13
object PopupMenu1: TPopupMenu
Images = ImageList1
Left = 168
Top = 152
object Firstline1: TMenuItem
Caption = 'First line'
ImageIndex = 0
end
object Secondline1: TMenuItem
Caption = 'Second line'
ImageIndex = 0
end
object hirdline1: TMenuItem
Caption = 'Third line'
ImageIndex = 0
end
end
object ImageList1: TImageList
Left = 96
Top = 152
Bitmap = {
494C010101000500040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
0000000000003600000028000000400000001000000001002000000000000010
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000CC483F00CC483F00CC483F00CC483F00CC483F00CC48
3F00CC483F000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000CC483F00CC483F00CC483F00CC483F00CC483F00CC48
3F00CC483F000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000CC483F00CC483F00CC483F00CC483F00CC483F00CC48
3F00CC483F000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000CC483F00CC483F00CC483F00CC483F00CC483F00CC48
3F00CC483F000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000CC483F00CC483F00CC483F00CC483F00CC483F00CC48
3F00CC483F000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000241CED00241C
ED00241CED00241CED00CC483F00CC483F00CC483F00CC483F00CC483F00CC48
3F00CC483F000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000241CED00241C
ED00241CED00241CED00CC483F00CC483F00CC483F00CC483F00CC483F00CC48
3F00CC483F000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000241CED00241C
ED00241CED00241CED00241CED00241CED00241CED0000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000241CED00241C
ED00241CED00241CED00241CED00241CED00241CED0000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000241CED00241C
ED00241CED00241CED00241CED00241CED00241CED0000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000241CED00241C
ED00241CED00241CED00241CED00241CED00241CED0000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000241CED00241C
ED00241CED00241CED00241CED00241CED00241CED0000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000424D3E000000000000003E000000
2800000040000000100000000100010000000000800000000000000000000000
000000000000000000000000FFFFFF00FFFF000000000000FFFF000000000000
FC07000000000000FC07000000000000FC07000000000000FC07000000000000
FC07000000000000C007000000000000C007000000000000C07F000000000000
C07F000000000000C07F000000000000C07F000000000000C07F000000000000
FFFF000000000000FFFF00000000000000000000000000000000000000000000
000000000000}
end
end
此外,我已经浏览了我安装的应用程序并尝试了他们的上下文菜单。只有少数人在闪烁,其中大部分都没有。进一步调查显示,所有受影响的应用程序都是使用Delphi创建的!对我来说,这似乎是一个普遍的德尔福问题,一直存在,但没有人关心它 - 也许是因为它不会影响所有系统。
造成这个问题的原因是什么?是否有适当的解决方案或至少有解决方法?