从.cur格式字节创建游标?

时间:2011-01-12 00:35:04

标签: c++ c winapi cursor

我可以找到几种方法在win32中创建游标,但我需要第三种,我找不到的那种。

我能找到的第一个是使用LoadXXX()来打开文件或资源并以这种方式加载光标。

我能找到的第二个是使用CreateCursor来获取热点,一些数据数组,并使其成为一个比特。

我希望第二种方式介于两者之间:我有一个包含.cur文件数据的字节数组。我想用这些数据来制作光标。可以这样做吗?

4 个答案:

答案 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是不值得的。