Карта сайтаСсылкиКонтакты

Создание компонента с прозрачным фоном

PDF Печать
Статьи

Бывают случаи, когда Вам понадобился компонент с прозрачным фоном, который не будет загораживать изображение позади него. Что для этого нужно сделать?

Чтобы сделать это, создайте новое управление, полученное, например от TGroupBox и отмените его метод CreateParams, подобно этому:


{ ... }
protected {в объявлении управления}
  procedure CreateParams(var params: TCreateParams); override;
{ ... }

procedure TTransparentGroupbox.CreateParams(var params: TCreateParams);
begin
  inherited CreateParams(params);
  params.ExStyle := params.ExStyle or WS_EX_TRANSPARENT;
end;

Добавьте обработчик сообщения для WM_ERASEBKGND:


{ ... }
private { в объявлении управления }
  procedure WMEraseBkGnd(var msg: TWMEraseBkGnd); message WM_ERASEBKGND;
{ ... }

procedure TTransparentGroupbox.WMEraseBkGnd (var msg: TWMEraseBkGnd);
begin
  SetBkMode (msg.DC, TRANSPARENT);
  msg.result := 1;
end;

Но это справедливо только для TWinControl. Для TGraphicControl не подходит отмена CreateParams (так как только TWinControl имеют этот метод), а нужно отменить конструктор Create. После вызова унаследованного конструктора, нужно изменить ControlStyle управления:


ControlStyle := ControlStyle - [csOpaque];

Фактически, прозрачность работает лучше для TGraphicControl, чем для TWinControl. TWinControl будет иметь проблемы, когда управление будет перемещено или фон должен измениться.

Контейнерное управление Delphi (типа формы или панели) всегда создается со стилем WS_CLIPCHILDREN, который автоматически исключает область под дочерним управлением от изменений, так что фон не будет модифицироваться, если потребуется. Удаление стиля WS_CLIPCHILDREN из родительского управления возможно с:


SetWindowLong(
  Parent.handle,
  GWL_STYLE,
  GetWIndowLong(Parent.handle, GWL_STYLE) and not WS_CLIPCHILDREN
);

Но это может привести к чрезмерным мерцаниям при обновлениях экрана.


 

Добавить комментарий


Защитный код
Обновить