2012-04-17 12 views
5

मैं इस आलेख के कोड का उपयोग कर रहा हूं http://melander.dk/articles/alphasplash/ किसी फ़ॉर्म में 32 बिट बिटमैप प्रदर्शित करने के लिए, लेकिन जब मैं किसी छवि के बजाय ठोस रंग बिटमैप का उपयोग करने का प्रयास करता हूं तो WM_NCHITTEST संदेश प्राप्त नहीं होता है और मैं फॉर्म नहीं ले जा सकता। अगर मैं 32 बिटमैप छवि का उपयोग करता हूं तो कोड ठीक काम करता है। मैं यहाँ क्या याद कर रहा हूँ?WM_NCHITTEST WS_EX_LAYERED रूप में काम नहीं कर रहा है

इस कोड है

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. 

उत्तर

5

साथ प्रयास करें:

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

क्योंकि आपके बिटमैप डेटा कोई स्रोत अल्फा है। T12itmap के लिए AlphaFormat डिफ़ॉल्ट रूप से afIgnored है। 'AC_SRC_ALPHA' का उपयोग केवल अल्फा के साथ रंगीन मूल्य वाले रंग मान वाले चित्रों के साथ किया जाता है। डिस्क से लोड होने वाली छवियों में शायद उचित अल्फा चैनल है।

मैं वास्तव में अनुमान नहीं लगा सकता कि 'WM_NC_HITTEST' के साथ संबंध क्या है लेकिन गलत इनपुट गलत परिणाम उत्पन्न करता है :)।

+0

+1, इसका अर्थ क्या न हो, लेकिन मुझे यकीन है कि आप जानते हैं :-) मैं बस अपनी अंतर्ज्ञान से यह समस्या उठा रहा था। – TLama

+0

बहुत बहुत धन्यवाद। – Salvador

+1

@TLama - इतना सुनिश्चित न हो! मैंने आपके उत्तर के लिए वोट दिया क्योंकि मैंने आपके लिए यही सोचा था। वास्तव में, मैं एक विशेषज्ञ नहीं हूं, लेकिन यह स्पष्ट रूप से 'ब्लेंडफंक्शन' में प्रलेखित है। मेरा विचार यह है कि, आपका जवाब भी सही था। इसके साथ एकमात्र समस्या यह थी कि उसने मनमाने ढंग से अल्फा मूल्यों वाली एक छवि बनाई, लेकिन एक-रंग बिटमैप में कोई समस्या नहीं है .. –

संबंधित मुद्दे