2015-04-07 24 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中所述,在長操作中涉及用戶界面線程並不是一個好設計,而從另一個線程更新的進度條會給用戶更多的反饋。