15,978
社区成员
发帖
与我相关
我的任务
分享
BOOL CSkinWndManager::OnDrawBack(HWND hwnd, HDC hSrcDC, CSkinRect rect, int nAlpha/* =255 */)
{
CSkinBase* pParentBase = (CSkinBase*)::GetProp(::GetParent(hwnd),PROP_WNDPROC);
if ( !pParentBase )
{
CSkinBase* pItemBase = (CSkinBase*)::GetProp(hwnd, PROP_WNDPROC);
if ( pItemBase && pItemBase->m_bIsWindow )
{
::SetBkColor(hSrcDC, ((CSkinWndSB*)pItemBase)->m_clrBackground);
::ExtTextOut(hSrcDC, 0, 0, ETO_OPAQUE, rect, NULL, 0, NULL);
return TRUE;
}
else
{
pItemBase = (CSkinBase*)::GetProp(::GetParent(::GetParent(hwnd)), PROP_WNDPROC);
if ( pItemBase && pItemBase->m_bIsWindow )
{
::SetBkColor(hSrcDC, ((CSkinWndSB*)pItemBase)->m_clrBackground);
::ExtTextOut(hSrcDC, 0, 0, ETO_OPAQUE, rect, NULL, 0, NULL);
return TRUE;
}
}
::SetBkColor(hSrcDC, ::GetSysColor(COLOR_3DFACE));
::ExtTextOut(hSrcDC, 0, 0, ETO_OPAQUE, rect, NULL, 0, NULL);
return FALSE;
}
if ( !pParentBase->m_bIsWindow )
{
CSkinBase* pParentParentBase = (CSkinBase*)::GetProp(::GetParent(::GetParent(hwnd)), PROP_WNDPROC);
if ( pParentParentBase && pParentParentBase->m_bIsWindow )
{
CSkinWndSB* pParentSB = (CSkinWndSB*)pParentParentBase;
CSkinPoint point(rect.TopLeft());
::ClientToScreen(hwnd,&point);
::ScreenToClient(pParentSB->m_hWnd,&point);
//绘制背景色
::SetBkColor(hSrcDC, pParentSB->m_clrBackground);
::ExtTextOut(hSrcDC, 0, 0, ETO_OPAQUE, rect, NULL, 0, NULL);
//绘制背景图片
if ( !pParentSB->m_bitmapCompatible )
{
return TRUE;
}
HDC dctmp;
dctmp = ::CreateCompatibleDC(hSrcDC);
HBITMAP hOldBitmap = (HBITMAP)::SelectObject(dctmp,pParentSB->m_bitmapCompatible);
if ( nAlpha == 255 )
{
::BitBlt(hSrcDC,rect.left,rect.top,rect.Width(),rect.Height(),dctmp,point.x,point.y,SRCCOPY);
}
else
{
BLENDFUNCTION blendFunction;
blendFunction.BlendOp = AC_SRC_OVER;
blendFunction.BlendFlags = NULL;
blendFunction.AlphaFormat = AC_SRC_ALPHA;
blendFunction.SourceConstantAlpha = nAlpha;
::AlphaBlend(hSrcDC, rect.left, rect.top, rect.Width(), rect.Height(), dctmp, point.x, point.y, rect.Width(), rect.Height(), blendFunction);
}
::SelectObject(dctmp,hOldBitmap);
::DeleteDC(dctmp);
::DeleteObject(hOldBitmap);
}
else
{
::SetBkColor(hSrcDC, m_clrComBackground);
::ExtTextOut(hSrcDC, 0, 0, ETO_OPAQUE, rect, NULL, 0, NULL);
}
return TRUE;
}
CSkinWndSB* pParentSB = (CSkinWndSB*)pParentBase;
CSkinPoint point(rect.TopLeft());
::ClientToScreen(hwnd,&point);
::ScreenToClient(pParentSB->m_hWnd,&point);
//绘制背景色
::SetBkColor(hSrcDC, pParentSB->m_clrBackground);
::ExtTextOut(hSrcDC, 0, 0, ETO_OPAQUE, rect, NULL, 0, NULL);
//绘制背景图片
if ( !pParentSB->m_bitmapCompatible )
{
// ::SelectObject(hSrcDC, pParentSB->m_hBackgroundBrush);
// ::PatBlt(hSrcDC, 0, 0, rect.Width(), rect.Height(), PATCOPY);
return FALSE;
}
HDC dctmp;
dctmp = ::CreateCompatibleDC(hSrcDC);
HBITMAP hOldBitmap = (HBITMAP)::SelectObject(dctmp,pParentSB->m_bitmapCompatible);
if ( nAlpha == 255 )
{
::BitBlt(hSrcDC,rect.left,rect.top,rect.Width(),rect.Height(),dctmp,point.x,point.y,SRCCOPY);
}
else if ( nAlpha >= 0 )
{
BLENDFUNCTION blendFunction;
blendFunction.BlendOp = AC_SRC_OVER;
blendFunction.BlendFlags = NULL;
blendFunction.AlphaFormat = AC_SRC_OVER;
blendFunction.SourceConstantAlpha = nAlpha;
::AlphaBlend(hSrcDC, rect.left, rect.top, rect.Width(), rect.Height(), dctmp, point.x, point.y, rect.Width(), rect.Height(), blendFunction);
}
::SelectObject(dctmp,hOldBitmap);
::DeleteDC(dctmp);
::DeleteObject(hOldBitmap);
return TRUE;
}