0

我在 QT 编译器中遇到了一个错误,但是它在 VS2010 上运行良好。该错误表明我已经看到与相同错误相关的其他帖子,但未解决我在 QT 中的问题。我尝试了 _T,L 或 TEXT 但仍然无法正常工作

bq。错误:C2664:'HANDLE LoadImageW(HINSTANCE,LPCWSTR,UINT,int,int,UINT)':无法将参数 2 从 'const char *' 转换为 'LPCWSTR' 指向的类型不相关;转换需要 reinterpret_cast、C-style cast 或 function-style cast

我的代码如下

Bitmap::Bitmap(std::string const& file_name) {
bitmap_ = static_cast<HBITMAP>(::LoadImage(0, file_name.c_str(), IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION));
}

如果您有解决此问题的任何想法,请分享

4

2 回答 2

3

Qt 不包含编译器。在 Windows 上,您可能正在使用 mingw 或 Visual C++ 进行编译。无论哪种方式,问题在于您正在调用一个需要宽字符串的函数,但您试图将其传递给一个 8 位字符串。

出于兼容性原因,如果您定义了 _UNICODE,Win32 将使用一组不同的 API 函数。在您的情况下,您确实定义了 _UNICODE。您可以继续使用 8 位 std::string,但只需将方法从LoadImage() 更改为 LoadImageA()。或者,如果您不介意更改 Bitmap 类,您可以从 std::string 切换到 std::wstring 以利用 Windows 的 Unicode 功能。

但也许更大的问题是,如果您使用 Qt,为什么要使用 Win32 来加载位图和 std::string?Qt 的QImage 类QString 类提供了一个全功能的、跨平台的字符串和图像加载器。像任何综合框架一样,如果您只根据需要使用外部功能,Qt 效果最好。

于 2014-09-24T06:15:11.830 回答
0

我不确定这种方法是否是最好的,但我已经在我的项目中使用它们并且效果很好,请参阅:

char *source = "Hello world";
WCHAR target[size];
MultiByteToWideChar(CP_ACP, 0, source, -1, target, size);
LPCWSTR final = target;

MessageBox(0, final, TEXT("title"), 0); //Sample usage
于 2014-09-24T06:20:31.413 回答