我想创建一个自定义控件(来自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文件中。我用十六进制查看器向内看。
答案 0 :(得分:1)
唯一有意义的解释是您没有使用运行时包。因此,您不会加载包含资源的模块。
链接组件资源的正确方法是在源文件中使用声明类型$R
的{{1}}指令。这样,资源将链接到包含TVolumeCtrl
实现的任何模块。在编译运行时程序包(在设计时由designtime程序包使用)时,它将成为一个程序包,而在编译不使用运行时程序包的可执行文件时,它将成为可执行文件。