我有两个问题:
第一:看如下代码:
void CPSenior1111Dlg::OnTimer(UINT nIDEvent) 
{
// TODO: Add your message handler code here and/or call default
//CClientDC dc(this);
//dc.SelectObject(&pen);
//dc.SetTextColor(RGB(0,255,0));
//CPen pen(1,PS_SOLID,RGB(255,0,0));
CRect rect;
::GetClientRect(theApp.m_pMainWnd->m_hWnd,&rect);
m_CurrentTime = CTime::GetCurrentTime();
CString strtime1 = m_CurrentTime.Format("%A,%B %d,%Y");
CString strtime2 = m_CurrentTime.Format("%H : %M : %S");
theApp.m_pMainWnd->GetDC()->TextOut(rect.Width()-300,10,strtime1);
theApp.m_pMainWnd->GetDC()->TextOut(rect.Width()-250,40,strtime2); CDialog::OnTimer(nIDEvent);
}
int CPSenior1111Dlg::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: Add your specialized creation code here
SetTimer(1,1000,NULL);
return 0;
}
自我加上这段代码后,在主对话框上显示了动态的系统时间,可是,如果让这个程序运行差不多5秒后
然后关闭程序,必然将会出现一个如下内存指引错误对话框,时间段一点则不会,这是怎么回事?我的第二个问题是:
还有没有其他的方法在对话框上显示动态时间呢???期待高手答复!

解决方案 »

  1.   

    直接把时间格式化为字符串后,输出到edit编辑控件不更方便么?为什么要用 GetDC()->TextOut?
      

  2.   

    直接把时间格式化为字符串后,输出到edit编辑控件不更方便么?为什么要用 GetDC()->TextOut?应该不是这个原因吧,楼主这个方法也可以的,你看看是不是没有释放DC?RELEASEDC?
      

  3.   

    看不出什么问题,不过很奇怪为什么你写成theApp.m_pMainWnd->GetDC()->...
    直接写GetDC就行了啊
      

  4.   

    明显是没释放DC的问题,可改为
    CDC *pDC=theApp.m_pMainWnd->GetDC();
    pDC->TextOut(rect.Width()-300,10,strtime1);
    pDC->TextOut(rect.Width()-250,40,strtime2);
    ReleaseDC(pDC);
      

  5.   

    如果楼上各位的办法还不能解决楼主问题,楼主可以响应WM_DESTROY消息,在这个撤销窗口的消息响应函数里把定时器Kill掉。关于动态显示时间的,还有一种方法,就是等待定时器对象,是个内核对象。CreateWaitableTimer即可创建。
      

  6.   

    GetDC()以后要ReleaseDC()释放Unless the device context belongs to a window class, the ReleaseDC member function must be called to release the context after painting. 
      

  7.   

    KillTimer  1.KillTimer:移除定时器函数的声明:移除先前用SetTimer设置的定时器。在定时器使用完毕后移除定时器时使用。   函数原型:   BOOL KillTimer(   HWND hwnd; //与定时器相关联的窗口句柄   UINT nIDEvent //定时器标识符   ):   参数:   hwnd:与定时器相关联的窗口句柄   nIDEvent: 传递给SetTimer的定时器ID值。   说明:   销毁以前调用SetTimer创建的用nIDEvent标识的定时器事件。不能将此定时器有关的未处理的WM_TIMER消息都从消息队列中清除。 
      

  8.   

    是啊,而且lz在timer里一秒钟才刷新下界面,其它窗口覆盖后会留残影的。
    用static控件吧。