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

时间:2018-11-08 09:49:57

标签: c++ c++builder

我想创建一个自定义控件(来自TPanel),其中包含一些TImage。 我想在这些法师中显示PNG(具有透明度)。因此,我尝试通过IDE的“资源和图像”将PNG附加到包中。

问题是,当我将组件放入测试应用程序时,它将在MyPng->LoadFromResourceName行失败并显示“找不到资源”。有趣的是,如果我将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文件中。我用十六进制查看器向内看。

1 个答案:

答案 0 :(得分:1)

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

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