1.新建项目
2.添加资源Cursor
3.添加鼠标移动响应函数,用于显示鼠标光标形状
void C修改鼠标光标View::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CRect rc;
GetClientRect(&rc);
if (point.x <= rc.right / 2)//鼠标在窗口左侧时
::SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR1));
else
::SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR2));
CView::OnMouseMove(nFlags, point);
}
4.打开您的视图类的头文件 (.h 文件)
添加一个私有成员变量来存储光标句柄
// 修改鼠标光标View.h : C修改鼠标光标View 类的接口
//
#pragma once
class C修改鼠标光标View : public CView
{
protected: // 仅从序列化创建
C修改鼠标光标View();
DECLARE_DYNCREATE(C修改鼠标光标View)
// 特性
public:
C修改鼠标光标Doc* GetDocument() const;
// 操作
public:
// 重写
public:
virtual void OnDraw(CDC* pDC); // 重写以绘制该视图
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
// 实现
public:
virtual ~C修改鼠标光标View();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
// 生成的消息映射函数
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
private:
HCURSOR m_hCursor; // 自定义光标句柄
};
#ifndef _DEBUG // 修改鼠标光标View.cpp 中的调试版本
inline C修改鼠标光标Doc* C修改鼠标光标View::GetDocument() const
{ return reinterpret_cast<C修改鼠标光标Doc*>(m_pDocument); }
#endif
在视图类的构造函数中加载光标资源。
C修改鼠标光标View::C修改鼠标光标View()
{
// TODO: 在此处添加构造代码
m_hCursor = AfxGetApp()->LoadCursor(IDC_CURSOR3); // IDC_MY_CURSOR 是您在资源视图中定义的光标ID
}
重载SetCursor()消息
BOOL C修改鼠标光标View::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (nHitTest == HTCLIENT && m_hCursor != NULL)
{
::SetCursor(m_hCursor); // 显示自定义光标
return;
}
return CView::OnSetCursor(pWnd, nHitTest, message);
}
全部代码
修改鼠标光标View.h
// 修改鼠标光标View.h : C修改鼠标光标View 类的接口
//
#pragma once
class C修改鼠标光标View : public CView
{
protected: // 仅从序列化创建
C修改鼠标光标View();
DECLARE_DYNCREATE(C修改鼠标光标View)
// 特性
public:
C修改鼠标光标Doc* GetDocument() const;
// 操作
public:
// 重写
public:
virtual void OnDraw(CDC* pDC); // 重写以绘制该视图
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
// 实现
public:
virtual ~C修改鼠标光标View();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
// 生成的消息映射函数
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
private:
HCURSOR m_hCursor; // 自定义光标句柄
public:
afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
};
#ifndef _DEBUG // 修改鼠标光标View.cpp 中的调试版本
inline C修改鼠标光标Doc* C修改鼠标光标View::GetDocument() const
{ return reinterpret_cast<C修改鼠标光标Doc*>(m_pDocument); }
#endif
修改鼠标光标View.cpp
// 修改鼠标光标View.cpp : C修改鼠标光标View 类的实现
//
#include "stdafx.h"
// SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的
// ATL 项目中进行定义,并允许与该项目共享文档代码。
#ifndef SHARED_HANDLERS
#include "修改鼠标光标.h"
#endif
#include "修改鼠标光标Doc.h"
#include "修改鼠标光标View.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// C修改鼠标光标View
IMPLEMENT_DYNCREATE(C修改鼠标光标View, CView)
BEGIN_MESSAGE_MAP(C修改鼠标光标View, CView)
// 标准打印命令
ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)
ON_WM_MOUSEMOVE()
ON_WM_SETCURSOR()
END_MESSAGE_MAP()
// C修改鼠标光标View 构造/析构
C修改鼠标光标View::C修改鼠标光标View()
{
// TODO: 在此处添加构造代码
m_hCursor = AfxGetApp()->LoadCursor(IDC_CURSOR3); // IDC_MY_CURSOR 是您在资源视图中定义的光标ID
}
C修改鼠标光标View::~C修改鼠标光标View()
{
}
BOOL C修改鼠标光标View::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: 在此处通过修改
// CREATESTRUCT cs 来修改窗口类或样式
return CView::PreCreateWindow(cs);
}
// C修改鼠标光标View 绘制
void C修改鼠标光标View::OnDraw(CDC* /*pDC*/)
{
C修改鼠标光标Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
}
// C修改鼠标光标View 打印
BOOL C修改鼠标光标View::OnPreparePrinting(CPrintInfo* pInfo)
{
// 默认准备
return DoPreparePrinting(pInfo);
}
void C修改鼠标光标View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 添加额外的打印前进行的初始化过程
}
void C修改鼠标光标View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 添加打印后进行的清理过程
}
// C修改鼠标光标View 诊断
#ifdef _DEBUG
void C修改鼠标光标View::AssertValid() const
{
CView::AssertValid();
}
void C修改鼠标光标View::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
C修改鼠标光标Doc* C修改鼠标光标View::GetDocument() const // 非调试版本是内联的
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(C修改鼠标光标Doc)));
return (C修改鼠标光标Doc*)m_pDocument;
}
#endif //_DEBUG
// C修改鼠标光标View 消息处理程序
void C修改鼠标光标View::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CRect rc;
GetClientRect(&rc);
if (point.x <= rc.right / 2)//鼠标在窗口左侧时
::SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR1));
else
::SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR2));
CView::OnMouseMove(nFlags, point);
}
BOOL C修改鼠标光标View::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (nHitTest == HTCLIENT && m_hCursor != NULL)
{
::SetCursor(m_hCursor); // 显示自定义光标
return true;
}
return CView::OnSetCursor(pWnd, nHitTest, message);
}