2011-10-13 68 views
3

我想創建透明的子窗口。如何創建兒童分層透明窗口?

procedure TForm1.BtnGoClick(Sender: TObject); 
var 
    bmp:TBitmap; 
    BitmapPos: TPoint; 
    BitmapSize: TSIZE; 
    BlendFunction: _BLENDFUNCTION; 
    exStyle: Cardinal; 
begin 
    bmp := TBitmap.Create; 
    bmp.LoadFromFile('my32bitbitmap.bmp'); 
    exStyle := GetWindowLongA(Form2.Handle, GWL_EXSTYLE); 
    if (exStyle and WS_EX_LAYERED = 0) then 
    SetWindowLong(Form2.Handle, GWL_EXSTYLE, exStyle or WS_EX_LAYERED); 
    BitmapPos := Point(0, 0); 
    BitmapSize.cx := bmp.Width; 
    BitmapSize.cy := bmp.Height; 
    BlendFunction.BlendOp := AC_SRC_OVER; 
    BlendFunction.BlendFlags := 0; 
    BlendFunction.SourceConstantAlpha := 200; 
    BlendFunction.AlphaFormat := AC_SRC_ALPHA; 
    UpdateLayeredWindow(Form2.Handle, 0, nil, @BitmapSize, bmp.Canvas.Handle, @BitmapPos, 0, @BlendFunction, ULW_ALPHA); 

    Windows.SetParent(Form2.Handle, Form1.Handle); 
    bmp.Free;  
end; 

它幾乎可以工作:Form2在Form1內變成很好的透明窗口。但它看起來像Form2不會與Form1一起移動。當我移動Form1時,Form2-Window會移動,但在屏幕上我會看到它。當Form1被移動時,我不能點擊Form2,點擊通過,所以我知道窗口被移動了。

所以問題是如何讓孩子透明窗口沒有這些功能? (只是普通的窗口隨它移動)

+0

Delphi窗體有一個你可以設置的'AlphaBlendValue'屬性。這將使表格透明。爲什麼要使用API​​調用,請參閱:http://docwiki.embarcadero.com/VCL/XE2/en/Forms.TForm.AlphaBlendValue – Johan

+0

@Johan:屬性AlphaBlendValue只能讓我的窗口不斷透明。對我來說不夠... – Astronavigator

+0

您能否添加您在移動Form1時看到的內容的截圖?我不完全明白你會得到什麼樣的行爲。 Form2是否以Form1爲準?當你移動Form1時,它是否可以渲染,但是敵人Form2會保持原來的位置,或者你看到一個「蹤跡」,或者......? –

回答

1

您需要在每次移動或調整Form2大小後調用UpdateLayeredWindow。或者你可以用TCustomTransparentControl後代代替它。

+0

不起作用。你可以發表一個例子嗎? – Astronavigator

+0

你究竟試過了什麼? TCustomTransparentControl或UpdateLayeredWindow? – Torbins

+0

試過UpdateLayeredWindow。有沒有任何例子如何使用TCustomTransparentControl和UpdateLayeredWindow的子窗口?您是否嘗試過這些兒童窗戶解決方案? – Astronavigator