您的位置:首页 > 其它

[一分钟学会系列之六]一分钟学会自定义鼠标指针图标(附DEMO程序)

2011-09-11 12:00 274 查看
这次和大家分享在自己窗口内改变鼠标指针图标的方法。关键在于处理WM_SETCURSOR消息,先看一下这个消息的定义:

WM_SETCURSOR Notification

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

wParamHandle to the window that contains the cursor. lParamThe 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

If an application processes this message, it should return TRUE to halt further processing or FALSE to continue.

这个消息的参数为我们提供了三个信息:当前鼠标所在窗口的句柄,当前鼠标所在区域类型(HTCLIENT,HTCAPTION等),触发了设置指针图标的鼠标消息(WM_MOUSEMOVE, WM_LBUTTONDOWN等)。有了这些信息,我们就可以在程序中按我们的需要灵活的控件鼠标指针的形状了。
附上一小段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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: