建立了一个对话框,属性设置为没有边框,上面放了一个静态文本,然后对对话框调用 onctrlcolor()
HBRUSH CUiuiDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
pDC->SetBkMode(TRANSPARENT); // TODO: Return a different brush if the default is not desired
return (HBRUSH)GetStockObject(NULL_BRUSH);}窗体运行后是透明的(在窗体范围内可以看到桌面),但是当拖动窗体的时候,窗体不会更新,还是保留着一开始显示的那些东西,也就是一开始它所在位置的桌面的图画,请问如何可以使拖动的时候仍然可以保持透明?
还有一点不懂,在窗体的属性设置为透明和用onctrlcolor()函数设置有什么不同?
HBRUSH CUiuiDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
pDC->SetBkMode(TRANSPARENT); // TODO: Return a different brush if the default is not desired
return (HBRUSH)GetStockObject(NULL_BRUSH);}窗体运行后是透明的(在窗体范围内可以看到桌面),但是当拖动窗体的时候,窗体不会更新,还是保留着一开始显示的那些东西,也就是一开始它所在位置的桌面的图画,请问如何可以使拖动的时候仍然可以保持透明?
还有一点不懂,在窗体的属性设置为透明和用onctrlcolor()函数设置有什么不同?
你查一下该函数的用法就知道。
SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE, GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
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,128,2);
FreeLibrary(hInst);
}
你可以看看,我也是从网上找的,放在mainfrm的oncreate里可以,但我不知道为什么放在view里就不可以了。你试试看。
通常,如果希望对话栏带区显示为透明的,则为对话栏对象设置 WM_EX_TRANSPARENT 扩展样式。但是,由于 WM_EX_TRANSPARENT 在正确绘制对话栏背景方面存在一些问题,您将需要做一点额外的工作来实现所需的效果。
以下过程详细描述了实现透明但不使用 WM_EX_TRANSPARENT 扩展样式所需的步骤。
在 Rebar 带区中实现透明对话栏
使用“添加类”对话框,添加实现对话栏对象的新类(例如,CMyDlgBar)。
添加 WM_ERASEBKGND 消息的处理程序。
在新处理程序中,修改现有代码以匹配下例:
BOOL CMyDlgBar::OnEraseBkgnd( CDC* pDC )
{
CWnd* pParent = GetParent();
ASSERT_VALID(pParent);
CPoint pt(0, 0);
MapWindowPoints(pParent, &pt, 1);
pt = pDC->OffsetWindowOrg(pt.x, pt.y);
LRESULT lResult = pParent->SendMessage(WM_ERASEBKGND,
(WPARAM)pDC->m_hDC, 0L);
pDC->SetWindowOrg(pt.x, pt.y);
return lResult;
}
添加 WM_MOVE 消息的处理程序。
在新处理程序中,修改现有代码以匹配下例:
BOOL CMyDlgBar::OnMove( int cx, int cy )
{
Invalidate();
}
#define WS_CLIPSIBLINGS 0x04000000L
#define WS_CLIPCHILDREN 0x02000000L