![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Добрый день. Пишу свой компонент.
создаю рисунки на paintBoxe. Хочу сделать их с возвможностью установки прозрачности. (полупрозрачности) Код:
var
bl:TBlendFunction;
Bl.BlendOp := AC_SRC_OVER;
Bl.BlendFlags := 0;
Bl.SourceConstantAlpha := Blend;
Bl.AlphaFormat := 0; //
Windows.AlphaBlend(Canvas.Handle,0, 0, Width, Height,
TPaintBox(Parent).canvas.handle , 0,0, Width, Height, Bl);
Вопрос - как получить Canvas Parenta без учета canvasa компонента... Заранее спасибо! Последний раз редактировалось max_torent, 08.11.2012 в 13:44. |
|
#2
|
||||
|
||||
|
Используй GetDC(Parent). Только освобождать не забывай.
|
|
#3
|
|||
|
|||
|
Все равно не выходит( Получается что изображение уже отрисовано на родителе и при расчете прозрачности получается что оно накладывается...
т.е. нужно получить canvas или HWND родителя, с исключенным в это время компонентом... |
|
#4
|
||||
|
||||
|
смотри как TLabel сделан
|
|
#5
|
|||
|
|||
|
А подробнее не подскажите? Где именно копать
|
|
#6
|
||||
|
||||
|
Цитата:
Код:
.....
unit StdCtrls;
.....
procedure TCustomLabel.SetTransparent(Value: Boolean);
begin
if Transparent <> Value then
begin
if Value then
ControlStyle := ControlStyle - [csOpaque] else
ControlStyle := ControlStyle + [csOpaque];
Invalidate;
end;
end;
..... |
| Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
max_torent (10.11.2012)
| ||
|
#7
|
||||
|
||||
|
Когда писал компоненты (года 3-4 назад) пользовался вот такой процедуркой. Откуда скопипащена - не помню. Стабильно работает на XP/Win7. D6/D7. На остальном не проверял.
Код:
procedure CopyParentImage(Control: TControl; Dest: TCanvas);
var
I, Count, X, Y, SaveIndex: Integer;
DC: HDC;
R, SelfR, CtlR: TRect;
begin
if (Control = nil) or (Control.Parent = nil) then Exit;
Count := Control.Parent.ControlCount;
DC := Dest.Handle;
{$IFDEF WIN32}
with Control.Parent do
ControlState := ControlState + [csPaintCopy];
try
{$ENDIF}
with Control do
begin
SelfR := Bounds(Left, Top, Width, Height);
X := -Left; Y := -Top;
end;
SaveIndex := SaveDC(DC);
try
SetViewportOrgEx(DC, X, Y, nil);
IntersectClipRect(DC, 0, 0, Control.Parent.ClientWidth, Control.Parent.ClientHeight);
with TParentControl(Control.Parent) do
begin
Perform(WM_ERASEBKGND, DC, 0);
PaintWindow(DC);
end;
finally
RestoreDC(DC, SaveIndex);
end;
for I := 0 to Count - 1 do
begin
if Control.Parent.Controls[i] = Control then
Break
else
if (Control.Parent.Controls[i] <> nil) and (Control.Parent.Controls[i] is TGraphicControl) then
begin
with TGraphicControl(Control.Parent.Controls[i]) do
begin
CtlR := Bounds(Left, Top, Width, Height);
if Bool(IntersectRect(R, SelfR, CtlR)) and Visible then
begin
{$IFDEF WIN32}
ControlState := ControlState + [csPaintCopy];
{$ENDIF}
SaveIndex := SaveDC(DC);
try
SetViewportOrgEx(DC, Left + X, Top + Y, nil);
IntersectClipRect(DC, 0, 0, Width, Height);
Perform(WM_PAINT, DC, 0);
finally
RestoreDC(DC, SaveIndex);
{$IFDEF WIN32}
ControlState := ControlState - [csPaintCopy];
{$ENDIF}
end;
end;
end;
end;
end;
{$IFDEF WIN32}
finally
with Control.Parent do
ControlState := ControlState - [csPaintCopy];
end;
{$ENDIF}
end; |
| Этот пользователь сказал Спасибо dr. F.I.N. за это полезное сообщение: | ||
max_torent (10.11.2012)
| ||
|
#8
|
|||
|
|||
|
TParentControl - что за класс и в каком модуле описан?
|
|
#9
|
||||
|
||||
|
max_torent, странный тип, первый раз о нем слышу
|
|
#10
|
|||
|
|||
|
Присутствует в коде выше... я уже понял что это наследник TWinControl
|
|
#11
|
|||
|
|||
|
dr. F.I.N. Спасибо!
|
|
#12
|
|||
|
|||
|
poli-smen - СПАСИБО! Получилось сделать так как Вы написали. С помощью ControlStyle... Все оказалось очень просто)
|
|
#13
|
||||
|
||||
|
К сожалению нет перед глазами исходников, но по-моему ты прав:
type TParentControl = TWinControl; |