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

How to load PNG file into my custom component? Cannot get correct instance

我想创建一个包含一些 TImage 的自定义控件(来自 TPanel)。 我想在这些法师中显示 PNG(透明)。因此,我正在尝试通过 IDE 的 "Resource and Images" 将 PNG 附加到包中。

问题是,当我将组件放入测试应用程序时,它将在 MyPng->LoadFromResourceName 行 "resource not found" 上失败。有趣的是,如果我将 PNG 作为资源添加到测试应用程序,它将起作用。

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

__fastcall TVolumeCtrl::TVolumeCtrl(TComponent* Owner)
   : TPanel(Owner)
{
    HINST h = FindClassHInstance(__classid(TVolumeCtrl));
    ShowMessage(GetModuleName(h));

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

如何获取正确的实例?


注意:PNG文件被编译成生成的RES文件。我用十六进制查看器查看了里面。

唯一合理的解释是您没有使用运行时包。所以你没有加载包含资源的模块。

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