如何将 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
实现的任何模块。当您编译运行时包(由设计时包在设计时使用)时,它将成为一个包,当您编译不使用运行时包的可执行文件时,它将成为可执行文件。
我想创建一个包含一些 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
实现的任何模块。当您编译运行时包(由设计时包在设计时使用)时,它将成为一个包,当您编译不使用运行时包的可执行文件时,它将成为可执行文件。