您的位置:首页 > 其它

修改鼠标光标的形状(三)

2007-05-11 00:06 375 查看
方法二:通过 AfxRegisterClass() 或者 AfxRegisterWndClass() 直接向系统注册一个指定鼠标光标的窗口类型。

在注册窗口类型时所指定的这个鼠标光标又称为全程光标。 在 MFC 框架之下,我们通常把这一步操作放在 CWnd::PreCreateWindow() 函数中完成。

BOOL CMyDialog::PreCreateWindow(CREATESTRUCT& cs)
{
if (m_hMyCurosr != NULL)
{
cs.lpszClass = AfxRegisterWndClass(
CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW, // use any window styles
m_hMyCurosr,
(HBRUSH) (COLOR_WINDOW + 1)); // background brush
}
return CDialog::PreCreateWindow(cs)
}

从最终实现的效果上看方法一和方法二没有什么区别。但从易用性和灵活性的角度上看,我本人则更加青睐于方法一。其易用性在于我不需要特别记住 AfxRegisterWndClass() 这个函数的用法;其灵活性在于能够在程序运行过程中精确地控制鼠标指针的形状,譬如说我把上面的需求案例变动一下:实现一个从 CDialog 派生的窗口类,要求当鼠标移动到窗口客户区中特定区域的时候,修改鼠标指针的形状,使其显示一个小手的形状。其中特定区域的大小由其成员变量 CRect m_rcChangeCursor 指定。

只需要把 OnSetCursor() 改写一下即可满足以上需求:

BOOL CMyDialog::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// TODO: Add your message handler code here and/or call default
if (m_hMyCurosr != NULL)
{
CPoint pt(0, 0);
::GetCursorPos(&pt);
ScreenToClient(&pt);
if (m_rcChangeCursor.PtInRect(pt))
{
::SetCursor(m_hMyCurosr);
return TRUE;
}
}

return CDialog::OnSetCursor(pWnd, nHitTest, message);
}

在本篇结束之前,我们回过头谈一下 WM_SETCURSOR 消息的处理机制:
(a) 缺省的窗口过程首先发送 WM_SETCURSOR 消息到当前光标下的窗口或者控件;
(b) 如果窗口或者控件处理了 WM_SETCURSOR 消息(即返回 TRUE),则 Windows 不再作任何多余的事情,处理完消息便结束;
(c) 如果窗口或者控件不处理 WM_SETCURSOR 消息(例如返回 FALSE 或者调用 MFC 基类的默认处理),则继续让父窗口来处理 WM_SETCURSOR;
(d) 如果父窗口也不做任何处理,则使用全程光标;
(e) 如果没有全程光标,则使用当前系统默认的箭头光标。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: