Проблема, с которой вы столкнулись, заключается в том, что прозрачная часть глифа (например, кнопка "ОК") становится видимой при изменении видеорежима, что может не быть желаемым. Для избежания этого можно использовать технику называемую "color keying", чтобы маскировать прозрачные части глифа цветом кнопки.
В вашем коде вы уже используете схожий подход, создавая второй битов (Bm2) и заполняете его цветом лица кнопки (ClBtnFace). Однако, этот метод имеет некоторые ограничения. Например, он может не работать правильно, если глиф содержит сложные формы или анти-алиасированные края.
Альтернативным решением может быть использование alpha blending вместо color keying. Alpha blending позволяет вам композитить глиф над фоновым изображением с альфа-каналом (маской прозрачности). Таким образом, вы можете достичь более точных результатов и избежать видимых артефактов при изменении видеорежима.
Вот модифицированная версия вашего кода, которая использует alpha blending:
function InitStdBitBtn(BitBtn: TBitBtn; kind: TBitBtnKind): bool;
var
Bm1: TBitmap;
begin
Result := false;
if Kind = bkCustom then
exit;
Bm1 := TBitmap.Create;
case Kind of
bkOK : Bm1.Handle := LoadBitmap(hInstance, 'BBOK');
bkCancel : Bm1.Handle := LoadBitmap(hInstance, 'BBCANCEL');
bkHelp : Bm1.Handle := LoadBitmap(hInstance, 'BBHELP');
// ...
end;
Bm1.Canvas.Transparent := True;
Bm1.Canvas.FillStyle := fsPattern;
Bm1.Canvas.Pen.Style := psNone;
Bm1.Canvas.Pen.Color := clBtnFace;
Bm1.Canvas.Brush.Color := clBtnFace;
Bm1.Canvas.FillRect(Rect(0, 0, Bm1.Width, Bm1.Height));
BitBtn.Kind := kind;
BitBtn.Glyph.Assign(Bm1);
Bm1.Free;
Result := true;
end;
В этом модифицированном коде мы устанавливаем свойство Transparent канваса битов в True, что позволяет использовать alpha blending. Затем мы заполняем всю картинку одним цветом (clBtnFace) с помощью метода FillRect. Таким образом, глиф будет композитироваться над фоновым изображением с альфа-каналом, эффективно маскируя прозрачные части.
Обратите внимание, что это подход требует графического контекста, поддерживающего alpha blending, например, системы Windows 10 или новее с соответствующим GPU. Если вам нужно поддерживать более старые системы, вы можете предпочесть использовать технику color keying или исследовать другие альтернативы.
В статье описывается метод, позволяющий избежать видимости прозрачной части glyph standardного TBitBtn в некоторых видео режимах, путем закраски этой части цветом кнопки.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS