加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – WM_NCHITTEST无法以WS_EX_LAYERED形式工作

发布时间:2020-12-15 09:28:10 所属栏目:大数据 来源:网络整理
导读:我正在使用本文 http://melander.dk/articles/alphasplash/的代码在表单中显示32位位图,但是当我尝试使用纯色位图而不是图像时,未收到WM_NCHITTEST消息,我无法移动表单.如果我使用32位图图像代码工作正常.我在这里缺少什么? 这是代码 uses Winapi.Windows,W
我正在使用本文 http://melander.dk/articles/alphasplash/的代码在表单中显示32位位图,但是当我尝试使用纯色位图而不是图像时,未收到WM_NCHITTEST消息,我无法移动表单.如果我使用32位图图像代码工作正常.我在这里缺少什么?

这是代码

uses
  Winapi.Windows,Winapi.Messages,System.SysUtils,System.Variants,System.Classes,Vcl.Graphics,Vcl.Controls,Vcl.Forms,Vcl.Dialogs,Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  protected
    { Private declarations }
    procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
  public
    { Public declarations }
  end;

var
  Form1 : TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  BlendFunction: TBlendFunction;
  BitmapPos: TPoint;
  BitmapSize: TSize;
  exStyle: DWORD;
  Bitmap: TBitmap;
begin
  // Enable window layering
  exStyle := GetWindowLongA(Handle,GWL_EXSTYLE);
  if (exStyle and WS_EX_LAYERED = 0) then
    SetWindowLong(Handle,GWL_EXSTYLE,exStyle or WS_EX_LAYERED);

  Bitmap := TBitmap.Create;
  try
   //Bitmap.LoadFromFile('splash.bmp'); //if I use a image the code works fine

    Bitmap.PixelFormat := pf32bit;
    Bitmap.SetSize(Width,Height);    
    Bitmap.Canvas.Brush.Color:=clRed;
    Bitmap.Canvas.FillRect(Rect(0,Bitmap.Width,Bitmap.Height));

    // Position bitmap on form
    BitmapPos := Point(0,0);
    BitmapSize.cx := Bitmap.Width;
    BitmapSize.cy := Bitmap.Height;


    // Setup alpha blending parameters
    BlendFunction.BlendOp := AC_SRC_OVER;
    BlendFunction.BlendFlags := 0;
    BlendFunction.SourceConstantAlpha := 255;
    BlendFunction.AlphaFormat := AC_SRC_ALPHA;

    UpdateLayeredWindow(Handle,nil,@BitmapSize,Bitmap.Canvas.Handle,@BitmapPos,@BlendFunction,ULW_ALPHA);
    Show;
  finally
    Bitmap.Free;
  end;
end;

procedure TForm1.WMNCHitTest(var Message: TWMNCHitTest);
begin
  Message.Result := HTCAPTION;
end;

end.

解决方法

试试:

BlendFunction.SourceConstantAlpha := 150; // 255 is fully opaque.
BlendFunction.AlphaFormat := 0;

因为您的位图数据没有源alpha.默认情况下,TBitmap的AlphaFormat是afIgnored. ‘AC_SRC_ALPHA’仅用于具有与alpha预乘的颜色值的图像.您从磁盘加载的图像可能具有正确的Alpha通道.

我无法猜测与’WM_NC_HITTEST’的关系是什么,但错误的输入会产生错误的结果:).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读