2012-04-17 12 views
5

Korzystam z kodu tego artykułu http://melander.dk/articles/alphasplash/, aby wyświetlić 32-bitową bitmapę w formularzu, ale gdy próbuję użyć jednolicie kolorowej mapy bitowej zamiast obrazu, komunikat WM_NCHITTEST nie jest odbierany i Nie mogę przenieść formularza. Jeśli użyję 32 obrazów bitmapowych, kod działa dobrze. Czego tu mi brakuje?WM_NCHITTEST nie działa w wersji WS_EX_LAYERED

Jest to kod

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. 

Odpowiedz

5

Spróbuj z:

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

Ponieważ dane bitmapy nie ma źródła alfa. AlphaFormat dla TBitmap jest domyślnie afIgnored. "AC_SRC_ALPHA" jest używane tylko w przypadku obrazów o wartościach kolorów przedwzmacnianych z częstotliwością alfa. Obrazy ładowane z dysku mają prawdopodobnie prawidłowy kanał alfa.

Nie mogę naprawdę zgadnąć, jaka jest relacja z "WM_NC_HITTEST", ale błędne dane dają złe wyniki :).

+0

+1, nie rozumiem, co to oznacza, ale jestem pewien, że wiesz :-) Właśnie podjąłem ten problem przez moją intuicję. – TLama

+0

Dziękuję bardzo. – Salvador

+1

@TLama - Nie bądź taki pewien! Głosowałem za twoją odpowiedzią, ponieważ pomyślałem to samo dla ciebie. Naprawdę nie jestem ekspertem, ale jest to wyraźnie udokumentowane w "BLENDFUNCTION". Moim zdaniem jest to, że twoja odpowiedź była również poprawna. Jedyny problem polegał na tym, że tworzył obraz z dowolnymi wartościami alfa, ale w jednobarwnej bitmapie, która nie stanowi problemu ... –

Powiązane problemy