如何在我的自定义组件中包含位图(如果可能的话)?

4

我正在编写一个组件(一个按钮),需要在其上显示位图。我不想创建一个ImageList属性,让用户去指定一张图片。我希望这个按钮只能显示我选择的图片。

我尝试将位图包含在资源文件中,但是当我尝试访问它时,出现“未找到资源”的错误消息。这是我所做的:

myres.rc

FIXED BMP "fixed.bmp"

我使用以下命令编译资源文件:brcc32 myres.rc

然后将其包含在我的组件单元中...

implementation
{$R .\resources\myres.res}

并使用以下方式访问...

MyComponent.Glyph.LoadFromResourceName(HInstance,'FIXED');
// MyComponent = class(TSpeedButton)

编辑1: 我删除了 {$R .\resources\myres.res} 指令并从菜单 项目 -> 资源 加载资源,它在使用 HInstance 或 FindClassHInstance(MyComponent) 时能够正常工作。

使用资源编辑器,我发现当我从菜单加载资源时,资源的名称显示为“FIXED”,这是正确的;但是当我使用 brcc32 编译后加载资源时,其名称显示为“0”。看起来 brcc32 没有正确地设置名称。

但我不想从菜单加载它,我希望它能够随组件一起自动加载。

编辑2: Remy Lebeau 是正确的。我使用了错误的 BMP 格式(文件以 'BM6' 字符开始而不是像 Photoshop 生成的 'BM8'),更改后就可以正常工作了。


请参见:https://dev59.com/5HM_5IYBdhLWcg3w9oMA - Gabriel
1个回答

10

在您的RC文件中将BMP更改为BITMAP,并在您的代码中将HInstance更改为FindClassHInstance()

FIXED BITMAP "fixed.bmp"

Glyph.LoadFromResourceName(FindClassHInstance(MyComponent), 'FIXED');

1
在我编写的每个使用自定义位图的组件中,这对我来说都很好用。并且你需要使用FindClassHInstance()而不是HInstance,以便无论使用你的组件的项目是否启用了运行时包,都可以正确地找到你的组件资源。HInstance并不总是指向你的组件包,但FindClassHInstance()将始终返回适当的实例句柄以供你的组件包使用。 - Remy Lebeau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接