C++ 如何将PNG文件加载到我的自定义组件中?无法获取正确的实例

C++ 如何将PNG文件加载到我的自定义组件中?无法获取正确的实例,c++,c++builder,C++,C++builder,我想创建一个自定义控件(从TPanel)来保存一些时间。 我想在那些法师身上显示PNG(带透明度)。因此,我试图通过IDE的“资源和图像”将PNG附加到包中 问题是,当我将组件放入测试应用程序时,它将在MyPng->loadfromrourcename行中失败,并显示“resource not found”。有趣的是,如果我将PNG作为一种资源添加到测试应用程序中,它就会工作 这意味着组件正在查找PNG资源的错误模块。 我用ShowMessage打印实例,它确实显示“ComponentTeste

我想创建一个自定义控件(从TPanel)来保存一些时间。 我想在那些法师身上显示PNG(带透明度)。因此,我试图通过IDE的“资源和图像”将PNG附加到包中

问题是,当我将组件放入测试应用程序时,它将在
MyPng->loadfromrourcename
行中失败,并显示“resource not found”。有趣的是,如果我将PNG作为一种资源添加到测试应用程序中,它就会工作

这意味着组件正在查找PNG资源的错误模块。
我用ShowMessage打印实例,它确实显示“ComponentTester.exe”

如何获得正确的实例



注:PNG文件编译成生成的RES文件。我用十六进制查看器查看了内部。

唯一有意义的解释是您没有使用运行时软件包。因此,您没有加载包含资源的模块


链接组件资源的正确方法是在声明类型的源文件中使用
$R
指令,在本例中为
TVolumeCtrl
。这样,资源将链接到包含
TVolumeCtrl
实现的任何模块。编译运行时包时,它将是一个包(设计时包在设计时使用),而编译不使用运行时包的可执行文件时,它将是一个可执行文件。

@DavidHeffernan-FindClassHInstance返回“ComponentTester.exe”。ComponentTester不包含该资源。注意:我不会将TVolumeCtrl组件从调色板放到ComponentTester的表单中。我在运行时创建TVolumeCtrl:
新建TVolumeCtrl(this)
。但我认为这与问题无关。在我的tester应用程序中,选中了“与运行时包的链接”。在“设计包”中的“包”中,包含我的组件的BPL也被检查。我让IDE完成所有这些资源编译和链接。但我会尝试手动将其与$R链接,正如您所说。也许IDE的“资源和图像”中有一个bug?我在测试程序运行时用Process Viewer查看了测试程序。事实上,它不会加载我的BPL!因此,该项目被设置为使用BPL作为运行时包,但它没有。IDE的资源和图像功能没有缺陷。这只是做你想做的事情的错误方式。想想看。您已将资源链接到包,但没有使用包。如果您正在使用包,那么
FindClassHInstance
将返回表示包的模块。显然,您正在将包链接到可执行文件中。即使您打算使用运行时包进行链接,您的代码也应该支持两种操作模式:即运行时包和静态链接。exe未使用运行时包。似乎将BPI包添加到“运行时包”列表中是不够的。我还需要将BPI文件添加到项目中(在Proj manager中)。
__fastcall TVolumeCtrl::TVolumeCtrl(TComponent* Owner)
   : TPanel(Owner)
{
    HINST h = FindClassHInstance(__classid(TVolumeCtrl));
    ShowMessage(GetModuleName(h));

    TPngImage *Png3 = new TPngImage();
    MyPng->LoadFromResourceName(h, "Btn1");