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消息,在該函數裏先實現全透明效果。也就是抓取主窗口在子窗口下的背景圖,然後貼到子窗口的背景上。然後在子窗口畫一個半透明效果的矩形,即實現了半透明效果的子窗口。