SetLayeredWindowAttributes 創建不規則窗口(此處爲橢圓)

創建一個基於Dialog的工程(MFC)

 

在 BOOL CDialogXXXApp::InitInstance()中添加以下代碼

SetDialogBkColor(RGB(100, 100, 228), RGB(225, 100, 100));

 

//將下面店面放在初始化函數中

在 BOOL CDialogXXXDlg::OnInitDialog()中添加以下代碼

 

//設置類型,添加WS_EX_LAYERED 早起版本沒有這個需要直接設定爲 0x80000

SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,  

GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);  

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

if(hInst)    

{    

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

    DFUNC   Func   =   NULL;  

 

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

    if(fun)fun(this->GetSafeHwnd(),RGB(100, 100, 228)/*要透明的顏色*/,255/*0-255 0:透明*/,2 | 1);    

    FreeLibrary(hInst);    

}  

 

 

在 void CDialogXXXDlg::OnPaint() 中添加以下代碼

 

if (IsIconic())

{

}

else {

    CClientDC  *pDC = new CClientDC(this);

    CRect rectClient;

    GetClientRect(rectClient); //GetDlgItem(IDC_BUTTON5)->

 

    CBrush bsh;

    bsh.CreateSolidBrush(RGB(122, 122, 255));

 

    CBrush* pOldbsh = pDC->SelectObject(&bsh);

    pDC->Ellipse(rectClient);//只要是背景色不是RGB(100, 100, 228)的區域都可以顯示出來,

   //這樣就可以對要顯示的區域設置不同的顏色來顯示。

    pDC->SelectObject(pOldbsh);

 

    pOldPen = pDC->SelectObject(&penBlue);

 

}

 

 

*以下是說明

BOOL SetLayeredWindowAttributes(
  HWND hwnd,           // handle to the layered window
  COLORREF crKey,      // specifies the color key
  BYTE bAlpha,         // value for the blend function
  DWORD dwFlags        // action
);

 

      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參數確定透明度。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章