使用图像

时间:2018-06-01 13:10:31

标签: delphi

TMenuItem内的TPopupMenu如果包含图片,则会闪烁。

请注意,整个项目都是闪烁的,而不仅仅是图像区域(不要介意稍微改变颜色,这是一个压缩问题)。

flickering 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.CopyRectBitBlt复制)或至少读取一种像素颜色的情况下创建双缓冲解决方案。

这是一个样本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创建的!对我来说,这似乎是一个普遍的德尔福问题,一直存在,但没有人关心它 - 也许是因为它不会影响所有系统。

造成这个问题的原因是什么?是否有适当的解决方案或至少有解决方法?

0 个答案:

没有答案