MFC 使用自定义光标
文章目录
- 前言
- 一、制作光标文件
- 二、使用步骤
- 1. 创建对话框程序项目
- 2. 导入光标文件
- 3. 加载光标资源
- 4. 添加鼠标事件
- 5. 添加WM_SETCURSOR消息
- 总结
前言
本文实现在MFC程序中使用自定义的光标,演示程序鼠标左键、中键、右键按下时分别加载不同的光标,鼠标释放后恢复默认光标,效果如下:

一、制作光标文件
找一个在线免费转换工具,把png,jpg转成cur光标文件,上传png文件(尺寸32X32合适),转换成功后下载cur文件备用
在线转换网站:
convertio
Imageonvert
二、使用步骤
1. 创建对话框程序项目
打开vs2017,新建MFC对话框程序


2. 导入光标文件
- 把转换成功的cur文件拷贝到项目res文件夹下
- 在vs2017资源视图中,右键菜单选“添加资源…”,弹出“添加资源”对话框,点“导入”,选择res文件夹下的cur文件
- 导入成功后在Icon资源下可以看到新导入的ID,可修改资源ID



3. 加载光标资源
在对话框类CCursorDemoDlg头文件中添加保存光标的句柄变量,在构造函数中调用LoadImage函数加载光标资源
头文件:
private:HCURSOR m_curArrow;HCURSOR m_curPan;HCURSOR m_curWin;HCURSOR m_curScale;HCURSOR m_hCursor;
源文件构造函数:
CCursorDemoDlg::CCursorDemoDlg(CWnd* pParent /*=nullptr*/): CDialogEx(IDD_CURSORDEMO_DIALOG, pParent)
{m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);m_curPan = (HCURSOR)::LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON_PAN),IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR);m_curWin = (HCURSOR)::LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON_WIN),IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR);m_curScale = (HCURSOR)::LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON_SCALE),IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR);m_hCursor = m_curArrow = LoadCursor(NULL, IDC_ARROW);
}
4. 添加鼠标事件
在鼠标事件中调用SetCursor函数设置光标,鼠标按下消息设置想要的光标,鼠标释放设置为默认光标
void CCursorDemoDlg::OnLButtonDown(UINT nFlags, CPoint point)
{// TODO: 在此添加消息处理程序代码和/或调用默认值m_hCursor = m_curWin;SetCursor(m_hCursor);CDialogEx::OnLButtonDown(nFlags, point);
}void CCursorDemoDlg::OnMButtonDown(UINT nFlags, CPoint point)
{// TODO: 在此添加消息处理程序代码和/或调用默认值m_hCursor = m_curPan;SetCursor(m_hCursor);CDialogEx::OnMButtonDown(nFlags, point);
}void CCursorDemoDlg::OnRButtonDown(UINT nFlags, CPoint point)
{// TODO: 在此添加消息处理程序代码和/或调用默认值m_hCursor = m_curScale;SetCursor(m_hCursor);CDialogEx::OnRButtonDown(nFlags, point);
}void CCursorDemoDlg::OnLButtonUp(UINT nFlags, CPoint point)
{// TODO: 在此添加消息处理程序代码和/或调用默认值m_hCursor = m_curArrow;SetCursor(m_hCursor);CDialogEx::OnLButtonUp(nFlags, point);
}void CCursorDemoDlg::OnMButtonUp(UINT nFlags, CPoint point)
{// TODO: 在此添加消息处理程序代码和/或调用默认值m_hCursor = m_curArrow;SetCursor(m_hCursor);CDialogEx::OnMButtonUp(nFlags, point);
}void CCursorDemoDlg::OnRButtonUp(UINT nFlags, CPoint point)
{// TODO: 在此添加消息处理程序代码和/或调用默认值m_hCursor = m_curArrow;SetCursor(m_hCursor);CDialogEx::OnRButtonUp(nFlags, point);
}
5. 添加WM_SETCURSOR消息
添加WM_SETCURSOR消息,在响应函数中调用SetCursor,并返回TRUE,注释默认代码
BOOL CCursorDemoDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{// TODO: 在此添加消息处理程序代码和/或调用默认值SetCursor(m_hCursor);return TRUE;//return CDialogEx::OnSetCursor(pWnd, nHitTest, message);
}
总结
- png,jpg转换为cur光标文件
- 在资源视图中导入cur光标文件
- LoadImage加载光标资源
- 添加鼠标事件,在响应函数中调用SetCursor设置光标
