调用Win32 API 之CreateCursor函数失败
Posted bcbobo21cn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了调用Win32 API 之CreateCursor函数失败相关的知识,希望对你有一定的参考价值。
Win SDK文档,函数说明如下,
CreateCursor
CreateCursor该函数创建一个指定大小、位模式和热点的光标。
函数原型:HCURSOR CreateCursor(HINSTANCE htnst,int xHotSpot;int yHotSpot;int nWidth;int nHeight,CONST VOID *pvANDPlane,CONST VOID *pvXORPlane);
参数说明
hlnst:创建光标的应用程序的当前实例句柄。
xHotSpot:指定光标热点的水平位置。
yHotSpot:指定光标热点的垂直位置。
nWidth:以像素为单位指定光标的宽度。
nHeight:以像素为单位指定光标的高度。
pvANDPlane:指向一个字节数组的指针,该数组包含光标AND掩码的位值,就象设备相关的单色位图一样。
pvXORPlane:指向一个字节数组的指针,该数组包含光标XOR掩码的位值,就象设备相关的单色位图一样。
返回值:如果成功,返回光标的值;如果失败,返回值为NULL(空),若想获得更多错误信息,调用GetLastError函数。
备注:nWidth和nHeight参数必须指定一个当前显示驱动支持的宽度和高度,因为系统不能创建一个其他尺寸的光标,为了确定显示驱动所支持的宽度和高度,请使用GetSystemMetrics函数,指定SM_CXCUROR或SM_CYCURSOR值。在一个应用程序关闭之前,必须调用DestroyCursor函数来释放与光标有关的任何系统资源。
速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:不支持;头文件:winuser.h;库文件:user32.lib。
功能是直接使用函数来创建光标;下面来看一下;
VC6新建一个单文档工程;添加一个菜单;在菜单单击处理函数中编写调用代码;
void CCurView::OnMenuitem32771()
{
// TODO: Add your command handler code here
CString str1;
int* pCursorBuffer = (int *)malloc(132*132*4);
for (int i=0;i<132*132; i++)
{
pCursorBuffer[i] = 0x80ff0000;
}
HCURSOR hcursor = CreateCursor(AfxGetInstanceHandle(), 0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN),pCursorBuffer,pCursorBuffer);
str1.Format("%0x",hcursor);
AfxMessageBox(str1);
SetCursor(hcursor);
}
如上代码段;尝试如下情况;
第一个参数,取NULL,或调用AfxGetInstanceHandle()返回当前应用程序实例句柄;
第2、3个参数是开始x、y坐标;
第4、5个参数,光标大小;输入固定数值,或者调用GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN) 返回系统支持的值;
第6、7个参数,根据说明是字节数组指针;内容为光标AND掩码、XOR掩码的位值;上面pCursorBuffer相关赋值代码来自网上,我还不清楚含义;或尝试此2参数直接输入NULL;
以上情况,程序均挂掉或无任何输出;
为了看是否创建成功,使用
str1.Format("%0x",hcursor);
AfxMessageBox(str1);
来弹出返回句柄的值;均不会执行到此而弹出消息框;
关于第一个参数应用程序实例句柄,根据资料VC++有三种方法获取,
1.AfxGetInstanceHandle():用这个函数可以直接获得应用程序的实例句柄
2.theApp.m_hInstance:利用全局的实例对象theApp的成员变量m_hInstance来获得
3.AfxGetApp()->m_hInstance:利用AfxGetApp()获得当前应用程序实例的一个指针
主要是最后2个参数不知道如何定义;尝试随便定义2个字节数组,
byte buf1[]= {0x0,0x1,0x0,0x1,0x0,0x1,0x0,0x1};
byte buf2[]= {0x0,0x1,0x0,0x1,0x0,0x1,0x0,0x1};
数组指针赋给最后2个参数;结果还是一样;有时间再继续;
函数的MSDN说明在
以上是关于调用Win32 API 之CreateCursor函数失败的主要内容,如果未能解决你的问题,请参考以下文章