窗体透明,控件透明问题
父窗口上贴了PNG图,需要crate几个窗口在父窗口上,请问如何实现窗体透明,控件透明,效果是:create出的对话框看上去像是在父窗口中,能看到背景上的东东!
[解决办法]
popup窗口可以实现
[解决办法]
popup可以通过分层实现透明,甚至可以使用Aero。当然,如果非要child的话可以把子对话所占父对话区域的图像弄下来贴到子对话背景里
[解决办法]
ModifyStyleEx(0, WS_EX_LAYERED);
HINSTANCE hInst = LoadLibrary("User32.DLL");
if(hInst)
{
typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);
MYFUNC fun = NULL;
//取得SetLayeredWindowAttributes()函数指针
fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
if(fun)fun(this->GetSafeHwnd(),0,220,2);
FreeLibrary(hInst);
}
[解决办法]
[解决办法]
1:在绘制父窗口的时候,把父窗口的背景用个位图存起来;
2:在绘制子窗口的时候,父窗口保存的背景位图的子窗口在父窗口的区域位置会知道子窗口中。
这样子实现了看起来,透明。
SKINSE界面库内部都是这样子处理的,有兴趣的朋友可以去下载来看看:http://www.skinse.com
这里我给出绘制的相关代码,代码:
- C/C++ code
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;}