TSpeedButton with TAction - автоматически сгенерированное отключенное изображение учитывает только черный цвет
Прежде всего, я уже знаю, что когда вы реализуете TSpeedButton
, когда вы назначаете его Glyph
, если у вас нет более одного глифа, то NumGlyphs
должно быть 1
и когда он отключен, он автоматически использует то же изображение для автоматической генерации отключенной версии глифа.
Однако в моей ситуации я назначаю действие этой кнопке скорости. TActionManager
имеет как Images
а также DisabledImages
указал на то же самое 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;
0 ответов
Поместите кнопку скорости в групповое поле и отключите групповое поле, вам не нужны отключенные глифы, и все еще будет только 1 изображение, изображение будет там, но кнопка все еще явно отключена