Tôi đang sử dụng mã của bài viết này http://melander.dk/articles/alphasplash/ để hiển thị bitmap 32 bit trong biểu mẫu, nhưng khi tôi cố gắng sử dụng bitmap màu thay vì hình ảnh thì không nhận được tin nhắn WM_NCHITTEST tôi không thể di chuyển biểu mẫu. Nếu tôi sử dụng 32 bitmap hình ảnh mã hoạt động tốt. Những gì tôi đang thiếu ở đây?WM_NCHITTEST không hoạt động ở dạng WS_EX_LAYERED
Đây là mã
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.
+1, không hiểu ý nghĩa của nó, nhưng tôi chắc chắn bạn biết :-) Tôi chỉ đang thực hiện vấn đề này bằng trực giác của tôi. – TLama
Cảm ơn rất nhiều. – Salvador
@TLama - Đừng quá chắc chắn! Tôi đã bình chọn cho câu trả lời của bạn vì tôi cũng nghĩ như vậy cho bạn. Thực sự, tôi không phải là chuyên gia, nhưng nó được ghi rõ trong 'BLENDFUNCTION'. Quan điểm của tôi là, câu trả lời của bạn cũng đúng. Vấn đề duy nhất với nó là nó tạo ra một hình ảnh với các giá trị alpha tùy ý, nhưng trong một bitmap một màu không có vấn đề gì .. –