现在的位置: 首页 > 综合 > 正文

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

2013年04月07日 ⁄ 综合 ⁄ 共 1527字 ⁄ 字号 评论关闭

这次和大家分享在自己窗口内改变鼠标指针图标的方法。关键在于处理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

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

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

【上篇】
【下篇】

抱歉!评论已关闭.