|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
canvas Parenta без учета canvas компонента
Добрый день. Пишу свой компонент.
создаю рисунки на 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). Только освобождать не забывай.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#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; Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |
Этот пользователь сказал Спасибо 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; Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |