Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как избежать того, что в некоторых видео режимах прозрачная часть glyphа стандартного TBitBtn становится видной

Delphi , Графика и Игры , Компоненты и Графика

Как избежать того, что в некоторых видео режимах прозрачная часть glyphа стандартного TBitBtn становится видной

В примере используется техника закраски прозрачной части glyph'а цветом кнопки на которой он находится - таким образом glyph кажется прозрачным.


function InitStdBitBtn(BitBtn : TBitBtn; kind : TBitBtnKind) : bool;
var
  Bm1: TBitmap;
  Bm2: 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');
    bkYes    : Bm1.Handle := LoadBitmap(hInstance, 'BBYES');
    bkNo     : Bm1.Handle := LoadBitmap(hInstance, 'BBNO');
    bkClose  : Bm1.Handle := LoadBitmap(hInstance, 'BBCLOSE');
    bkAbort  : Bm1.Handle := LoadBitmap(hInstance, 'BBABORT');
    bkRetry  : Bm1.Handle := LoadBitmap(hInstance, 'BBRETRY');
    bkIgnore : Bm1.Handle := LoadBitmap(hInstance, 'BBIGNORE');
    bkAll    : Bm1.Handle := LoadBitmap(hInstance, 'BBALL');
  end;
  Bm2 := TBitmap.Create;
  Bm2.Width := Bm1.Width;
  Bm2.Height := Bm1.Height;
  Bm2.Canvas.Brush.Color := ClBtnFace;
  Bm2.Canvas.BrushCopy(Rect(0, 0, bm2.Width, bm2.Height), Bm1,
  Rect(0, 0, Bm1.width, Bm1.Height),
  Bm1.canvas.pixels[0,0]);
  Bm1.Free;
  LockWindowUpdate(BitBtn.Parent.Handle);
  BitBtn.Kind := kind;
  BitBtn.Glyph.Assign(bm2);
  LockWindowUpdate(0);
  Bm2.Free;
  Result := true;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  InitStdBitBtn(BitBtn1, bkOk);
end;

Проблема, с которой вы столкнулись, заключается в том, что прозрачная часть глифа (например, кнопка "ОК") становится видимой при изменении видеорежима, что может не быть желаемым. Для избежания этого можно использовать технику называемую "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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Компоненты и Графика ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-10-26 17:54:26/0.0037679672241211/0