MFC中修改光标形状

修改光标形状,如果是修改系统内光标形状,那就很简单了,直接是用::SetCursor(::LoadCursor(NULL,MAKEINTRESOURCE(IDC_CURSOR1)))就可以修改成功了,但这只是更改一时的光标形状。如果想要长久修改光标形状,就需要在光标消息中修改鼠标形状了。

1、首先,添加WM_SETCURSOR消息,得到消息函数OnSetCursor;

2、在消息函数OnSetCursor中,添加以下代码

1 BOOL CMy123456Dlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
2 {
3     HCURSOR hcur = ::LoadCursor(NULL,IDC_CROSS);
4     ::SetCursor(hcur);
5     return TRUE;
6     return CDialogEx::OnSetCursor(pWnd, nHitTest, message);
7 }

其中要注意的是,LoadCursor中的第一个参数为进程句柄,当调用的是系统的鼠标的时候,应该为NULL,但是当使用的是自定义的鼠标图案的时候,则为当前的进程句柄,例如在对话框程序总可以用AfxGetApp()->m_hInstance;

第二个参数就是则应为一个字符串,通过鼠标图案的资源ID得到的一个字符串,例如在资源视图新插入一个Cursor,为其命名为IDC_CURSOR1,则其光标资源的ID就是IDC_CURSOR1,那么我们就可以把第二参数设置为MAKEINTRESOURCE(IDC_CURSOR1);因此,我们加载自定义光标图形就可以如下代码

1 BOOL CMy123456Dlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
2 {
3     HCURSOR hcur = ::LoadCursor(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDC_CURSOR1));
4     ::SetCursor(hcur);
5     return TRUE;
6     return CDialogEx::OnSetCursor(pWnd, nHitTest, message);
7 }

其中,用LoadCursor加载光标,得到的大小是有系统自己规定的,我们自己没有办法修改。所以,当我们需要修改光标大小时,往往使用的是LoadImage函数;这个方法也是大部分人加载自定义光标时所使用的方法。其代码如下:

1 BOOL CMy123456Dlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
2 {
3     HCURSOR hcur = (HCURSOR)::LoadImage(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDC_CURSOR1),IMAGE_CURSOR,5,5,LR_COPYFROMRESOURCE);
4     ::SetCursor(hcur);
5     return TRUE;
6     return CDialogEx::OnSetCursor(pWnd, nHitTest, message);
7 }

LoadImage

函数功能:该函数装载图标,光标,或位图。

函数原型:HANDLE LoadImage(HINSTANCE hinst,LPCTSTR lpszName,UINT uType,int cxDesired,int cyDesired,UINT fuLoad);

参数介绍:

  • hinst:指向需加载该资源的module;可以填写当前进程的句柄也可以为NULL,不过一般可以将这个参数设为NUll。
  • lpszName:标识要加载的资源;可以填写资源文件名的路径,如果fuLoad设为LR_LOADFROMFILE,则该参数为资源的文件名,如位图文件、ICON文件,当然也包括Cursor文件。如果是这个方式填写,在运行软件的地方要把资源文件拷贝过去,否则找不到光标的;也可以填写MAKEINTRESOURCE(IDC_CURSOR1),fuLoad要设置为LR_COPYFROMRESOURCE;用这个方式,就不需要在额外拷贝资源文件了,所以一般是使用这个方式。
  • uType:指明加载的资源类型,它的值可以是IMAGE_BITMAP. 加载位图;IMAGE_CURSOR. 加载cursor;IMAGE_ICON. 加载ICON。
  • cxDesired,光标的宽度,值是以像素为单位的整数。
  • cyDesired ,光标的长度,值是以像素为单位的整数。
  • fuLoad,资源加载的方式,当值为LR_LOADFROMFILE时,指从文件加载。

LoadCursorFromFile

这个函数也可以加载光标。参数直接填写资源文件名。

时间: 2024-07-29 08:54:40

MFC中修改光标形状的相关文章

如何改变vim中的光标形状 : 在插入状态下显示为 beam?而在 其他 状态下 为 block?

分成两种情况来说明: 如果是在 shell 即: gnome-termial终端中, 来启动或 使用 vim的话, 你是 无法 实现这种需求的: 改变vim中的光标形状 : 在插入状态下显示为 beam, 而在 其他 状态下 为 block? 因为 shell下的vim 其光标 始终是由 shell 来 决定的, 也就是说, vim 不是 独立的程序, 它只是寄人篱下, 所以 shell的光标将始终 由shell 来决定, 跟 vim 一点关系都没有, vim 对光标没有影响, 所以, 在she

在MFC中修改opencv的namedWindow窗口位置

当在MFC中应用opencv的窗口来显示图片.希望namedWindow创建的窗口能根据需要改变风格: //by dongchunxiao cv::namedWindow("windows1",0); //创建一个窗口 HWND hWnd = (HWND)cvGetWindowHandle("windows1");//获取子窗口的HWND HWND hParentWnd = ::GetParent(hWnd);//获取父窗口HWND.父窗口是我们要用的 ::SetW

VS2010/MFC中修改菜单栏后状态栏消失问题

今天用VS2010编写单文档的窗口程序,修改菜单之后忽然发现状态栏不见了,百度了好久也没有找到原因,无奈只能重新又做了一遍,结果功夫不负有心人,原因一不小心被我找到了. 原来MFC中有一个命令是ID_VIEW_STATUS_BAR对应的函数可以隐藏状态栏的显示. 我的解决方法比较笨,就是在菜单栏中添加了一个状态栏显示的选项,把ID设为ID_VIEW_STATUS_BAR,当点击它的时候就选择显示或者隐藏状态栏了.

MFC中的主窗口修改标题

MFC中的主窗口修改标题 如何去掉“无标题”1.在主程序中的InitInstance(): m_pMainWnd->SetWindowText("你要显示的东西如果不想显示置空就行") 2.在框架类的PreCreateWindow函数里修改风格 BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { cs.style &= ~FWS_ADDTOTITLE; //去除标题条中的文档名 return CFrameWnd

MFC中的GDI绘图<转>

一.关于GDI的基本概念 什么是GDI? Windows绘图的实质就是利用Windows提供的图形设备接口GDI(Graphics Device Interface)将图形绘制在显示器上. 在Windows操作系统中,动态链接库C:\WINDOWS\system32\gdi32.dll(GDI Client DLL)中定义了GDI函数,实现与设备无关的包括屏幕上输出像素.在打印机上输出硬拷贝以及绘制Windows用户界面功能.在Visual C++6.0中的头文件C:\Program Files

MFC中的GDI绘图(5)

坐标映射实例 (1)建立单文档MFC项目Draw:New->Projects->MFC AppWizard(EXE)->Single Document. (2)找到CMainFrame::PreCreateWindow函数,在其中设置默认窗口大小为400 pixel*300 pixel. BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWnd::PreCreateWindow(cs) ) return

MFC中添加ToolTip提示框

PART 1 MFC 对话框中的 Buttton添加提示 例如我们想在一个对话框中的一个button控件添加tooltip,实现的方法如下: 1. 在该对话框的类中添加一个CToolTipCtrl类型成员,并在适当的地方将其初始化如下: m_ToolTipCtrl.Create(this); m_ToolTipCtrl.AddTool(GetDlgItem(IDC_BUTTON1), _T("This is ToolTip")); m_ToolTipCtrl.SetMaxTipWidt

MFC中模态对话框和非模态对话框

MFC的对话框非为两种,一种叫模态对话框(Modal  Dialog  Box,又叫做模式对话框),一种叫做非模式对话框(Modaless Dialog Box,又叫无模式对话框).两者的区别在于当对话框打开的时候,是否允许用户进行其他对象的操作. 一.模态对话框 模态对话框指,当用户需要对该对话框之外的其他对话框或者模块进行操作时,必须该对话框关闭,才能去编辑其他对话框或者模块. 创建如下: //创建模态对话框 CModalDialog modalDialog; modalDialog.DoM

MFC的运行机制 以及 MFC中的DC、CDC、HDC、句柄、设备上下文 [转]

在MFC程序中,我们并不经常直接调用Windows API,而是从MFC类创建对象并调用属于这些对象的成员函数.也就是说MFC封装了Windows API.你说你喜欢C++而MFC换一种说法就是一个用C++写的一个函数库 然后你来调用 只不过这个类不是你写的 MFC提供数百个类,最重要的.也是编写任何VC++应用程序都必不可少的两个类CWinApp和CFrameWnd,这两个类是编写复杂庞大应用程序的基石. 1>封装特性:构成MFC框架的是MFC类库而MFC类库又是C++的一个类库.这些类封装W