首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WM_NCHITTEST在WS_EX_LAYERED表单中不起作用

WM_NCHITTEST在WS_EX_LAYERED表单中不起作用
EN

Stack Overflow用户
提问于 2012-04-18 07:51:44
回答 1查看 918关注 0票数 5

我正在使用本文的http://melander.dk/articles/alphasplash/代码在表单中显示32位位图,但是当我尝试使用纯色位图而不是图像时,系统不会收到WM_NCHITTEST消息,并且无法移动表单。如果我使用32位图图像,代码就能正常工作。我错过了什么?

这是代码

代码语言:javascript
复制
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,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, 0, nil, @BitmapSize, Bitmap.Canvas.Handle,
      @BitmapPos, 0, @BlendFunction, ULW_ALPHA);
    Show;
  finally
    Bitmap.Free;
  end;
end;

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

end.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-18 09:36:31

尝试使用:

代码语言:javascript
复制
BlendFunction.SourceConstantAlpha := 150; // 255 is fully opaque.
BlendFunction.AlphaFormat := 0;

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

我真的猜不出与'WM_NC_HITTEST‘的关系,但错误的输入会产生错误的结果:)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10200829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档