首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++:正确使用LoadImage和SetCursor函数

C++:正确使用LoadImage和SetCursor函数
EN

Stack Overflow用户
提问于 2016-07-03 09:59:28
回答 2查看 1.6K关注 0票数 0

我正在尝试编写一个快速而简单的C++程序,将光标图标更改为目录中的自定义图像。Windows开发人员中心似乎有some fairly straightforward documentation on how to do this in C++,我从那里得到了下面的代码:

代码语言:javascript
复制
#include <iostream>
#include <chrono>
#include <thread>
#include <Windows.h>

using namespace std;

int main(int argc, char** argv)
{
    //HINSTANCE hInst = GetModuleHandle(NULL);
    HINSTANCE hInst = NULL;
    HCURSOR cursor = (HCURSOR)LoadImage(hInst, "Image.bmp", IMAGE_BITMAP,
                     32, 32, LR_LOADFROMFILE); //Also tried LR_SHARED
    cout << "Initializing\n";
    Sleep(1500);
    SetCursor(cursor);
    //Also tried SetSystemCursor(cursor, 32512);
    cout << "Setting cursor\n";
    Sleep(1500);
    DestroyCursor(cursor);
    cout << "Restoring cursor\n";   
    Sleep(2000);
    return 0;
}

程序应该将光标更改为位图图像,然后将其更改回来,然后退出。当我运行它时,消息被打印出来,但是光标并没有像它应该的那样改变。我不能完全确定我的问题出在LoadImage函数、SetCursor函数还是其他什么地方。我为LoadImage函数的HINSTANCE参数尝试了各种类型的HINSTANCE,为LoadImage函数的最后一个参数尝试了不同的标志,我还尝试使用SetSystemCursor函数而不是SetCursor函数。

我所要做的就是改变鼠标光标的图像。这看起来应该很简单,但事实证明它比我想象的要复杂得多。我的目的是将这段代码导出为DLL,以便与我正在使用的Java项目的Java Native Interface一起使用,因为JVM不能在程序窗口之外更改光标。

我搜索了所有地方,在这里看到了一些稍微类似的问题,但没有一个能正确地解决我遇到的问题。我见过一些人提到我需要调用SetCursor函数来响应WM_SETCURSOR消息,但我不太确定这是什么意思(我没有太多的C++经验,所以请耐心等待)。我希望你们能帮助我。谢谢。

EN

回答 2

Stack Overflow用户

发布于 2019-03-11 17:08:07

您的代码似乎存在一些问题。但是,LoadCursorFromFile指出,您正在尝试加载.bmp

文件中的数据必须为.CUR或.ANI格式

虽然这可能不是严格意义上的LoadImage,因为我已经能够将.ico加载到游标中,但我不认为您可以加载.bmp

试试像这样的东西

代码语言:javascript
复制
const HCURSOR customCursor = static_cast<HCURSOR>(LoadImage(nullptr, L"Cursor.cur", IMAGE_CURSOR, 0, 0, LR_LOADFROMFILE));

另外,我认为SetCursor只适用于带有窗口的C++桌面应用程序。但是,您可以使用SetSystemCursor替换系统游标。

代码语言:javascript
复制
#define OEMRESOURCE
#include <windows.h>
#include <chrono>
#include <thread>

void SetAllSystemCursorsToCursor(HCURSOR cursor)
{
    //Need to copy the cursor each time as SetSystemCursor consumes the cursor
    HCURSOR cursorCopy = CopyCursor(cursor);
    SetSystemCursor(cursorCopy, OCR_APPSTARTING);

    cursorCopy = CopyCursor(cursor);
    SetSystemCursor(cursorCopy, OCR_NORMAL);

    cursorCopy = CopyCursor(cursor);
    SetSystemCursor(cursorCopy, OCR_CROSS);

    cursorCopy = CopyCursor(cursor);
    SetSystemCursor(cursorCopy, OCR_HAND);

    cursorCopy = CopyCursor(cursor);
    SetSystemCursor(cursorCopy, OCR_IBEAM);

    cursorCopy = CopyCursor(cursor);
    SetSystemCursor(cursorCopy, OCR_NO);

    cursorCopy = CopyCursor(cursor);
    SetSystemCursor(cursorCopy, OCR_SIZEALL);

    cursorCopy = CopyCursor(cursor);
    SetSystemCursor(cursorCopy, OCR_SIZENESW);

    cursorCopy = CopyCursor(cursor);
    SetSystemCursor(cursorCopy, OCR_SIZENS);

    cursorCopy = CopyCursor(cursor);
    SetSystemCursor(cursorCopy, OCR_SIZENWSE);

    cursorCopy = CopyCursor(cursor);
    SetSystemCursor(cursorCopy, OCR_SIZEWE);

    cursorCopy = CopyCursor(cursor);
    SetSystemCursor(cursorCopy, OCR_UP);

    cursorCopy = CopyCursor(cursor);
    SetSystemCursor(cursorCopy, OCR_WAIT);
}

int main()
{
    //Load cursor
    const HCURSOR customCursor = LoadCursorFromFile(L"Cursor.cur");

    //Replace all system cursors with loaded cursor
    SetAllSystemCursorsToCursor(customCursor);

    //Sleep the current thread to allow the user to play with new cursor
    std::this_thread::sleep_for(std::chrono::milliseconds(5000));

    //Restore original system cursors
    SystemParametersInfo(SPI_SETCURSORS, 0, nullptr, 0);
}
票数 2
EN

Stack Overflow用户

发布于 2017-07-25 22:56:20

我不认为你可以在控制台窗口上改变光标。如果你弹出一个对话框,我想光标会改变。在Windows的控制台窗口中,我从未见过光标发生变化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38166076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档