У меня есть изображение, которое нарисовано на paintbox, я хочу, чтобы иметь возможность показывать полупрозрачный заполненный прямоугольник над любой областью поля для рисования, который будет показывать нижний холст для рисования в более темном цвете, вроде как поле выбора из Проводник Виндоус.Как определить цвет при использовании AlphaBlend?
После долгих проб и ошибок (и некоторые чтения), мне удалось сделать следующее:
procedure OpacityRectangle(ACanvas: TCanvas; ARect: TRect; AColor: TColor;
AOpacity: Integer);
var
BlendFunc: BLENDFUNCTION;
W, H: Integer;
Bitmap: TBitmap;
begin
W := ARect.Width;
H := ARect.Height;
BlendFunc.BlendOp := AC_SRC_OVER;
BlendFunc.BlendFlags := 0;
BlendFunc.SourceConstantAlpha := AOpacity;
BlendFunc.AlphaFormat := 0;
Bitmap := TBitmap.Create;
try
Bitmap.PixelFormat := pf32Bit;
Bitmap.SetSize(W, H);
BitBlt(Bitmap.Canvas.Handle, ARect.Left + W, ARect.Top + H, W, H,
ACanvas.Handle, 0, 0, SRCCOPY);
AlphaBlend(ACanvas.Handle, ARect.Left, ARect.Top,
W, H, Bitmap.Canvas.Handle, 0, 0, W, H, BlendFunc);
finally
Bitmap.Free;
end;
end;
Как вы можете увидеть параметр AColor
не используется, поскольку я не уверен в точности того, как я бы реализовать выше. В настоящее время цвет альфа-смешанного прямоугольника - это оттенок серого (по умолчанию используется цвет по умолчанию), мне нужно знать, как я могу изменить цвет оттенка альфа-смешанного прямоугольника.
Как я могу изменить приведенное выше, чтобы разрешить выбор пользовательского цвета для тонированного прямоугольника с альфа-смешением?
Спасибо за ваше объяснение и ответ, к сожалению, я не понял, что я оставил тег «Lazarus» вне вопроса (не ваша ошибка). В Lazarus это, похоже, не работает с использованием 'JwaWindows.AlphaBlend()', и сейчас я не могу тестировать Delphi, это, вероятно, проблема с Lazarus, но мне нужно будет экспериментировать еще немного. – Craig
@Craig - проверено. Проблема заключается в том, что fpc-графика не использует цвет кисти при изменении размера растрового изображения. Сначала задайте размер, затем установите цвет кисти, затем вставьте bitmap.canvas.fillrect с прямоугольником (0, 0, W, H). Тогда это работает. –
Теперь, отлично работая благодаря Sertac, спасибо за разъяснение некоторых вещей, например, почему я понял, что альфа-цвет по умолчанию был серым, и почему мне даже не нужно было использовать BitBlt. – Craig