含图片的TPopupMenu中TMenuItem闪烁问题排查
问题现象
在Delphi开发中,当TPopupMenu中的TMenuItem关联图片后,会出现整个菜单项闪烁的异常现象(注:颜色细微变化属于图片压缩问题,无需关注)。
复现情况
- 可稳定复现的系统:3台Windows 7设备(2台物理机、1台虚拟机)
- 无此问题的系统:Windows 10及更高版本
调试排查结论
我对Vcl.Menus单元进行了深度调试后发现,闪烁的根源并非绘制操作,而是访问TMenuItem的Canvas属性触发的——哪怕不执行任何绘制逻辑,仅仅读取Canvas的属性(比如Brush.Color)就会引发闪烁。这直接导致常规的双缓冲优化方案无法实施,因为双缓冲通常需要依赖Canvas的CopyRect、BitBlt等操作来实现,而这些操作必然会访问Canvas属性。
示例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 000000000000CC483F00CC483F00CC483F00CC483F00CC483F00CC48 3F00CC483F000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000CC483F00CC483F00CC483F00CC483F00CC483F00CC48 3F00CC483F000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000CC483F00CC483F00CC483F00CC483F00CC4 } end end
内容的提问来源于stack exchange,提问作者CodeX
相关产品推荐
相关产品推荐

