正确使用LoadImage和SetCursor函数
C++: Properly using the LoadImage and SetCursor functions
我正在尝试编写一个快速而简单的c++程序,将光标图标从目录更改为自定义图像。Windows开发中心似乎有一些关于如何在c++中做到这一点的相当简单的文档,从中我想出了这段代码:
#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 << "Initializingn";
Sleep(1500);
SetCursor(cursor);
//Also tried SetSystemCursor(cursor, 32512);
cout << "Setting cursorn";
Sleep(1500);
DestroyCursor(cursor);
cout << "Restoring cursorn";
Sleep(2000);
return 0;
}
程序应将光标更改为位图图像,然后将其更改回来,然后退出。当我运行它时,消息被打印出来,但是光标没有像它应该的那样改变。我不完全确定我的问题是否在于LoadImage函数,SetCursor函数,还是其他东西。我已经尝试了各种类型的HINSTANCEs的HINSTANCE参数的LoadImage函数,我已经尝试了不同的标志为LoadImage函数的最后一个参数,我也尝试使用SetSystemCursor函数而不是SetCursor函数。
我要做的就是改变鼠标光标的图像。这看起来应该很简单,但结果比我想象的要复杂得多。我的意图是将此代码导出为DLL,以便与我正在使用的Java项目的Java本机接口一起使用,因为JVM不能在程序窗口外更改光标。
我已经搜索了所有的地方,在这里看到一些稍微类似的问题,但没有一个适当地解决了我的问题。我看到一些人提到我需要调用SetCursor函数来响应WM_SETCURSOR消息,但我不太确定他们的意思(我没有太多的c++经验,所以请原谅我)。我希望你们能帮我。谢谢。
您的代码似乎有一些问题。您正在尝试加载.bmp
,然而,LoadCursorFromFile状态
文件中的数据必须是。cur或。ani格式
虽然这可能不是严格正确的LoadImage
,因为我已经能够将.ico
加载到游标中,我不认为你可以加载.bmp
。
试试
const HCURSOR customCursor = static_cast<HCURSOR>(LoadImage(nullptr, L"Cursor.cur", IMAGE_CURSOR, 0, 0, LR_LOADFROMFILE));
另外,我相信SetCursor
只适用于带有窗口的c++桌面应用程序。但是,您可以使用SetSystemCursor来替换系统游标。
#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);
}
我不认为你可以改变控制台窗口上的光标。如果你弹出一个对话框,我想光标就会改变。
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- 如何在c++中为模板函数实例创建快捷方式
- 正确使用LoadImage和SetCursor函数