윈도우 알바 블렌드 API 호출을 사용하여 두 개의 캔버스를 함께 사용하려고합니다. 먼저 주 캔버스 (대상)에 그림을 그린 다음 TBitmap을 사용하여 다른 캔버스를 인스턴스화하고 그 위에 그림을 그린 다음 두 그림을 혼합합니다 (여기에 대한 답변을 따라).AlphaBlend가 항상 false를 반환하는 이유는 무엇입니까 (캔버스에서 그리기)?
그러나 나는 항상 false를 반환한다는 것을 알았습니다. 처음에는 소스와 대상에 대해 잘못된 핸들을 전달하는 것과 관련이 있다고 생각했지만 실제로는 알 수 없습니다. 뭐가 될수 있었는지?
unit MainWnd;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, ControlsEx;
type
{------------------------------------------------------------------------------}
TfrmMain = class(TForm)
PaintBox1: TPaintBox;
procedure PaintBox1Paint(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmMain: TfrmMain;
implementation
{$R *.dfm}
{..............................................................................}
procedure alphaBlendf(
const in_target : TCanvas;
const in_transperancy : integer;
const in_color : TColor;
const in_rect : TRect;
const in_width : integer;
const in_height : integer);
var
w : integer;
h : integer;
bitmap : TBitmap;
blendFn : BLENDFUNCTION;
ret : boolean;
begin
blendFn.BlendOp := AC_SRC_OVER;
blendFn.SourceConstantAlpha := 80;
try
w := in_rect.Right - in_rect.Left - 1;
h := in_rect.Bottom - in_rect.Top - 1;
bitmap := TBitmap.Create;
bitmap.PixelFormat := pf32bit;
bitmap.Width := w;
bitmap.Height := h;
bitmap.Canvas.Brush.Color := in_color;
bitmap.Canvas.Rectangle(in_rect);
ret := Windows.AlphaBlend(
in_target.Handle,
0,
0,
in_width,
in_height,
bitmap.Canvas.Handle,
0,
0,
in_width,
in_height,
blendFn);
if ret then in_target.TextOut(0, 0, 'ok')
else in_target.TextOut(0, 0, 'fail');
finally
bitmap.Free;
end;
end;
{..............................................................................}
procedure TfrmMain.PaintBox1Paint(Sender: TObject);
var
r: TRect;
begin
PaintBox1.Canvas.Brush.Color := $FCFFB5;
PaintBox1.Canvas.FillRect(r);
r := Rect(0, 0, 100, 100);
alphaBlendf(PaintBox1.Canvas, 0, clLime, r, PaintBox1.ClientWidth, PaintBox1.ClientHeight);
end;
end.
나에게서 붙여 넣는 코드가 엉성한 코드 * *; 완벽하게 작동합니다, 감사합니다! – wmercer
여러분을 환영합니다! –