Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TPanel + WS_EX_Transparent + PNG = ...


000001 ©   (2007-07-06 22:55:00) 

Задача: накрыть некоторые элементы (TEdit, TLabel, TMemo, ...) прозрачной панелью, на которой размещен полупрозрачный PNG-рисунок.
Всё ок, в случае с TButton и TLabel, а вот в случае TEdit и TMemo - не получается, лезут они сверху прозрачной панели, сверху PNG-картинки.

Прозрачность панели реализуется так:

{ TPanel }

procedure TPanel.CreateParams(var Params: TCreateParams);
begin
 inherited CreateParams(Params);
 Params.ExStyle := Params.ExStyle + WS_EX_Transparent;
end;

procedure TPanel.Paint;
var
 XBitMap: TBitMap;
 XOldDC: HDC;
 XRect: TRect;
begin

 if (csDesigning in ComponentState)
   then inherited Paint
 else begin
   XRect := ClientRect;
   XOldDC := Canvas.Handle;
   XBitMap := TBitMap.Create;
   try
     XBitMap.Height := Height; XBitMap.Width:=Width;
     Canvas.Handle := XBitMap.Canvas.Handle;
     inherited Paint;
     RedrawWindow(Parent.Handle, @XRect, 0,
                  RDW_ERASE or RDW_INVALIDATE or
                  RDW_NOCHILDREN or RDW_UPDATENOW);
   finally
     Canvas.Handle := XOldDC;
     Canvas.BrushCopy(XRect, XBitMap, XRect, Color);
     XBitMap.Free;
     end;
   end;
end;


Что посоветуете?


hommRO   (2007-07-07 00:13:00) [1]

Мое мнение ввобще на счет сабжа: для реализации этого в win32 уйдет сил не меньше, чем при реализации с нуля (собственной отрисовкой контролов, событий клавиатуры, но просто на одном окне. с WS_EX_Transparent вообще ничего хорошего никогда не получится.


000001   (2007-07-06 23:24:00) [2]

Не знаю, как сказать. Делаю Panel.Invalidate, вся полупрозрачность от PNG теряется.


hommRO   (2007-07-06 23:14:00) [3]

> и что делать?

Вопрос по нармальному задать?


000001   (2007-07-06 23:09:00) [4]

Посмотрел я CM_INVALIDATE, да срабатывает, хорошо, но получается интересно: прозрачность (и вообще прозрачность ли?) TImage начинает уменьшаться с каждым вызовом Invalidate. Т.е. что тут и от чего это происходит от моего прозрачного TPanel или от полупрозрачного PNG...по чему так? и что делать?


hommRO   (2007-07-06 23:01:00) [5]

> Что посоветуете?

Edit1.OnChange
Panel1.Invalidate;


Наверх

Титульная страница Поиск, карта сайта Написать письмо