OnT*_*Fly 5 delphi winapi vcl alpha
根据MS KB条目,有一个怪癖,CreateIconIndirect其中识别HBITMAP已创建BITMAPV5HEADER传递给CreateDIBSection(和BGRA通道布局).
但是, 当由s 引用时TBitmap具有(PixelFormat = pf32bit) and (AlphaFormat = afDefined)(表现为其他目的的alpha混合)Handle的实例不被识别为用于创建图标或光标的有效alpha混合位图.
目前,我必须使用所描述的API调用(请参阅参考资料)创建TBitmap的完整副本,以使CreateIconIndirect接受位图处理为alpha混合.我该如何克服这种笨拙?
这是一个例子:
procedure TForm1.Button1Click(Sender: TObject);
const
crAlpha = TCursor(-25);
var
Bmp: TBitmap;
Px: PRGBQuad;
X, Y: Integer;
BmpMask: TBitmap;
II: TIconInfo;
AlphaCursor: HCURSOR;
begin
Bmp := TBitmap.Create;
Bmp.PixelFormat := pf32bit;
Bmp.Canvas.Brush.Color := clWhite;
Bmp.SetSize(32, 32);
Bmp.Canvas.Font.Style := [fsBold];
Bmp.Canvas.Font.Color := clRed;
Bmp.Canvas.TextOut(1, 10, 'alpha');
for Y := 0 to (Bmp.Height - 1) do
begin
Px := Bmp.ScanLine[Y];
for X := 0 to (Bmp.Width - 1) do begin
if DWORD(Px^) = DWORD(clWhite) then
Px.rgbReserved := $00
else
Px.rgbReserved := $FF;
Inc(Px);
end;
end;
BmpMask := TBitmap.Create;
BmpMask.SetSize(Bmp.Width, Bmp.Height);
II.fIcon := False;
II.xHotspot := 32;
II.yHotspot := 32;
II.hbmMask := BmpMask.Handle;
II.hbmColor := Bmp.Handle;
AlphaCursor := CreateIconIndirect(II);
Win32Check(AlphaCursor <> 0);
BmpMask.Free;
Bmp.AlphaFormat := afDefined; // AlphaBlend below, premultiply channels
Canvas.Draw(0, 0, Bmp); // test draw
Bmp.Free;
Screen.Cursors[crAlpha] := AlphaCursor;
Cursor := crAlpha;
end;
Run Code Online (Sandbox Code Playgroud)
(顶部'alpha'是测试绘图,另一个是光标)
| 归档时间: |
|
| 查看次数: |
1492 次 |
| 最近记录: |