问题描述: 继承了CStatic封装了一个类,用于描绘曲线, 采用双缓存画图法。在OnPaint()函数中有如下代码:
void MyStatic::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRect rect;
GetClientRect(&rect);
CDC MemDC;
MemDC.CreateCompatibleDC(&dc);
CBitmap bitmap;
CBitmap* pOldBitmap = NULL;
bitmap.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height());
pOldBitmap = MemDC.SelectObject(&bitmap);
MemDC.FillSolidRect(rect, m_BackColor);
if (g_nStatus == 1)
{
for (int i=0; i<g_arrDateX.GetSize()-1; i++)
{
MemDC.MoveTo(g_arrDateX[i], g_arrDateY[i]);
MemDC.LineTo(g_arrDateX[i+1], g_arrDateY[i+1]);
}
}
dc.BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &MemDC, 0, 0, SRCCOPY);
MemDC.SelectObject(pOldFont);
MemDC.SelectObject(pOldBitmap);
}
然后创建一线程,线程里添加画图数据,线程函数如下:
void __stdcall ThreadFun(LPVOID lpVoid)
{
while (!g_bStop)
{
/////////////////////////////////////
// 线程延时(勿略)
static float fTime = 0;
if (g_nStatus == 1)
{
fTime = fTime + 0.06f;
g_arrDateX.Add(fTime);
g_arrDateY.Add(50);
// 刷新曲线
if (g_arrDateX.GetSize() % 5 == 0)
{
((CTestDlg*)g_pTestDlg)->PostMessage(WM_USER_UPDATA, 0, 0);
}
}
}
}
WM_USER_UPDATA为线程通知主界面刷新消息,WM_USER_UPDATA执行函数如下:
afx_msg LRESULT CTestDlg::OnUpData(WPARAM wParam, LPARAM lParam)
{
m_MyStatic.Invalidate(); // 执行MyStatic::OnPaint()
return 1;
}
问题如下:按原理,同于数据量不断增大,刷新会变得很慢,但1000秒内不会界面无反应,大概在600秒左右停止线程(即停止刷新),MyStatic::OnPaint()无问题,能刷新过来,但接下来问题就
来了,这时候只要有另一窗体遮住MyStatic窗体,当关掉遮挡窗体后MyStatic再也刷新不过来了,能测出MyStatic::OnPaint()一定在执行,就是刷新不过来,好像失效似的。不知为何???
------解决方案--------------------
对,只是更新未挡住的部分。
------解决方案--------------------
可以考虑在窗体 Active 时,自己重绘
------解决方案--------------------
试试看 Invalidate(Rectangle),强制每次都绘全屏