2012-04-17 23 views
5

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. 

Trả lời

5

Hãy thử với:

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

Bởi vì dữ liệu bitmap của bạn không có nguồn alpha. AlphaFormat cho TBitmap theo mặc định là afIgnored. 'AC_SRC_ALPHA' chỉ được sử dụng với các hình ảnh có giá trị màu được ưu tiên với alpha. Những hình ảnh bạn đang tải từ đĩa có thể có kênh alpha thích hợp.

Tôi thực sự không thể đoán mối quan hệ với 'WM_NC_HITTEST' là gì nhưng đầu vào sai sẽ mang lại kết quả sai :).

+0

+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

+0

Cảm ơn rất nhiều. – Salvador

+1

@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ì .. –

Các vấn đề liên quan