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参数确定透明度。

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