我正在尝试创建一个自定义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变量在构造函数(?)中可能不安全。
有关初始化声音的位置的指示?
答案 0 :(得分:2)
为什么不直接使用按钮自己的HWND
? TBitBtn
是一个窗口控件。它的HWND
在构造函数中不可用,但您可以(并且应该)覆盖按钮的虚拟CreateWnd()
方法来创建DirectX对象,并覆盖虚拟DestroyWnd()
方法以释放它。这样,您还可以在按钮的生命周期内考虑窗口重新创建。