我用了网上的进度条类CProgressWnd,结果进度条显示过程中,程序中的图像(尤其是矢量图)闪的厉害,调试发现是由CProgressWnd中的函数PeekAndPump引起的,函数PeekAndPump如下:
void CProgressWnd::PeekAndPump(BOOL bCancelOnESCkey /*= TRUE*/)
{
if (m_bModal && ::GetFocus() != m_hWnd)
SetFocus(); MSG msg;
while (!m_bCancelled && ::PeekMessage(&msg, NULL,0,0,PM_NOREMOVE))
{
if (bCancelOnESCkey && (msg.message == WM_CHAR) && (msg.wParam == VK_ESCAPE))
OnCancel(); // Cancel button disabled if modal, so we fake it.
if (m_bModal && (msg.message == WM_LBUTTONUP))
{
CRect rect;
m_CancelButton.GetWindowRect(rect);
if (rect.PtInRect(msg.pt))
OnCancel();
}
if (!AfxGetApp()->PumpMessage())
{
::PostQuitMessage(0);
return;
}
}
}
PeekAndPump应该是用来刷新进度条窗口的,结果它居然连图像窗口也刷新了,请问这个问题怎么解决?
void CProgressWnd::PeekAndPump(BOOL bCancelOnESCkey /*= TRUE*/)
{
if (m_bModal && ::GetFocus() != m_hWnd)
SetFocus(); MSG msg;
while (!m_bCancelled && ::PeekMessage(&msg, NULL,0,0,PM_NOREMOVE))
{
if (bCancelOnESCkey && (msg.message == WM_CHAR) && (msg.wParam == VK_ESCAPE))
OnCancel(); // Cancel button disabled if modal, so we fake it.
if (m_bModal && (msg.message == WM_LBUTTONUP))
{
CRect rect;
m_CancelButton.GetWindowRect(rect);
if (rect.PtInRect(msg.pt))
OnCancel();
}
if (!AfxGetApp()->PumpMessage())
{
::PostQuitMessage(0);
return;
}
}
}
PeekAndPump应该是用来刷新进度条窗口的,结果它居然连图像窗口也刷新了,请问这个问题怎么解决?
加上的话,进度条和主窗口都重画
我觉得问题就在AfxGetApp()->PumpMessage()上,它用了消息泵
http://www.codeproject.com/KB/miscctrl/progresswnd.aspx
那么应该是你本身绘制有问题
我这里测试没有发现问题你操作的时候不显示进度看看会不会闪
不过hdc为0x0000000
如果你的绘图代码没使用双缓存机制,可能会闪烁。
CDC dcMem;
CBitmap bmp;
dcMem.CreateCompatibleDC(pDC);
bmp.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
dcMem.SelectObject(&bmp);
CPen pen(PS_SOLID, 2, RGB(255,0,0));
CPen *pOldPen = dcMem.SelectObject(&pen);
CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
CBrush *pOldBrush=dcMem.SelectObject(pBrush);
dcMem.Rectangle(0,0,rect.Width(),rect.Height());
BLENDFUNCTION blendFunction = {AC_SRC_OVER, 0, 255, 0x01};
::AlphaBlend(pDC->GetSafeHdc(),rect.left,rect.top,rect.Width(),rect.Height(),
dcMem.GetSafeHdc(),0,0,rect.Width(),rect.Height(),blendFunction);
dcMem.DeleteDC();
大家看看该怎么改,才能不闪屏,但一定要透明
这里的pDC是主图像所在的屏幕DC吧,如果将它换成对应的内存DC就可以实现你所期望的了。
即创建一个与主图像所在的屏幕DC兼容的内存memDC(不知你是不是已经为栅格图像建了一个),矩形直接叠加在其上面。
最后在OnDraw里直接bitblt就行。
这里的pDC是主图像所在的屏幕DC吧,如果将它换成对应的内存DC就可以实现你所期望的了。
即创建一个与主图像所在的屏幕DC兼容的内存memDC(不知你是不是已经为栅格图像建了一个),矩形直接叠加在其上面。
最后在OnDraw里直接bitblt就行。
顺便再问个问题:
OnEraseBkGnd、OnPaint、OnDraw三个函数之间的关系是什么?
我只知道在OnPaint里面隐含的调用了OnEraseBkGnd,他们到底和闪屏有啥关系?
OnEraseBkGnd、OnPaint、OnDraw三个函数之间的关系是什么?
我只知道在OnPaint里面隐含的调用了OnEraseBkGnd,他们到底和闪屏有啥关系?