这次和大家分享在自己窗口内改变鼠标指针图标的方法。关键在于处理WM_SETCURSOR消息,先看一下这个消息的定义:
The WM_SETCURSOR message is sent to a window if the mouse causes the cursor to move within a window and mouse input is not captured.
Syntax
WM_SETCURSOR WPARAM wParam LPARAM lParam;
Parameters
- wParam
- Handle to the window that contains the cursor.
- lParam
- The low-order word of lParam specifies the hit-test code.
The high-order word of lParam specifies the identifier of the mouse message.
Return Value
这个消息的参数为我们提供了三个信息:当前鼠标所在窗口的句柄,当前鼠标所在区域类型(HTCLIENT,HTCAPTION等),触发了设置指针图标的鼠标消息(WM_MOUSEMOVE, WM_LBUTTONDOWN等)。有了这些信息,我们就可以在程序中按我们的需要灵活的控件鼠标指针的形状了。If an application processes this message, it should return TRUE to halt further processing or FALSE to continue.
附上一小段MFC中处理这个消息的函数:
在初始化函数中先加载指针图标资源,这里使用系统自带的一些图标,如果想用自定义图标,加载自己的.ico资源就可以了。
在MFC中使用OCR_HAND, OCR_NORMAL等宏时,需要在stdafx.h中添加 #define OEMRESOURCE 这一行,不然会报编译错误 undeclared identifier
m_hNormalCursor = ::LoadImage(NULL, MAKEINTRESOURCE(OCR_HAND), IMAGE_CURSOR, 32, 32, LR_SHARED);
m_hClickCursor = ::LoadImage(NULL, MAKEINTRESOURCE(OCR_WAIT), IMAGE_CURSOR, 32, 32, LR_SHARED);
BOOL CCursorDemoDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// 如果鼠标在子控件内,不改变指针图标
if (pWnd->m_hWnd != m_hWnd)
{
return CDialog::OnSetCursor(pWnd, nHitTest, message);
}
// 如果鼠标不在客户区,不改变指针图标
if (nHitTest != HTCLIENT)
{
return CDialog::OnSetCursor(pWnd, nHitTest, message);
}
// 根据目前鼠标状态设置不同的指针图标
if (message == WM_LBUTTONDOWN)
{
::SetCursor((HCURSOR)m_hClickCursor);
}
else
{
::SetCursor((HCURSOR)m_hNormalCursor);
}
return TRUE;
}
完整示例:http://download.csdn.net/detail/HarbinZJU/3592437