Страница свойств для пользовательского фильтра Directshow - PullRequest
2 голосов
/ 14 февраля 2011

Мне удалось создать собственный фильтр преобразования DirectShow, зарегистрировать его и экспортировать в DLL. Теперь он работает правильно как в GraphEdit, так и в тестовой программе C ++. Моя следующая цель - создать пользовательский интерфейс для управления основным параметром фильтра из тестового приложения или со страницы свойств в GraphEdit.

Следуя этим инструкциям , мой пользовательский интерфейс работает должным образом из тестовой программы C ++. Однако у меня возникают проблемы со страницей свойств: я продолжаю получать сообщение об ошибке «Запрошенная страница свойств не может быть отображена» в GraphEdit.

Во время отладки я обнаружил, что единственными вызываемыми методами (в моем классе страницы пользовательских свойств, производном от CBasePropertyPage) являются OnConnect() и OnDisconnect() - что странным образом (или нет?) Вызывается дважды. Между этими двумя методами выполняются некоторые вызовы методов CBasePropertyPage (файл cprop.cpp в базовых классах), и все выглядит нормально до:

STDMETHODIMP CBasePropertyPage::Activate(HWND hwndParent, LPCRECT pRect, BOOL fModal)

а точнее

m_hwnd = CreateDialogParam(g_hInst, MAKEINTRESOURCE(m_DialogId), hwndParent, DialogProc, (LPARAM) this);

Я всегда получаю m_hwnd в 0, в результате чего метод возвращается с ошибкой. Я пытался добавить GetLastError() сразу после этой инструкции, но она всегда возвращает 0, без ошибок. Более того, каждый параметр CreateDialogParam() выглядит правильно инициализированным ...

Любая помощь будет принята с благодарностью!


РЕДАКТИРОВАТЬ :

На данный момент, чтобы хотя бы иметь рабочий пример, я использовал те же самые ресурсы / шаблоны, описанные в учебнике MSDN .


--- РЕДАКТИРОВАТЬ 2 --- :

Во время отладки я попытался удалить все элементы управления (кнопки, скроллеры) из ресурса Dialog. После этого ... все работает. CreateDialogParam() возвращает правильное значение, вызывается OnActivate() моего класса и так далее. В итоге я получаю страницу «Свойства фильтра» в GraphEdit, но пустую (кроме диалогового окна по умолчанию).

Но как только у меня появился контроль, например, командная кнопка MF, появляются предыдущие проблемы.

Существует ли какая-либо несовместимость между базовыми классами DirectShow и элементами управления, которые я использую? (И если да, то почему в предоставленном примере ничего не упоминается?) Есть ли более простой способ добавить элементы управления на страницу свойств?

(я определенно не эксперт с графическим интерфейсом и элементами управления Win32 ...)

1 Ответ

1 голос
/ 17 февраля 2011

Похоже, проблема возникла из-за того, что я создавал элементы управления для страницы свойств. Я использую простой ресурс «Formview», но я пытался добавить элементы управления через графическое средство просмотра ресурсов (или как вы хотите его называть): щелкните правой кнопкой мыши «Вставить элемент управления ActiveX ...» и с помощью «Microsoft Form 2.0» .

Используя ресурс Formview с простыми старыми элементами управления Win32 (инициализированный с CreateWindowEx() и управляемый с помощью классического цикла обработки сообщений), все прошло нормально.

Большое спасибо за вашу помощь!

...