函数功能:该函数从一个与应用事例相关的可执行文件(EXE文件)中载入指定的光标资源。该函数已被Loadlmage函数替代。
函数原型:HCURSOR LoadCursor(HINSTANCE hlnstance,LPCTSTR lpCursorName); 参数: hlnstance:标识一个模块事例,它的可执行文件包含要载入的光标。 LpCursorName:指向以NULL结束的字符串的指针,该字符串存有等载入的光标资源名。该参数低位字节和高位字节0组成资源标识器也可以由低位字为资源标识符和高位字为零组成。也可以用MAKEINTRESOURCE宏命令创建该值。 要使用Win32预定义的一个光标,应用程序必须把hlnstance参数设为NULL,并把IpCursorName设为如下值之一: IDC_APPSTARTING 标准的箭头和小沙漏 IDC_ARROW 标准的箭头 IDC_CROSS 十字光标 IDC_HELP 标准的箭头和问号 IDC_IBEAM 工字光标 IDC_NO 禁止圈 IDC_SIZEALL 四向箭头指向东、西、南、北 IDC_SIZENESW 双箭头指向东北和西南 IDC_SIZENS 双箭头指向南北 IDC_SIZENWSE 双箭头指向西北和东南 IDC_SIZEWE 双箭头指向东西 IDC_UPARROW 垂直箭头 IDC_WAIT 沙漏返回值:如果成功,返回值是新载入的光标的句柄:如果失败,返回值是NULL。若想获得更多错误信息,请调用GetLastError函数。 备注:LoadCursor函数仅载入没有被载入过的光标资源,否则,它检取已存在的光标资的句柄。仅当IpCursorName参数指向一个光标资源时,该函数才返回一个有效的光标句柄。如果IpCursorName不是指向光标而是指向了其他类型的资源(如icon),则该函数返回值不是NULL,尽管它不是一个有效的光标句柄,该函数为当前显示设备光标搜寻最贴切的光标资源。光标资源可以是彩色或单色的位图。Windows CE:当目标平台不支持鼠标光标时。使用cursor光标组件。该光标组件支持的唯一的光标是等待光标(IDC_WAIT)。使用LoadCursor函数与SetCursor函数可设值等待光标。SetCursor(LoadCursor(NULL,IDC_WAIT))当目标平台不支持鼠标光标时,使用cursor光标组件,该组件以桌面窗口平台同样的方式支持LoadCursor函数,唯一不同的是仅支持单色光标。Windows CE不支持彩色光标。试图载入一个彩色光标,将产生难以预料的结果。返回值是不确定的。——————————————————————————————————————————————————————————————
1: 修改方法一
重载CView里的OnMouseMove函数 .
重载方法 :
“View” -> “ClassWizard” (Ctrl + W) -> 右侧Messages栏选择”WM_MOUSEMOVE” , 然后点”Add Function” , 点”OK” .
添加代码 :
在 CDocTestView::OnMouseMove()里添加如下代码:
HCURSOR hCur = LoadCursor( NULL , IDC_CROSS ) ;//
::SetCursor(hCur);
机制分析:
系统默认每次调用OnMouseMove函数 ,都会重新用程序默认自带的光标来重新绘制光标 ,所以 ,需要在OnMouseMove里来进行光标的修改才有效 。
2: 修改方法二
重载CView里的OnSetCursor函数 .
重载方法:
“View” -> “ClassWizard” (Ctrl + W) -> 右侧Messages栏选择”WM_SETCURSOR” , 然后点”Add Function” , 点”OK” .
添加代码 :
修改OnSetCursor 为如下代码:
BOOL CDocTestView:: OnSetCursor ()
{
HCURSOR hCur = LoadCursor( NULL , IDC_CROSS ) ;
::SetCursor(hCur);
return TRUE;
}
机制分析:
系统在设置光标时 ,会发送一个WM_SETCURSOR消息 ,此消息会触发OnSetCursor函数 , 所以 ,可以在这个函数里添加修改光标的代码 。
3:修改方法三
重载CView里的PreCreateWindow函数 .
重载方法 :
“View” -> “ClassWizard” (Ctrl + W) -> 右侧Messages栏选择” PreCreateWindow” , 然后点”Add Function” , 点”OK” .
添加代码 :
在CDocTestView::PreCreateWindow函数里添加如下代码:
cs.lpszClass = AfxRegisterWndClass(CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW,
LoadCursor( NULL , IDC_CROSS ) ,
(HBRUSH) (COLOR_WINDOW + 1));
机制分析:
缺省窗口创建时 , 会以一个结构体WNDCLASS来描述窗体的属性 ,并利用注册机制 ,将此窗口属性注册到系统中 ,利用AfxRegisterWndClass可以改变窗体本身的属性 ,并对它重新注册 。
4:修改方法四
任意函数中修改鼠标形状
理论上利用SetCursor(…)函数 , 应该可以在任何时候,任何地方修改鼠标形状 ,但实际情况却并非如此 , 每次调用OnMouseMove时候(即每次鼠标移动时) , 系统会调用程序默认原来的一个光标来重新绘制鼠标形状 . 所以 , 你如果在其它地方修改光标 , 你会发现这根本不起作用 , 因为每次鼠标一移动 , 它又恢复到原来的形状了 . 这里需要用到另一个API来实现这个功能
SetClassLong() . . .
你可以在任何地方调用下面的代码来修改光标形状:
SetClassLong(this->GetSafeHwnd(),
GCL_HCURSOR ,
(LONG)LoadCursor(NULL , IDC_CROSS));
综合比较:
方法三更加适合于一次性的将默认光标统一替换另一种 ,并不适合于多次频繁替换。
方法一 ,方法二 ,可以实现光标的多次变换 ,但是都需要在函数中添加额外的变量来控制显示为不同的光标 。
方法四是最灵活的一种方式 ,可以在任何时候 ,任何函数里更换鼠标形状 。
附 录
1: LoadStandardCursor使用方法 .
LoadStandardCursor用来载入系统自带的光标 , 调用方式如下:
HCURSOR hCursor = (HCURSOR)AfxGetApp()->LoadStandardCursor(IDC_CROSS);
::SetCursor(hCursor);
2: LoadCursor 使用方法
HCURSOR LoadCursor(HINSTANCE hInstance , // handle to application instance
LPCTSTR lpCursorName); // name or resource identifier
lpCursorName指的是光标的名字 .
hInstance描述的是含有光标的模块句柄 . 这个模块可以是一个可执行文件 , 也可以为空 . 当模块句柄指向一个文件时 , LoadCursor则从这个文件中获取光标 . 当模块句柄为空时 , LoadCursor则从系统中获取光标 .
所以如果你想载入系统自带的光标 , 可以用下面的代码:
HCURSOR hCur = LoadCursor( NULL , IDC_CROSS ) ;
::SetCursor(hCur);
如果想载入资源中自己绘制的光标 , 可以用下面的代码:
HCURSOR hCur = LoadCursor(AfxGetInstanceHandle() ,
MAKEINTRESOURCE(IDC_CURSOR1));
::SetCursor(hCur);
————————————————————————————————————————————————————————————————————————
LoadImage
函数功能:装载图标,光标,或位图。
函数原型:HANDLE LoadImage(NINSTANCE hinst,LPCTSTR lpszName,UINT uType,int cxDesired,int CyDesired,UINT fuLoad);
用法举例:
HCURSOR hCur = (HCURSOR)LoadImage(AfxGetInstanceHandle(),TEXT("c://a.bmp"),IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);
//SetCursor(hCur);
参数:
hinst:包含被装载图像模块的实例句柄。若要装载OEM图像,则设此参数值为0。
lpszName:如果hinst非NULL,而且参数fuLoad不包括LR_LOADFROMFILE时,那么lpszName是一
个保留在hinst模块中的图像资源ID。
如果参数hinst为NULL,并且LR_LOADFROMFILE被指定,那么这个参数是被装载的OEM
的图像标识。
如果参数fuLoad包含LR_LOADFROMFILE值,那么参数lpszName是图像文件路径。
uType:指定被装载图像类型 IMAGE_BITMAP IMAGE_CURSOR IMAGE_ICON 。
cx ,cy:图标或光标的宽度高度,如果参数为0,则fuLoad不设LR_DEFAULTSIZE,那么函数使用
目前的资源高度。
对静态位图来说,参数cx ,cy 为零。
fuLoad:LR_DEFAULTCOLOR:缺省标志;
LR_CREATEDIBSECTION:装载位图时,返回一个DIB部分位图,而不是DDB位图
是装载位图,而不是映射位图到显示设备时用它;
LRDIFAULTSIZE:若装载光标或图标,cxDesired或cyDesired未被设为零,使用它;
LR_LOADFROMFILE:图像来自文件。若未标定,图像来自资源ID;
LR_MONOCHROME:装载黑白图;
LR_SHARED:共享内存,多次调用同一资源时不会再重新装载图像入内存。
注意:当使用完资源后,最好释放加速器表、位图、光标、图标以及菜单所占的内存资源。
加速器表:DesteoyAcceleratorTable;位图:DeleteObject;光标:DestroyCursor;
图标:Destroylcon;菜单:DestroyMenu