我遇到了属性表中的问题。我想在鼠标位置在客户区内时加载不同的光标,并在移出客户区时加载另一个光标。
在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.
}
任何人都可以帮助我解决这个问题。