初步决定用 GetTickCount来记时。当停留时间达到100毫秒时,提示:
AfxMessageBox("你已经停留了100毫秒了!");

解决方案 »

  1.   

    可行
    Start = GetTickCount();
    while(true)
    {
        Sleep(10);
        End = GetTickCount();
        if( End - Start > 100 )
            AfxMessageBox("haha");
    }OnMouseMove()
    {
        Start = GetTickCount();
    }大概是否是这样?^_^,我是初学者.
      

  2.   

    : xiaohuidong() 
    -----------------
    你这样用了一个 while 大循环,会很占用CPU 的,效率不高。可以在窗口类Dialog 保存2个变量 
    DWORD m_dwPreviousTickCount;
    DWORD m_dwNowTickCount;在鼠标移动事件中这样判断CMyDialog::InitDialog()
    {
     m_dwPreviousTickCount = GetTickCount();
     m_dwNowTickCount      = GetTickCount();
    }CMyDialog::OnMouseMove(UINT nFlags, CPoint point)
    {  //.... 先要判断鼠标是否在按钮的矩形区域
      CRect rect;
      m_MyBtn->GetWindowRect(&rect);
      if(!rect.PtInRect(point))   
      {
          m_dwPreviousTickCount = GetTickCount();
          return;
       } m_dwNowTickCount = GetTickCount(); if( m_dwPreviousTickCount - m_dwNowTickCount >= 100*1000 )
        AfxMessageBox("sir,100 seconds elapsed ,you know ,^_^");
      
     m_dwPreviousTickCount = GetTickCount();
    }
      

  3.   

    呵呵,纠正一下
    if( m_dwPreviousTickCount - m_dwNowTickCount >= 100*1000 )
        AfxMessageBox("sir,100 seconds elapsed ,you know ,^_^");应该是:
    if( m_dwNowTickCount - m_dwPreviousTickCount >= 100*1000 )
        AfxMessageBox("sir,100 seconds elapsed ,you know ,^_^");
      

  4.   


    BOOL CExampleDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
    {
    // TODO: Add your message handler code here and/or call default
    CString sClassName;
    ::GetClassName(pWnd->GetSafeHwnd(),sClassName.GetBuffer(80),80);
    if (sClassName=="Button")
    {
                //Add Code
    }
    return CDialog::OnSetCursor(pWnd, nHitTest, message);
    }
      

  5.   

    OnMouseMove()里判断鼠标是否在按钮区域内
    if(在按钮区域中)
        SetTimer(1,100,NULL);
    else //不在
        KillTimer(1);OnTimer()中
    AfxMessageBox(......);
      

  6.   

    看了上面的帖子, 我觉得很奇怪, mfc中有相关WM_MOUSEHOVER消息, 为什么不使用?简述如下:
    1,新建一个CNCButton继承自CButton2,添加成员:BOOL m_bOver; //鼠标位于按钮之上时该值为true,反之为flase
    3,添加消息:
    afx_msg void OnMouseMove(UINT nFlags, CPoint point);
    afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);
    afx_msg LRESULT OnMouseHover(WPARAM wParam, LPARAM lParam);
    ON_WM_MOUSEMOVE()
    ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
    ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover)
    void CNCButton::OnMouseMove(UINT nFlags, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default
    if (!m_bOver)
    {
    TRACKMOUSEEVENT tme;
    tme.cbSize = sizeof(tme);
    tme.hwndTrack = m_hWnd;
    tme.dwFlags = TME_LEAVE | TME_HOVER;
    tme.dwHoverTime = 100;//100毫秒
    m_bTracking = _TrackMouseEvent(&tme);
    }
    CButton::OnMouseMove(nFlags, point);
    }
    LRESULT CNCButton::OnMouseLeave(WPARAM wParam, LPARAM lParam)
    {
    m_bOver = FALSE;
    return 0;
    }LRESULT CNCButton::OnMouseHover(WPARAM wParam, LPARAM lParam)
    {
    m_bOver = TRUE;
            AfxMessageBox("鼠标悬停100毫秒");
    return 0;
    }注意在构造函数处将m_bOver = FALSE;
      

  7.   

    void CNCButton::OnMouseMove(UINT nFlags, CPoint point)
    {
    // TODO: Add your message handler code here and/or call default
    if (!m_bOver)
    {
    TRACKMOUSEEVENT tme;
    tme.cbSize = sizeof(tme);
    tme.hwndTrack = m_hWnd;
    tme.dwFlags = TME_LEAVE | TME_HOVER;
    tme.dwHoverTime = 100;//100毫秒
    ///////////////////////////////////////////////////////////
    BOOL m_bTracking = _TrackMouseEvent(&tme);
    if (!m_bTracking)return FALSE;
    ///////////////////////////////////////////////////////////
    }
    CButton::OnMouseMove(nFlags, point);
    }
      

  8.   

    我的想法是:
    处理OnTimer消息,在鼠标进入按钮的时候开始这个计时器,每隔 1 毫秒为一个全局变量加一,当此全局变量满为 100 时可以触发对话框。而当鼠标移出按钮时 KillTimer,将全局编梁归 0
    这只是个框架,详细的问题还要自己来写
      

  9.   

    OnMouseMove()
    {
         if(在区域内)
         {
              if(m_iTimer == NULL)
              {
                  //如果没有设置过TIMER
                  m_iTimer   = ::SetTimer(..,100*1000,);//设置100M后执行
              }
         }
         else //不在区域内
         {
              if(m_iTimer) //如果设置过timer,取消timer
              {
                  ::KillTimer(..);
                  m_iTimer = NULL;
              }
         }
    }OnTimer()
    {
          MessageBox(...);
          ....
    }
      

  10.   

    记的初始化时
    m_iTimer = NULL;