我可以找到几种方法在win32中创建游标,但我需要第三种,我找不到的那种。
我能找到的第一个是使用LoadXXX()来打开文件或资源并以这种方式加载光标。
我能找到的第二个是使用CreateCursor来获取热点,一些数据数组,并使其成为一个比特。
我希望第二种方式介于两者之间:我有一个包含.cur文件数据的字节数组。我想用这些数据来制作光标。可以这样做吗?
答案 0 :(得分:3)
正如我在评论中简要介绍的那样,我认为最简单,最明智的方法是将存储在数组中的二进制数据写入磁盘上的临时.CUR文件,然后使用LoadCursorFromFile
function阅读.CUR文件。然后,您可以删除临时文件。没有理由去寻找复杂的解决方案,当更简单的解决方案时。
话虽这么说,如果你真的需要一种方法来做这件事,你可能会考虑做一些类似于.NET Framework团队从内存流加载游标对象的做法。这利用了similarity between cursors and icons。
使用OleCreatePictureIndirect
function创建一个新的未初始化的IPicture
对象,然后通过IPersistStream::Load
method从内存中的字节数组初始化。完成后,只需使用CopyImage
function从加载的图像中创建光标。
答案 1 :(得分:2)
CreateCursor()的参数在这里:http://msdn.microsoft.com/en-us/library/ms648385(VS.85).aspx
HCURSOR WINAPI CreateCursor(
__in_opt HINSTANCE hInst,
__in int xHotSpot,
__in int yHotSpot,
__in int nWidth,
__in int nHeight,
__in const VOID *pvANDPlane,
__in const VOID *pvXORPlane
);
.cur文件格式在维基百科上记录:http://en.wikipedia.org/wiki/ICO_(file_format)#Legacy_format
您可以从该图标文件头中获取CreateCursor()的所有参数;我认为指向图像数据的指针可能有一个位图和平面,后面跟着xor平面的位图。
答案 2 :(得分:1)
在寻找答案的同时,我偶然发现CreateIconIndirect,它“为ICONINFO结构创建图标或光标”,为光标图像指定了位图句柄(HBITMAP)(因此您可以使用Win32 API位图例程准备光标):
https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-createiconindirect
HICON CreateIconIndirect(
PICONINFO piconinfo
);
尽管其返回类型为HICON,但文档说它返回了图标或光标。
ICONINFO结构具有一个布尔fIcon成员,以确定它是图标(TRUE)还是光标(FALSE):
typedef struct _ICONINFO {
BOOL fIcon;
DWORD xHotspot;
DWORD yHotspot;
HBITMAP hbmMask;
HBITMAP hbmColor;
} ICONINFO;
我尚未在程序中使用此功能,并意识到这是一个非常老的问题,但希望它将指出其他尝试朝正确方向进行操作的人。
答案 3 :(得分:-3)
无法完成。最好不要浪费时间尝试。我只是试图避免将一堆.cur文件转换为合理的库支持的东西。以为我会为QCursor使用HCURSOR构造函数,我可以,但是当我可以使用PNG文件或其他东西时,尝试解决更糟糕的可想象的API是不值得的。