首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Windows Mobile >

Wince Invalidate刷新有关问题 百思不得其解

2012-04-09 
Wince Invalidate刷新问题 百思不得其解问题描述: 继承了CStatic封装了一个类,用于描绘曲线, 采用双缓存画

Wince Invalidate刷新问题 百思不得其解
问题描述: 继承了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),强制每次都绘全屏

热点排行