自绘标题栏时,为什么每当出现模式对话框时,自绘标题栏都会闪烁? 我已经用的是内存画图,然后在显示的。怎么还会这样? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 有很多消息(事件)都能引起WM_NCPAINT,一定是你没有处理所有的这些消息 message == WM_MOVE || message == WM_NCPAINT ||message == WM_NCACTIVATE ||message == WM_NOTIFY这些都处理了,还少什么马? WM_ACTIVATE也要处理!大概还有WM_WINDOWPOSCHANGED?这个没试过 当然这个是程序自动会执行的,因为其它的对话框出来,WINDOW是不是要重绘整个区域,当然就会执行到OnPaint(),所以就会出现你上面的情况!具体有很多种方法可以解决!1.加变量不让其绘制就是一种! 模式对话框出来的时候会向父窗口发送WM_ENABLE消息,这个时候可能会引起一条WM_NCPAINT消息然后父窗口执行EnableWindow(FALSE)又会引起一条WM_NCPAINT消息所以出现你说的闪烁 to fz_zhou(vcfan):就算如你所说,可是他是先画在内存DC上,然后再BitBlt的,应该不会有闪烁,所以我还是认为是他没有处理全部可能引起非客户区重绘的消息而导致的 请在自画函数开始处调用BeginPaint,画完结束时调用EndPaint,看看是否还会闪烁。 WM_ACTIVATE ,WM_WINDOWPOSCHANGED单独和同时加上,都试过,不行。BeginPaint,EndPaint也试过,也不行。siphonelee说的对,就是闪烁两次。 可是怎么解决,我不是第一个碰到类似情况的人吧? 这样吧,设置一个全局变量BOOL erase = TRUE;在WM_NCPAINT事件中:if(erase){ //正常操作}else{ return;//避免重画非客户区引起闪烁}在对话框domodal之前erase = FALSE即可 不知道怎么搞得我这样做了,但是还是有闪烁我是这样处理的:LRESULT CMainFrame::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) { LRESULT lrst=CFrameWnd::DefWindowProc(message, wParam, lParam); if (!::IsWindow(m_hWnd)) return lrst; if (message == WM_MOVE ||message == WM_NCACTIVATE ||message == WM_NOTIFY) { CDC* pWinDC = GetWindowDC(); if (pWinDC) DrawTitleBar(pWinDC); ReleaseDC(pWinDC); } if(message == WM_NCPAINT) { if(Erase) { CDC* pWinDC = GetWindowDC(); if (pWinDC) DrawTitleBar(pWinDC); ReleaseDC(pWinDC); } } return lrst;} 在对话框建立的程序是这样的 CAboutDlg aboutDlg; Erase=false; aboutDlg.DoModal(); Erase=true; 到底是怎么搞得的? MFC 资源视图 .rc中的Dialog里面的对话框打不开 VC++ 怎么用Win32API实现删除LISTBOX的所有选项 图形处理问题 请问为什么要把一个返回类型和函数参数都是void的函数,包了两三层,只是改函数名。 请教:对局域网内的共享文件夹的问题! CEdit Box的问题 怎么样才能把一个 *.ico 文件插入到一个EXE 文件中!替换也可以!! char s[]="aaaa"; 我在工具条里加了一个按钮,为什么它总是灰的? 关于框架连接问题!!!!!!!!!!急。。。。。。。。 散分! 如何作出,像OFFICE,金山毒霸,瑞星杀毒 中小助手的“帮助向导”?
这些都处理了,还少什么马?
具体有很多种方法可以解决!
1.加变量不让其绘制就是一种!
会向父窗口发送WM_ENABLE消息,
这个时候可能会引起一条WM_NCPAINT消息
然后父窗口执行EnableWindow(FALSE)
又会引起一条WM_NCPAINT消息
所以出现你说的闪烁
BeginPaint,EndPaint也试过,也不行。
siphonelee说的对,就是闪烁两次。
可是怎么解决,我不是第一个碰到类似情况的人吧?
设置一个全局变量BOOL erase = TRUE;
在WM_NCPAINT事件中:
if(erase)
{ //正常操作
}
else
{
return;
//避免重画非客户区引起闪烁
}在对话框domodal之前erase = FALSE即可
LRESULT CMainFrame::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
LRESULT lrst=CFrameWnd::DefWindowProc(message, wParam, lParam);
if (!::IsWindow(m_hWnd))
return lrst;
if (message == WM_MOVE ||message == WM_NCACTIVATE ||message == WM_NOTIFY)
{
CDC* pWinDC = GetWindowDC();
if (pWinDC)
DrawTitleBar(pWinDC);
ReleaseDC(pWinDC);
}
if(message == WM_NCPAINT)
{
if(Erase)
{
CDC* pWinDC = GetWindowDC();
if (pWinDC)
DrawTitleBar(pWinDC);
ReleaseDC(pWinDC);
}
}
return lrst;
}
在对话框建立的程序是这样的
CAboutDlg aboutDlg;
Erase=false;
aboutDlg.DoModal();
Erase=true;
到底是怎么搞得的?