【问题标题】:TSpeedButton with TAction - Auto-generated disabled image only considers black带有 TAction 的 TSpeedButton - 自动生成的禁用图像仅考虑黑色
【发布时间】:2017-05-24 21:46:58
【问题描述】:

首先,我已经知道当你实现一个TSpeedButton时,当你分配它的Glyph时,如果你没有多个字形,那么NumGlyphs应该是1,而当它已被禁用,it will automatically use the same image 自动生成禁用版本的字形。

但是,在我的情况下,我正在为这个速度按钮分配一个动作。 TActionManagerImagesDisabledImages 都指向同一个 TImageList。我还测试了根本没有分配任何DisabledImages,以及使用全黑蒙版创建图像的副本,并通过DisabledImages 分配。

启用时,字形显示得很好(基于动作上设置的图像)。但是当它被禁用时,图像中只有纯黑色将用于禁用图像。任何除了纯黑色之外的任何颜色,甚至是略带黑色的东西,都会被完全忽略,并且在渲染禁用的图像时不包括在内。

这是启用测试的图像和自动生成的禁用图像之间的比较。该图像只是一个带有一些垂直线的 16x16 位图。从最右边开始,一条完全黑色的线,然后是左边稍亮的线。

如您所见,禁用时,它只考虑完全黑线。下一行只比全黑稍微亮一点。

我不能自己分配Glyph 属性,因为它会被分配给它的操作覆盖。我也无法在图像列表上设置两个字形宽度的图像,因为这些图像被广泛用于许多其他没有多个字形概念的地方。我也不想为我的图像使用全黑。

如何让禁用的TSpeedButton(作为禁用TAction 的结果)在分配了操作时显示禁用(灰显)的图像?

注意TBitBtn 或其他任何依赖于Glyph 的控件也会发生同样的情况。


u44169002.pas

unit u44169002;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Buttons, System.ImageList,
  Vcl.ImgList, System.Actions, Vcl.ActnList, Vcl.PlatformDefaultStyleActnCtrls, Vcl.ActnMan, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Actions: TActionManager;
    actTest: TAction;
    ImageList: TImageList;
    SpeedButton1: TSpeedButton;
    BitBtn1: TBitBtn;
    procedure actTestExecute(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.actTestExecute(Sender: TObject);
begin
  Self.actTest.Enabled:= False;
end;

end.

u44169002.dfm

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 231
  ClientWidth = 405
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object SpeedButton1: TSpeedButton
    Left = 24
    Top = 24
    Width = 105
    Height = 33
    Action = actTest
    Flat = True
  end
  object BitBtn1: TBitBtn
    Left = 160
    Top = 24
    Width = 105
    Height = 33
    Action = actTest
    Caption = 'Test Action'
    TabOrder = 0
  end
  object Actions: TActionManager
    DisabledImages = ImageList
    Images = ImageList
    Left = 24
    Top = 128
    StyleName = 'Platform Default'
    object actTest: TAction
      Caption = 'Test Action'
      Hint = 'This is just a test action'
      ImageIndex = 0
      OnExecute = actTestExecute
    end
  end
  object ImageList: TImageList
    Left = 24
    Top = 72
    Bitmap = {
      494C010101000800440010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
      0000000000003600000028000000400000001000000001002000000000000010
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000082828200000000006B6B6B000000
      0000555555000000000041414100000000002D2D2D00000000001D1D1D000000
      00000C0C0C000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000082828200000000006B6B6B000000
      0000555555000000000041414100000000002D2D2D00000000001D1D1D000000
      00000C0C0C000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000082828200000000006B6B6B000000
      0000555555000000000041414100000000002D2D2D00000000001D1D1D000000
      00000C0C0C000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000082828200000000006B6B6B000000
      0000555555000000000041414100000000002D2D2D00000000001D1D1D000000
      00000C0C0C000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000082828200000000006B6B6B000000
      0000555555000000000041414100000000002D2D2D00000000001D1D1D000000
      00000C0C0C000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000082828200000000006B6B6B000000
      0000555555000000000041414100000000002D2D2D00000000001D1D1D000000
      00000C0C0C000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000082828200000000006B6B6B000000
      0000555555000000000041414100000000002D2D2D00000000001D1D1D000000
      00000C0C0C000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000082828200000000006B6B6B000000
      0000555555000000000041414100000000002D2D2D00000000001D1D1D000000
      00000C0C0C000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000082828200000000006B6B6B000000
      0000555555000000000041414100000000002D2D2D00000000001D1D1D000000
      00000C0C0C000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000082828200000000006B6B6B000000
      0000555555000000000041414100000000002D2D2D00000000001D1D1D000000
      00000C0C0C000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000082828200000000006B6B6B000000
      0000555555000000000041414100000000002D2D2D00000000001D1D1D000000
      00000C0C0C000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000082828200000000006B6B6B000000
      0000555555000000000041414100000000002D2D2D00000000001D1D1D000000
      00000C0C0C000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000082828200000000006B6B6B000000
      0000555555000000000041414100000000002D2D2D00000000001D1D1D000000
      00000C0C0C000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000082828200000000006B6B6B000000
      0000555555000000000041414100000000002D2D2D00000000001D1D1D000000
      00000C0C0C000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      000000000000000000000000000000000000424D3E000000000000003E000000
      2800000040000000100000000100010000000000800000000000000000000000
      000000000000000000000000FFFFFF00FFFF0000000000005555000000000000
      5555000000000000555500000000000055550000000000005555000000000000
      5555000000000000555500000000000055550000000000005555000000000000
      5555000000000000555500000000000055550000000000005555000000000000
      5555000000000000FFFF00000000000000000000000000000000000000000000
      000000000000}
  end
end

为了举例,这是我使用的测试位图:


实际上,在Vcl.Buttons单元中,在函数TButtonGlyph.CreateButtonGlyph中,下面的代码似乎明确地只考虑了黑色区域:

{ Create a disabled version }
with MonoBmp do
begin
  Assign(FOriginal);
  HandleType := bmDDB;
  Canvas.Brush.Color := clBlack;
  Width := IWidth;
  if Monochrome then
  begin
    Canvas.Font.Color := clWhite;
    Monochrome := False;
    Canvas.Brush.Color := clWhite;
  end;
  Monochrome := True;
end;
with TmpImage.Canvas do
begin
  Brush.Color := clBtnFace;
  FillRect(IRect);
  Brush.Color := clBtnHighlight;
  SetTextColor(Handle, clBlack);
  SetBkColor(Handle, clWhite);
  BitBlt(Handle, 1, 1, IWidth, IHeight,
    MonoBmp.Canvas.Handle, 0, 0, ROP_DSPDxax);
  Brush.Color := clBtnShadow;
  SetTextColor(Handle, clBlack);
  SetBkColor(Handle, clWhite);
  BitBlt(Handle, 0, 0, IWidth, IHeight,
    MonoBmp.Canvas.Handle, 0, 0, ROP_DSPDxax);
end;

【问题讨论】:

  • 只是禁用的图像生成算法不够好(按钮中的TButtonGlyph.CreateButtonGlyph)。分配一个深色图像,您会注意到一个微弱的灰色禁用图像。
  • @SertacAkyuz 刚刚尝试,使用全黑圆圈,全白背景,Flat 打开。禁用后我仍然什么也看不到。
  • 我用XE2追踪的,也许从那以后它已经改变了,用glyfx的蓝色箭头尝试。
  • @Ken 但是你有分配给他们的动作吗?这是我问题的根源......我没有自己分配字形。它们受分配给它的动作以及与该动作相关联的图像的支配。我在一个生产项目中遇到了这个问题,所以我做了这个测试项目来证明它。我的典型字形中根本没有任何黑色。它们都显示完全透明。请查看我在问题末尾添加的内容。
  • 是的,这就是适合您的操作管理器。夺走控制权。操作列表让您重新获得控制权。

标签: delphi delphi-10.1-berlin tactionmanager


【解决方案1】:

将速度按钮放在组框上并禁用不需要的组框禁用字形并且仍然只有 1 个图像 图像会在那里,但按钮仍然明显不显示

【讨论】:

    猜你喜欢
    • 2016-10-06
    • 2011-11-25
    • 2016-02-24
    • 1970-01-01
    • 2012-09-13
    • 2014-08-11
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    相关资源
    最近更新 更多