На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Обязательно выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Этот раздел предназначен для вопросов, посвященных разработке компонентов, а также для тестирования собственных бесплатных компонентов с открытым исходным кодом.

Здесь запрещается:
1. Размещать ссылки на какие-либо коммерческие компоненты, реализующие требуемую функциональность.
2. Обсуждать и тестировать коммерческие компоненты или компоненты с закрытым кодом.
3. Давать ссылки на сайты с исходным кодом компонентов. Все тестируемые исходные коды должы быть размещены на сайте ИСХОДНИКИ.RU.
Модераторы: Rouse_, DimaBr
  
> Как наделить потомка TWinControl прозрачным фоном?
    Добрый день, гуру!

    Пытаюсь создать компонент, который будет отрисовывать на собственной канве полупрозрачный png. При этом, он не должен затирать то, что под ним (например, Label). В качестве родительского выбран класс TCustomControl.
    И вот беда - он под собой заливает(?) канву цветом формы...

    Как можно добиться того, чтобы потомок TCustomControl не затирал то, что под ним отрисовано?
    Я пробовал и
    ExpandedWrap disabled
      ControlStyle := ControlStyle - [csOpaque];

    и
    ExpandedWrap disabled
      procedure TMyControl.Paint;
      begin
        Canvas.Brush.Style := bsClear;
        inherited;
        ...
      end;

    и
    ExpandedWrap disabled
      procedure TMyControl.Paint;
      begin
        SetBkMode(Canvas.Handle, TRANSPARENT);
        ...
      end;

    Не помогло...
    Не подскажите ли, как быть? Куда смотреть?

    Спасибо!
      TWinControl не может быть прозрачным или полупрозрачным, если это не форма. Любые прозрачные WIN-контролы это имитация прозрачности, попытка нарисовать изображение под собой на своей канве.
      Note that WS_EX_LAYERED cannot be used for child windows
        DimaBr, спасибо за ответ! направление понятно )
        И в итоге у меня получилось следующее:
        ExpandedWrap disabled
          procedure TGSCustomImageControl.WMEraseBkGnd(var msg: TWMEraseBkGnd);
          begin
            msg.result := 1;
          end

        Так фон не стирается перед отрисовкой в Paint. И после этого можно AlphaBlend'ом отрисовать контрол полупрозрачно на имеющемся фоне.
        Но появляется другая проблема - каждая отрисовка накладывает на отрисованную ранее полупрозрачную картинку еще одну такую же, и получается что полупрозрачность выведенной картинки с каждой отрисовкой уменьшается...

        Вот, теперь, как бы умудриться получать изображение того, что должно быть отрисовано под моим контролом?

        Пробую сделать вот так:
        ExpandedWrap disabled
          ...
          FParentBMP: TBitMap;
          ...
          procedure TGSCustomImageControl.WMEraseBkGnd(var msg: TWMEraseBkGnd);
          begin
            BitBlt(FParentBMP.Canvas.Handle, 0, 0, Width, Height, GetDC(Parent.Handle), Left, Top, SRCCOPY);
            msg.result := 1;
          end;
           
          procedure TGSCustomImageControl.Paint;
          begin
            BitBlt(Canvas.Handle, 0, 0, Width, Height, FParentBMP.Canvas.Handle, 0, 0, SRCCOPY);
            // далее подготовка картинки и blendFunction
            ...
            // отрисовка
            Windows.AlphaBlend(Canvas.Handle, 0,0,FMasterBMP.Width, FMasterBMP.Height,
                                              FMasterBMP.Canvas.Handle, 0,0,FMasterBMP.Width,FMasterBMP.Height, bf);
          end;

        Но это не дает результата... Можете подсказать, как быть в этот раз?
          Да, забыл еще указать вот это в моем варианте:
          ExpandedWrap disabled
            procedure TGSCustomImageControl.CreateParams(var Params: TCreateParams);
            begin
              inherited;
              Params.ExStyle := Params.ExStyle or WS_EX_TRANSPARENT;
            end;
            Нормальная прозрачность всё равно не получится, даже в продвинутых либах наблюдаются неприятные глюки
            user posted image
              Цитата DimaBr @
              Нормальная прозрачность всё равно не получится, даже в продвинутых либах наблюдаются неприятные глюки

              :yes:
              А если контрол еще и интерактивный (имеет возможность ввода, или просто имеет скроллбары) - так это вообще гиблое дело.
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0252 ]   [ 16 queries used ]   [ Generated: 19.04.24, 02:47 GMT ]