我在对话框工程创建一个子窗口,在对话框初始化时添加一个定时器,定时器不能正常工作,隐藏子窗口是,定时器能正常工作。望解惑哇~初始化代码: SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE); CRect rcClient;
GetClientRect(&rcClient);
int nWidth = rcClient.Width();
int nHeight = rcClient.Height(); m_rcLeftDock.SetRect(CPoint(0 ,0) ,CPoint(nWidth/4 ,nHeight));
m_rcRightDock.SetRect(CPoint(nWidth*3/4 ,0) ,CPoint(nWidth ,nHeight));
CRect rcWnd(0 ,0 ,100 ,100);
m_wndDock.Create(NULL ,NULL ,WS_CHILD|WS_VISIBLE  ,rcWnd ,this ,10);
m_wndDock.SetDockNotify(GetSafeHwnd() ,WM_DOCK_MESSAGE);
m_wndDock.ShowWindow(SW_HIDE);//隐藏式定时器能用,为Show时不能正常工作 ::SetTimer(1 ,1000 ,NULL);
对话框 子窗口 定时器

解决方案 »

  1.   

    我想你把这行:
    m_wndDock.SetDockNotify(GetSafeHwnd() ,WM_DOCK_MESSAGE);
    注释掉,定时器也可以工作吧?
      

  2.   

    Thanks。
    To Mackz:
         确实如你所说,注释掉那行定时器也能工作。请教下这是什么原因?
      

  3.   

    Thanks!
    CDockWnd::CDockWnd()
    {}CDockWnd::~CDockWnd()
    {
    }
    BEGIN_MESSAGE_MAP(CDockWnd, CWnd)
    //ON_WM_PAINT()
    ON_WM_LBUTTONDOWN()
    END_MESSAGE_MAP()
    void CDockWnd::SetDockNotify(HWND hWnd ,UINT nDockMessage)
    {
    m_hDocWnd = hWnd;
    m_nNotifyEvent = nDockMessage;
    }
    // CDockWnd message handlers/*void CDockWnd::OnPaint()
    {
    /*CDC *pDC = GetDC();
    CRect rcClient;
    GetClientRect(&rcClient);
    pDC->FillRect(&rcClient ,&CBrush(RGB(100 ,200 ,100)));
    ReleaseDC(pDC);

    }*/void CDockWnd::OnLButtonDown(UINT nFlags, CPoint point)
    {
    CWnd::OnLButtonDown(nFlags, point);
    }SetDockNotify是在父子窗口间进行通信,设置一些参数,::SendMessage时使用。
    我现在简单重现了一下,发现子窗口没有WM_PAINT的时候父窗口的OnTimer也能响应,感觉像是子窗口的WM_PAINT或某个消息映射 影响了 WM_TIMER消息传给父窗口。对于消息机制不是很了解,所以有点困惑。
      

  4.   

    OnPaint必须用CPiantDC,不要用GetDC(),否则刷新消息就无法得到处理:
    void CDockWnd::OnPaint()
    {
    CPaintDC dc(this);
    CRect rcClient;
    GetClientRect(&rcClient);
    dc.FillRect(&rcClient ,&CBrush(RGB(100 ,200 ,100)));
    }
      

  5.   

    囧啊。以为CpaintDC 和 GetDC差不多,反正是取得个设备上下文来绘制。CpaintDC 析构会把WM_PAINT消息从消息队列里移走,这样才会收到WM_TIMER消息。Thanks a lot!
      

  6.   

    看到这里的讨论终于解决了我好几天一直在做的一个实验中的问题,我用对话框类设置一个定时器,然后点击按钮后全屏播放图片,结果全屏后不能响应OnTimer()函数,怎么也找不出问题,最后没想到是自己重绘里的函数没有把WM_PAINT消息从消息队列里移走,所以没收到WM_TIMER消息。哈哈,问题找出来了,太感谢大家啦!