2015-04-07 64 views
-1

我在属性表中遇到了问题。我想在鼠标位置位于客户端区域时加载不同的光标,并在移出客户端区域时加载另一个光标。鼠标移出客户区(propertysheet)时如何更改鼠标光标图标类型?

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

在页面I类触发事件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; 
} 

此事件不会被触发,除非执行下一个按钮事件中的函数。

我希望他们两个并行完成,即单击下一步按钮,现在将鼠标悬停在客户区上,忙图标应该出现,当鼠标移出客户区时,应该出现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. 

     } 

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

回答

0

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