C++ GDI+ Image类:如何访问在类'Gdipus::Image'中声明的私有成员C2248

gajydyqb  于 2023-05-08  发布在  其他
关注(0)|答案(3)|浏览(199)

我试图读取我的PNG图像文件来创建一个精灵。我使用以下代码来阅读和绘制图像:

wchar_t filename = L'bunny.png';
wchar_t* path2 = &filename;

Image image = Image(path2, false);

Image* pImage = ℑ

Graphics graphics(pImage);

graphics.DrawImage(pImage, 10, 60);

但是编译器告诉我:
错误C2248。'Gdiplus::Image::Image':无法访问类“Gdiplus::Image”中声明的私有成员
我尝试使用Image类的公共部分的构造函数,但它被识别为私有部分的构造函数。

Image image = Image(IN path2, false);

有没有人能给我看一段能在这种情况下工作的代码?

fafcakar

fafcakar1#

看起来重载解析正在接管这里,因为您没有向构造函数提供正确的类型。值得注意的是,false不是BOOL类型。类型为bool。您应该使用FALSE
虽然BOOL是整数类型,而bool可以隐式转换为int,但这可能足以混淆编译器。重载解析系统可能会在尝试转换bool之前优先选择具有更好匹配签名的私有构造函数。
你实际需要的构造函数是:

Image(
    IN const WCHAR* filename,
    IN BOOL useEmbeddedColorManagement = FALSE
);

因此,您可以简单地这样做(注意第二个参数已经默认为FALSE):

Image image(L"bunny.png");

如果你想把路径存储在一个变量中,在评论部分已经指出了你做错了。您尝试使用多值字符文字,然后将其视为以NULL结尾的字符串。这是非常不正确的。
相反,使用const WCHAR*或简称LPCWSTR

LPCWSTR path = L"bunny.png";
Image image(path);
6ojccjat

6ojccjat2#

您遇到的错误是由于Gdiplus::Image类构造函数的使用不正确。构造函数需要一个指向const WCHAR的指针作为第一个参数,但您提供的是一个指向单个wchar_t的指针。此外,构造函数中没有第二个参数。
下面是正确的代码:

#include <Windows.h>
#include <gdiplus.h>
using namespace Gdiplus;

int main() {
    GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR gdiplusToken;
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

    const WCHAR* filename = L"bunny.png"; // use a const WCHAR pointer

    Image image(filename); // no second parameter

    // Continue with the rest of your drawing code

    GdiplusShutdown(gdiplusToken);
    return 0;
}

请注意,您应该在使用Gdiplus之前对其进行初始化,并在完成后将其关闭。

jrcvhitl

jrcvhitl3#

该错误是因为您正在创建临时Image并将其复制到另一个Image。复制构造函数是私有的,因为Image不能被复制。
你必须使用C17之前的编译器,因为C17和更高版本已经为你消除了临时编译器。所以,你将不得不简单地摆脱它自己,即改变这:

Image image = Image(path2, false);

改为:

Image image(path2, false);
// or: Image image(path2);

另外,您的filenamepath变量设置错误。它们应该更像这样:

const wchar_t* filename = L"bunny.png";
wchar_t* path2 = filename;

最后,你不需要那么多冗余的局部变量:

Image image(L"bunny.png");
Graphics graphics(&image);
graphics.DrawImage(&image, 10, 60);

话虽如此,你为什么要在自己身上画一个PNG?您在评论中提到您不知道如何将Graphic对象链接到窗口。Graphic的构造函数接受HWNDHDC作为输出。它也有静态FromHWND()FromHDC()方法。

相关问题