创建一个有声音的 VCL 按钮组件

Posted

技术标签:

【中文标题】创建一个有声音的 VCL 按钮组件【英文标题】:Create a VCL Button Component with sound 【发布时间】:2016-08-26 16:31:20 【问题描述】:

我正在尝试创建一个自定义 VCL 组件,该组件可以在单击时播放自定义声音。声音是从资源 DLL 访问的。

问题是,声音是使用 Direct X 播放的,并且要创建它需要一个有效的窗口句柄。

我天真的初始测试是在组件构造函数中初始化声音:

__fastcall TArrayBotButton::TArrayBotButton(TComponent* Owner)
    : TBitBtn(Owner),
    FSoundID("BUTTON_CLICK_1")

initABCoreLib();
HWND hWnd = Application->MainFormHandle;
mSound.Create(FSoundID.c_str(), hWnd);

但上述方法不起作用,因为此时 MainFormHandle 为 NULL。另外,作为一个组件,在构造函数中使用 Application 变量可能是不安全的(?)。

关于在哪里初始化声音的任何指针?

【问题讨论】:

【参考方案1】:

为什么不直接使用按钮自己的HWND 呢? TBitBtn 是一个窗口控件。它的HWND 在构造函数中不可用,但您可以(并且应该)覆盖按钮的虚拟CreateWnd() 方法来创建DirectX 对象,并覆盖虚拟DestroyWnd() 方法来释放它。这样,您还可以在按钮的生命周期内重新考虑窗口。

【讨论】:

工作完美,让一切变得更简单。

以上是关于创建一个有声音的 VCL 按钮组件的主要内容,如果未能解决你的问题,请参考以下文章

VCL 和 FMX 组件如何同名?

在 Delphi VCL 中通过组合两个控件(TEdit 和 TTrackBar)创建一个新组件

delphi VCL组件同名继承

Delphi 是不是有任何“思维导图”组件? (最好是原生 VCL)[关闭]

用于Delphi的DevExpress VCL组件——富文本编辑功能升级

寻找非矩形面板 VCL 组件 [关闭]