修改鼠标光标的形状(三)
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) 如果没有全程光标,则使用当前系统默认的箭头光标。
在注册窗口类型时所指定的这个鼠标光标又称为全程光标。 在 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) 如果没有全程光标,则使用当前系统默认的箭头光标。
相关文章推荐
- 修改鼠标光标的形状
- 修改鼠标光标的形状(四)
- 修改鼠标光标的形状
- 修改鼠标光标的形状(一)
- 修改鼠标光标的形状(二)
- 修改鼠标光标的形状(五)
- [学习笔记]Java窗体中如何改变鼠标光标的形状
- MFC 如何设置鼠标的形状 如何设置光标热区
- C#设置鼠标在控件上面时,改变光标形状
- MFC 如何设置鼠标的形状 如何设置光标热区
- 改变光标(鼠标形状)后如何消防闪烁
- 修改Android系统的鼠标光标
- VC6.0实现鼠标光标形状及大小的定制
- VC:设置光标(鼠标)形状
- 改变鼠标光标形状
- 改变光标(鼠标形状)后如何消防闪烁
- Windows鼠标光标形状
- canvas 修改光标形状 滑过事件 点击事件
- VC6.0实现鼠标光标形状及大小的定制
- 鼠标触及形状问题(自定义鼠标光标类型)