Создание компонента с прозрачным фоном
{ ... } 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 );
Но это может привести к чрезмерным мерцаниям при обновлениях экрана.
Комментарии