天天看點

設定視窗背景透明 .

建立一個MFC Wizard項目,基于對話框。

我們來看看下面這段代碼:

SetWindowLong(GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(GetSafeHwnd(),GWL_EXSTYLE)^0x80000);  

//加載dll   

HINSTANCE hInst=LoadLibrary("User32.dll");  

if(hInst)  

{  

    typedef BOOL (WINAPI *Fun)(HWND,COLORREF,BYTE,DWORD);  

    Fun fun=NULL;  

    //找到dll中的SetLayeredWindowAttributes函數首位址   

    fun=(Fun)GetProcAddress(hInst,"SetLayeredWindowAttributes");  

    if(fun)  

    {  

         //調用SetLayeredWindowAttributes函數   

         fun(this->GetSafeHwnd(),0,200,2);  

    }  

    //釋放dll   

    FreeLibrary(hInst);  

}  

SetWindowLong(GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(GetSafeHwnd(),GWL_EXSTYLE)^0x80000);

//加載dll

HINSTANCE hInst=LoadLibrary("User32.dll");

if(hInst)

{

typedef BOOL (WINAPI *Fun)(HWND,COLORREF,BYTE,DWORD);

Fun fun=NULL;

//找到dll中的SetLayeredWindowAttributes函數首位址

fun=(Fun)GetProcAddress(hInst,"SetLayeredWindowAttributes");

if(fun)

//調用SetLayeredWindowAttributes函數

fun(this->GetSafeHwnd(),0,200,2);

}

//釋放dll

FreeLibrary(hInst);

把上面的這段代碼放在需要更改對話框背景透明度的地方,例如響應OK按鈕函數OnOK裡面或者OnInitDialog函數裡。

然後點選試試什麼效果:

設定視窗背景透明 .

SetLayeredWindowAttributes函數用來設定視窗透明度,看看解析:

<a href="http://baike.baidu.com/view/1329156.htm?fr=ala0_1">http://baike.baidu.com/view/1329156.htm?fr=ala0_1</a>

Public Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long

  hWnd是透明窗體的句柄,

  crKey為掩碼的顔色,可以用RGB(r,g,b)來指定。

  bAlpha是不透明度,取值範圍是(0,255),其中0代表全透明,255代表不透明。

  dwFlags是透明方式,可以取兩個值:

  當取值為LWA_ALPHA時,crKey參數無效,bAlpha參數有效;

  當取值為LWA_COLORKEY時,窗體中的所有顔色為crKey的地方将變為透明,bAlpha參數無效。

  LWA_ALPHA = 0x2

  LWA_COLORKEY=0x1

  也可以取兩個值的組合:LWA_ALPHA Or LWA_COLORKEY。這樣crKey的地方将變為全透明,而其它地方根據bAlpha參數确定透明度。

  要使使窗體擁有透明效果,首先要有WS_EX_LAYERED擴充屬性,方法:

      Dim rtn As Long

  rtn = GetWindowLong(Me.hWnd, -20)

  rtn = rtn Or WS_EX_LAYERED

  SetWindowLong (Me.hWnd, -20, rtn)

  (舊的sdk沒有定義WS_EX_LAYERED,是以可以直接指定為&amp;H80000).

  WS_EX_LAYERED = &amp;H80000

繼續閱讀