- 0
Нарисовать на канве ID2D1RenderTarget (ID2D1Bitmap)
-
Похожий контент
-
- 18 ответов
- 1 257 просмотров
-
- 7 ответов
- 1 495 просмотров
-
- 1 ответ
- 1 493 просмотра
-
- 3 ответа
- 1 830 просмотров
-
- 3 ответа
- 1 958 просмотров
-
- 1 ответ
- 2 268 просмотров
-
- 4 ответа
- 2 926 просмотров
-
- 4 ответа
- 4 550 просмотров
-
- 2 ответа
- 2 694 просмотра
-
- 3 ответа
- 4 342 просмотра
-
-
Последние посетители 0 пользователей онлайн
- Ни одного зарегистрированного пользователя не просматривает данную страницу
Вопрос
Zyablik3000
Здравствуйте!
Есть самописный компонент - индикатор загрузки написанныый под VCL с использованием Direct2D.
TD2DProgressBar = class(TCustomControl)
FRenderTarget: ID2D1RenderTarget; FD2DFactory.CreateWicBitmapRenderTarget(FWicBitmap, RenderTargetProp, FRenderTarget); FInteropTarget := FRenderTarget as ID2D1GdiInteropRenderTarget;
Вся отрисовка происходит на FRenderTarget.
Затем беру
FInteropTarget.GetDC(D2D1_DC_INITIALIZE_MODE_COPY, FRenderDC);
и вывожу на поверхность функцией
procedure TD2DProgressBar.UpdateWindow(sourceDC : HDC); var info : TUpdateLayeredWindowInfo; begin ZeroMemory(@info, sizeof(info)); with info do begin cbSize := sizeof(TUpdateLayeredWindowInfo); pptSrc := @FSourcePosition; pptDst := @FWindowPosition; psize := @FWndSize; pblend := @FBlend; dwFlags := ULW_ALPHA; end; info.hdcSrc := SourceDC; if not UpdateLayeredWindowIndirect(handle, @info) then begin RaiseLastOSError(); end end;
Но это только под VCL.
В Firemonkey не нашел способа комбинировать градиенты и/или нарисовать арку градиентом (саму линию арки а не залить сектор) или комбинацией градиентов.
Как вывести этот FRenderTarget на канву Firemonkey-контрола?
Самая большая проблема в том, что компонент полупрозрачный, и вариант с переливом через Vcl.Graphics.TBitmap и MemoryStream не дает нужного результата.
MS:=TMemoryStream.Create; Blend.BlendOp := AC_SRC_OVER; Blend.BlendFlags := 0; Blend.AlphaFormat := AC_SRC_NO_PREMULT_ALPHA; Blend.SourceConstantAlpha:= 255; // // Уровень прозрачности Res:=Winapi.Windows.AlphaBlend(VCLBitmap.Canvas.Handle, 0, 0, VCLBitmap.Width, VCLBitmap.Height, FRenderDC, 0, 0, VCLBitmap.Width, VCLBitmap.Height, Blend); {или эта функция StretchBlt(bm.Canvas.Handle, 0, 0, VCLBitmap.Width, VCLBitmap.Height, FRenderDC, 0, 0, VCLBitmap.Width, VCLBitmap.Height, SRCCOPY); } VCLBitmap.SaveToStream(MS); FFMXBitmap.SetSize(TSize.Create(VCLBitmap.Width, VCLBitmap.Height)); FFMXBitmap.LoadFromStream(MS); FreeAndNil(MS);
В Blend пробовал разные комбинации BlendOp и AlphaFormat.
Хелп плизз!
Во вложении компонент под VCL. ( Может кому пригодится)) )
D2DProgressbar.zip
Ссылка на комментарий
1 ответ на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.