我正在尝试为Winamp输入插件编写一个包装器并且遇到了一些障碍。我希望我的包装器能够显示插件的配置对话框,通过调用插件的Config(HWND hwndParent)函数来实现(或应该)。
对于大多数插件,这很好用,我的程序能够显示插件的配置对话框。但是,64th Note(播放USF文件的插件)给了我一些问题。 Winamp可以很好地显示其配置对话框,但每当我尝试从我的包装器中显示它时,对话框会在它显示之前被销毁。值得庆幸的是,64th Note是开源的,所以我看看它的内部,试着了解出了什么问题。我已经删除了不相关的部分,并留下了这个:
插件中的配置功能(应显示配置对话框):
void Config(HWND hwndParent) {
DialogBox(slave, (const char *) IDD_CONFIG_WINDOW, NULL, configDlgProc);
}
(Slave是插件DLL的HINSTANCE句柄。)对话框的proc如下(我已经删除了所有功能,因为它似乎没有对这个问题产生影响):
BOOL CALLBACK configDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {
return 0;
}
IDD_CONFIG_WINDOW的模板如下:
IDD_CONFIG_WINDOW DIALOGEX 0, 0, 269, 149
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "64th Note configuration"
FONT 8, "MS Sans Serif", 0, 0, 0x0
BEGIN
DEFPUSHBUTTON "OK",IDOK,212,38,50,14
CONTROL "Play Forever",IDC_NOLENGTH,"Button",BS_AUTORADIOBUTTON,7,7,55,8
CONTROL "Always Use Default Length",IDC_SETLEN,"Button",BS_AUTORADIOBUTTON,7,17,101,8
CONTROL "Default Length",IDC_DEFLEN,"Button",BS_AUTORADIOBUTTON,7,29,63,8
EDITTEXT IDC_DEFLENVAL,71,28,38,12,ES_AUTOHSCROLL
EDITTEXT IDC_DEFFADEVAL,71,42,38,12,ES_AUTOHSCROLL
CONTROL "Detect Silence",IDC_DETSIL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,56,63,8
EDITTEXT IDC_DETSILVAL,71,56,38,12,ES_AUTOHSCROLL
CONTROL "Slider2",IDC_PRISLIDER,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,74,90,108,11
EDITTEXT IDC_TITLEFMT,7,127,255,15,ES_AUTOHSCROLL
CONTROL "Default to file name on missing field",IDC_FNONMISSINGTAG,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,50,114,124,8
CONTROL "Use Recompiler CPU",IDC_RECOMPILER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,145,7,83,8
CONTROL "Round Frequency",IDC_ROUNDFREQ,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,145,16,73,8
CONTROL "Seek Backwards",IDC_BACKWARDS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,145,26,70,8
CONTROL "Fast Seek",IDC_FASTSEEK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,145,35,48,8
CONTROL "RSP Sections",IDC_SECTIONS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,145,45,60,8
CONTROL "Soft Amplify",IDC_SOFTAMP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,145,54,53,8
CONTROL "Audio HLE",IDC_AUDIOHLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,145,63,50,8
CONTROL "Auto Audio HLE",IDC_AUTOAUDIOHLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,145,72,64,8
CONTROL "Display Errors",IDC_DISPERROR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,145,81,58,8
EDITTEXT IDC_RELVOL,211,104,28,12,ES_AUTOHSCROLL
PUSHBUTTON "Cancel",IDCANCEL,212,54,50,14
PUSHBUTTON "Help",IDHELPBUTTON,212,71,50,14
LTEXT "Title format:",IDC_STATIC,7,113,38,8
LTEXT "seconds",IDC_STATIC,112,29,28,8
LTEXT "Default Fade",IDC_STATIC,19,43,42,8
LTEXT "seconds",IDC_STATIC,112,43,28,8
LTEXT "seconds",IDC_STATIC,112,57,28,8
CTEXT "CPU Thread Priority",IDC_STATIC,7,91,63,8
CTEXT "Look ma, I'm data!",IDC_CPUPRI,75,104,108,8
LTEXT "Relative Volume",IDC_STATIC,199,94,52,8
LTEXT "Fade Type",IDC_STATIC,7,75,35,8
COMBOBOX IDC_FADETYPE,45,72,87,74,CBS_DROPDOWNLIST | WS_TABSTOP
END
当然,在proc函数中没有任何实质内容,该对话框没有任何功能,但在调用Config函数时它仍然显示在Winamp中。但是,当我从包装器程序中调用它时,它不会出现。当我在proc函数中监视发送到对话框的消息时,我看到WM_DESTROY和WM_NCDESTROY是在前几条消息中发送的,虽然我不知道为什么。
如果我更改Config功能以显示插件的About对话框而不是其配置对话框,则Winamp 和我的包装器将显示About对话框,建议配置对话框模板有一些独特的东西导致问题。修改后的Config函数如下所示:
void Config(HWND hwndParent) {
DialogBox(slave, (const char *) IDD_ABOUTBOX, NULL, configDlgProc);
}
“关于”对话框的模板如下:
IDD_ABOUTBOX DIALOGEX 0, 0, 152, 151
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "About 64th Note"
FONT 8, "MS Sans Serif", 0, 0, 0x1
BEGIN
LTEXT "64th Note v1.2 beta 3\nBased on Project 64 1.6 by Zilmar and Jabo\nAudio HLE by Azimer\nPSF concept and tagging by Neill Corlett\nPlayer by hcs, Josh W, dr0\nhttp://hcs64.com/usf",IDC_STATIC,7,94,138,50
CONTROL 110,IDC_STATIC,"Static",SS_BITMAP,26,7,95,86,WS_EX_DLGMODALFRAME
END
就像我说的那样,我的包装器就像Winamp一样显示了About对话框。为什么Winamp可以显示Config对话框,而我的包装器不能?
答案 0 :(得分:2)
也许你还没有注册Trackbar控件的WNDCLASS?您必须先加载公共控件DLL,然后才能实例化它。
我特意看这一行:
CONTROL "Slider2",IDC_PRISLIDER,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,74,90,108,11
编辑:您需要在程序启动期间与comctl32.lib链接并调用InitCommonControlsEx。