如题,我是用VS 2005做的一个基于Dialog的程序,当我在我的程序中添加了SetTimer之后,在OnTimer这里打了个断点,但调试时始终不响应,进不了OnTimer这个函数内部。。不知道是不是因为我在程序中用了OnEraseBkgnd画背景的原因。唉,不知道为什么。开始以为是这个开发平台有问题,就另建了一个小程序,把SetTimer添加进去,并添加了WM_TIMER响应,这一次有用,是好的。代码太多了,贴上了不好看。看看各位有没有碰到这个情况。

解决方案 »

  1.   

    WM_TIMER消息的优先级比较低,当消息缓冲区里没有其他的消息时,应用程序才会处理该消息,当消息队列里等待处理的消息比较多的时候,WM_TIMER就好像始终无法处理!
      

  2.   

    是不是你的程序中有死循环,阻塞了WM_TIMER消息
    或是你在处理其他窗口消息影响到了这个Dialog的消息
      

  3.   

    先看看运行你的程序时CPU使用率是不是100%。
      

  4.   

    一个MFC的程序,做的是一个类似QQ登陆对话框一样的东西,在OnEraseBkgnd里面画的背景,然后在对话框上放了些图形控件,
    后来想在对话框上放一个类似QQ游戏登陆时的滚动条动画,就想在程序里加了一个定时器来实现。然后现在的问题是OnTimer接受不到消息。唉,郁闷啊,头都大了。class CMyDialog:CDialog    对话框,OnEraseBkgnd画背景
    |
    |-class CMyPicture:CStatic 图形控件
    |-class ......
      

  5.   

    看看SetTimer调用了没有, 窗口句柄对不对,检查SetTimer的返回值还没有线索就override CWnd::WindowProc, 看看message有传进来WM_TIMER没
      

  6.   

    我看了你的程序了,CPU平均90%以上。
    问题出在你的CMyComboBox::OnPaint()里面。

    CDC * pDC=this->GetDC();
    改成
    PAINTSTRUCT ps;
    CDC* pDC = BeginPaint(&ps);

    ReleaseDC(pDC);
    改成
    EndPaint(&ps);
    就可以了。
      

  7.   

    OnPaint里面用CPaintDC dc(this)获取画图的DC。
      

  8.   

    你也可以用CPaintDC类,CPaintDC类是把PAINTSTRUCT结构封装起来,在构造的时候调用BeginPaint,在析构的时候调用EndPaint,比自己调省事一些。
      

  9.   

    不要用Debug调试Ontimer,用MessageBox()试一试。
      

  10.   

    BeginPaint和GetDC有什么区别?嘻嘻,找到原因了。这是个windows编程问题。
    第一种情况显示出来的字很正常。
    case WM_PAINT:
    gdc = BeginPaint (hwnd, &ps);
    TextOut (gdc, 0, 0, s, strlen (s));
    EndPaint (hwnd, &ps);
    break;
    第二种情况显示的字不停闪烁。
    case WM_PAINT:
    gdc = GetDC (hwnd);
    TextOut (gdc, 0, 0, s, strlen (s));
    ReleaseDC (hwnd, gdc);
    break;BeginPaint() 和EndPaint() 可以删除消息队列中的WM_PAINT消息,并使无效区域有效。
    GetDC()和ReleaseDC()并不删除也不能使无效区域有效,因此当程序跳出 WM_PAINT 时 ,无效区域仍然存在。系统就回不断发送WM_PAINT消息,于是程序不断处理WM_PAINT消息。
      

  11.   

    添加ON_WM_TIMER()在BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()之间的代码中