Почему моя программа не может отобразить это диалоговое окно, а другая программа может? - PullRequest
2 голосов
/ 22 марта 2010

Я пытаюсь написать оболочку для входных плагинов Winamp и наткнулся на небольшую загадку.Я бы хотел, чтобы моя оболочка могла отображать диалоговое окно конфигурации плагина, которое (или должно быть) достигается путем вызова функции плагина Config (HWND hwndParent).

Для большинства плагинов, это работает нормально, и моя программа может отображать диалог конфигурации плагина.Однако 64th Note (плагин для воспроизведения файлов USF) вызывает у меня проблемы.Winamp может отобразить свое диалоговое окно конфигурации просто отлично, но всякий раз, когда я пытаюсь отобразить его из своей обертки, диалоговое окно уничтожается до того, как оно само себя покажет.К счастью, 64th Note является открытым исходным кодом, поэтому я взглянул на его внутренности, чтобы попытаться понять, что происходит не так.Я обрезал нерелевантные биты и у меня осталось следующее:

Функция конфигурации в плагине (должен отображаться диалог конфигурации):

void Config(HWND hwndParent) {
    DialogBox(slave, (const char *) IDD_CONFIG_WINDOW, NULL, configDlgProc);
}

(Slave - это дескриптор HINSTANCE DLL плагина.) Процедура для диалогового окна выглядит следующим образом (я удалил всю функциональность, поскольку она, похоже, не влияет на эту проблему):

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 диалоговое окно не имеет никакой функциональности, но оно по-прежнему отображается в Winamp при вызове функции Config.Тем не менее, он не появляется, когда я вызываю его из моей программы-оболочки.Когда я наблюдал за сообщениями, отправляемыми в диалог в его функции proc, я видел, что WM_DESTROY и WM_NCDESTROY были отправлены в течение первых нескольких сообщений, хотя я понятия не имею, почему.

Если я изменю функцию Config так,что он отображает диалоговое окно «О программе» плагина, а не диалоговое окно конфигурации, и Winamp и my wrapper будут отображать диалоговое окно «О программе», которое предполагает наличие чего-то уникального в шаблоне диалога конфигурации, вызывающегоэта проблема.Измененная функция Config выглядит следующим образом:

void Config(HWND hwndParent) {
    DialogBox(slave, (const char *) IDD_ABOUTBOX, NULL, configDlgProc);
}

Шаблон для диалогового окна About выглядит следующим образом:

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

Как я уже сказал, моя оболочка отображает диалоговое окно About просто так, какделает Winamp.Почему Winamp может отображать диалоговое окно Config, а моя оболочка - нет?

1 Ответ

2 голосов
/ 22 марта 2010

Возможно, вы не зарегистрировали WNDCLASS элемента управления Trackbar? Вы должны загрузить библиотеку DLL общего управления, прежде чем сможете ее создать.

Я специально смотрю на эту строку:

 CONTROL         "Slider2",IDC_PRISLIDER,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,74,90,108,11

РЕДАКТИРОВАТЬ: вам нужно будет связаться с comctl32.lib и вызвать InitCommonControlsEx во время запуска вашей программы.

...