MFC中修改光标形状

时间:2024-02-18 20:56:05

修改光标形状,如果是修改系统内光标形状,那就很简单了,直接是用::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

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