MFC實現父窗口不透明,子窗口半透明效果

OnEraseBkgnd(CDC* pDC)
{
 
// TODO: 在此添加消息處理程序代碼和/或調用默認值
//繪製子窗口的背景,用主窗口的背景填充,實現透明效果
    CRect clientRect;
    CDC dcEraseBkgnd;
    GetClientRect(&clientRect);
    int cx = clientRect.Width();
    int cy = clientRect.Height();
// First we should save our DC.
    CBitmap bitmap;
    if(m_dcEraseBkgnd.GetSafeHdc())// Delete our original DC.
    m_dcEraseBkgnd.DeleteDC();
         
    m_dcEraseBkgnd.CreateCompatibleDC(pDC);
    bitmap.CreateCompatibleBitmap(pDC,cx,cy);
    m_dcEraseBkgnd.SelectObject(&bitmap);
 
    m_dcEraseBkgnd.BitBlt(0,0,cx,cy,pDC,0,0,SRCCOPY);
//繪製一個半透明的矩形
    CDC memdc;
    CBitmap bmp,*pOldBitmap;
    memdc.CreateCompatibleDC(pDC);
    bmp.CreateCompatibleBitmap(pDC,320,110); //該函數創建與指定的設備環境相關的設備兼容的位圖。
//nWidth:指定位圖的寬度,單位爲像素。 nHeight:指定位圖的高度,單位爲像素。
    pOldBitmap = memdc.SelectObject(&bmp); //選擇一對象到指定的設備上下文環境中
    CBrush brush,brushOut;
    brush.CreateSolidBrush(RGB(230,230,230));
    memdc.SelectObject(brush);
    memdc.FillSolidRect(0,0,320,110,RGB(230,230,230)); //.用指定的固體色填充矩形。x,y座標。cx,cy寬高
    BLENDFUNCTION bf;
    bf.BlendOp = AC_SRC_OVER;
    bf.BlendFlags = 0;
    bf.SourceConstantAlpha = 0xAf; //半透明(0-ff,透明度從全透明到不透明)
    bf.AlphaFormat = 0;
    pDC->AlphaBlend(0,0,320,110,&memdc,0,0,320,110,bf);  //0,0表示在對話框顯示的座標
    memdc.SelectObject(pOldBitmap);
}

描述: 根據MSDN所述,子窗口的半透屬性是跟隨父窗口的。也就是說在子窗口中用SetLayeredWindowAttributes方法完成透明是不可行的。 如果子窗口設置成overlap或者popup格式,雖然可用SetLayeredWindowAttributes實現半透,但是該窗口跟主窗口的關係往往無法或者比較麻煩去實現,比如跟隨主窗口移動、顯示/隱藏等。因此,本人想到一個比較簡單的方法來實現子窗口的半透明效果。 重載子窗口的OnEraseBkgnd消息,在該函數裏先實現全透明效果。也就是抓取主窗口在子窗口下的背景圖,然後貼到子窗口的背景上。然後在子窗口畫一個半透明效果的矩形,即實現了半透明效果的子窗口。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章