代码如下:
//消息响应
LRESULT CXXXDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
if (!::IsWindow(m_hWnd))
return CDialog::DefWindowProc(message,wParam,lParam);
if(message == WM_MOVE|| message == WM_NCPAINT||message == WM_NCACTIVATE||message == WM_NOTIFY)
{
CDC* pWinDC = GetWindowDC();
if(pWinDC)
{
DrawTitleBar(pWinDC);
ReleaseDC(pWinDC);
}
} return CDialog::DefWindowProc(message,wParam,lParam);
}运行时会先闪过默认的windows蓝色标题栏然后才变成自绘的标题栏,跟踪发现产生WM_NCACTIVATE消息时,
在drawTitle之前默认的标题栏已经出现,然后drawtitle有效,但马上又变成默认的标题栏,WM_NCPAINT时也是如此,
之后2种标题栏交替出现,最后变成自绘标题栏。
请问为什么会出现这种情况 求解决方法 !
//消息响应
LRESULT CXXXDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
if (!::IsWindow(m_hWnd))
return CDialog::DefWindowProc(message,wParam,lParam);
if(message == WM_MOVE|| message == WM_NCPAINT||message == WM_NCACTIVATE||message == WM_NOTIFY)
{
CDC* pWinDC = GetWindowDC();
if(pWinDC)
{
DrawTitleBar(pWinDC);
ReleaseDC(pWinDC);
}
} return CDialog::DefWindowProc(message,wParam,lParam);
}运行时会先闪过默认的windows蓝色标题栏然后才变成自绘的标题栏,跟踪发现产生WM_NCACTIVATE消息时,
在drawTitle之前默认的标题栏已经出现,然后drawtitle有效,但马上又变成默认的标题栏,WM_NCPAINT时也是如此,
之后2种标题栏交替出现,最后变成自绘标题栏。
请问为什么会出现这种情况 求解决方法 !
{
LRESULT lrst=CDialog::DefWindowProc(message, wParam, lParam);
if (!::IsWindow(m_hWnd))
return lrst;
if (message==WM_MOVE||message==WM_PAINT||message==WM_NCPAINT||
message== WM_NCACTIVATE ||message == WM_NOTIFY)
{
CDC* pWinDC = GetWindowDC();
if (pWinDC)
DrawTitleBar(pWinDC);
ReleaseDC(pWinDC);
}
return lrst;
}他的不会闪烁
http://www.vckbase.com/document/viewdoc/?id=317
{
// TODO: Add your specialized code here and/or call the base class
if (!::IsWindow(m_hWnd))
return CDialog::DefWindowProc(message,wParam,lParam); if(message == WM_MOVE ¦ ¦ message == WM_NCPAINT ¦ ¦message == WM_NCACTIVATE ¦ ¦message == WM_NOTIFY)
{
CDC* pWinDC = GetWindowDC();
if(pWinDC)
{
DrawTitleBar(pWinDC);
ReleaseDC(pWinDC);
return 0; // 这里返回。
}
} return CDialog::DefWindowProc(message,wParam,lParam);
}
当message == WM_NCPAINT ¦ ¦message == WM_NCACTIVATE 时 已经先激活了默认标题栏 然后才自绘标题栏
当程序很小的时候几乎看不出来闪烁。我现在的项目比较大,可以明显看到蓝色标题栏一闪而过
{
// TODO: Add your specialized code here and/or call the base class
LRESULT lrst;
if(message != WM_NCACTIVATE)// && message != WM_NCPAINT)
lrst=CDialog::DefWindowProc(message, wParam, lParam); if (!::IsWindow(m_hWnd))
return lrst;
if (message == WM_MOVE || message == WM_NCACTIVATE ||message == WM_NOTIFY ||message == WM_NCPAINT )
{
CDC* pWinDC = GetWindowDC();
if (pWinDC)
{
DrawTitleBar(pWinDC);
ReleaseDC(pWinDC);
}
}
return lrst;
}这是我现在修改后的代码 当message == WM_NCACTIVATE 时已经不会激活默认标题栏,如果加上message == WM_NCPAINT的话一直不会出现蓝色标题栏,
但是WM_NCPAINT也不会绘菜单了,需要鼠标点上去才会有菜单显示
//消息响应
LRESULT CRecPlayerDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
if (!::IsWindow(m_hWnd))
return CDialog::DefWindowProc(message, wParam, lParam);;
if (message == 0xae || message == WM_MOVE || message == WM_NCACTIVATE ||message == WM_NOTIFY ||message == WM_NCPAINT )
{
CDC* pWinDC = GetWindowDC();
if (pWinDC)
{
DrawTitleBar(pWinDC);
ReleaseDC(pWinDC);
}
return 1;
}
return CDialog::DefWindowProc(message, wParam, lParam);;
}
添加红字代码后 运行程序时已经不闪屏了,但单步调试时还会出现一次蓝标题栏 无语
求高手指点原因
或者你可以考虑不要WS_CAPTION风格,自己在客户区上面画一个假的标题栏,并响应WM_NCHITTEST消息。