创建带声音的 VCL 按钮组件
Create a VCL Button Component with sound
我正在尝试创建一个自定义 VCL 组件,它可以在单击时播放自定义声音。从资源 DLL 访问声音。
问题是,声音是使用 Direct X 播放的,要创建它需要一个有效的 window 句柄。
我天真的初始测试是在组件构造函数中初始化声音:
__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 变量可能不安全(?)。
关于在哪里初始化声音的任何指示?
为什么不直接使用按钮自己的 HWND
呢? TBitBtn
是一个 windowed 控件。它的 HWND
在构造函数中不可用,但您可以(并且应该)覆盖按钮的虚拟 CreateWnd()
方法来创建 DirectX 对象,并覆盖虚拟 DestroyWnd()
方法来释放它。这样,您还可以考虑 window 按钮生命周期内的娱乐活动。
我正在尝试创建一个自定义 VCL 组件,它可以在单击时播放自定义声音。从资源 DLL 访问声音。
问题是,声音是使用 Direct X 播放的,要创建它需要一个有效的 window 句柄。
我天真的初始测试是在组件构造函数中初始化声音:
__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 变量可能不安全(?)。
关于在哪里初始化声音的任何指示?
为什么不直接使用按钮自己的 HWND
呢? TBitBtn
是一个 windowed 控件。它的 HWND
在构造函数中不可用,但您可以(并且应该)覆盖按钮的虚拟 CreateWnd()
方法来创建 DirectX 对象,并覆盖虚拟 DestroyWnd()
方法来释放它。这样,您还可以考虑 window 按钮生命周期内的娱乐活动。