调用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说明在

    CreateCursor | Microsoft Docs

以上是关于调用Win32 API 之CreateCursor函数失败的主要内容,如果未能解决你的问题,请参考以下文章

python可以直接调用win32的api吗

如何从 PHP 进行 Win32 API 调用?

WPF 精修篇 调用Win32Api

python可以直接调用win32的api吗

C#调用Win32 api学习总结

python可以直接调用win32的api吗