如何在鼠标移出客户区(属性表)时更改鼠标光标图标类型?

时间:2015-04-07 11:50:54

标签: visual-c++-2008 wtl

我遇到了属性表中的问题。我想在鼠标位置在客户区内时加载不同的光标,并在移出客户区时加载另一个光标。

在porpetysheet中我添加了四页。在我点击下一页的第一页中,当鼠标移出客户区时,我正在加载IDC_WAIT类型的光标并加载IDC_ARROW。

在页面类中,我触发了WM_MOUSEMOVE事件,如下所示:

MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove)

LRESULT OnMouseMove(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
    if(TRUE == m_bIsNextBtnClicked)
        ::SetCursor(LoadCursor(NULL, IDC_WAIT));
    else
        ::SetCursor(LoadCursor(NULL, IDC_ARROW));
    return TRUE;
}

此事件已被触发,绝对没有问题。类似地,我尝试添加MESSAGE_HANDLER(WM_MOUSELEAVE, OnMouseLeave)此事件,假设如果鼠标移出客户区,这将被触发,但此事件根本没有被触发。如果这不是要触发的鼠标事件mouseleave我应该触发哪个事件?

LRESULT OnMouseLeave(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
    ::SetCursor(LoadCursor(NULL, IDC_ARROW));

    return TRUE;
}

现在,当我单击“下一步”按钮时,我实际上正在调用一个需要一段时间才能返回的函数。在使用此函数之前,我正在加载IDC_WAIT游标,即

::SetCursor(LoadCursor(NULL, IDC_WAIT));

现在将鼠标光标移动到非客户区域时,我想加载IDC_ARROW光标,即

::SetCursor(LoadCursor(NULL, IDC_ARROW)); 

当移动到非客户区域时,我正在处理工作表派生类中的鼠标事件,如下所示,

    MESSAGE_HANDLER(WM_NCMOUSEMOVE, OnNCMouseMove)
LRESULT OnNCMouseMove(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
    ::SetCursor(LoadCursor(NULL, IDC_ARROW));

    return 0;
}

除非执行Next按钮事件中的函数,否则不会触发此事件。

我希望它们都是并行完成的,现在单击“下一步”按钮将鼠标悬停在客户端区域上,应该出现“忙碌”图标,当鼠标移出客户端区域时,应该出现IDC_ARROW图标。

     LRESULT OnWizardNext()
        {

          ::SetCursor(LoadCursor(NULL, IDC_WAIT));
          m_bIsNextBtnIsClicked = TRUE;
          BOOL bRet = MyFun();
          m_bIsNextBtnIsClicked = FALSE;
         //Until this function is executed **WM_NCMOUSEMOVE**  

      //event is not getting triggered.But this event should get triggered and I 

   //should be able to see the change of cursor within and out of client area.

        }

任何人都可以帮助我解决这个问题。

1 个答案:

答案 0 :(得分:0)

正如@ here这个问题的MSDN版本所述,在长操作中涉及用户界面线程并不好,从另一个线程更新的进度条会给用户提供更多反馈。