2

カスタム DirectShow 変換フィルターを作成して登録し、DLL にエクスポートすることができました。GraphEdit と C++ テスト プログラムの両方で正しく動作するようになりました。私の次の目標は、テスト アプリまたは GraphEdit のプロパティ ページから、フィルターのメイン パラメーターを制御するカスタム インターフェイスを作成することです。

これらの指示に従って、カスタム インターフェイスが C++ テスト プログラムから適切に動作するようになりました。ただし、プロパティ ページで問題が発生しています。GraphEdit で「要求されたプロパティ ページを表示できませんでした」というエラー メッセージが表示され続けます。

デバッグ中に、(CBasePropertyPage から派生したカスタム プロパティ ページ クラスで) 呼び出される唯一のメソッドがOnConnect()and OnDisconnect()- であることがわかりました。これら 2 つのメソッドの間で、いくつかの呼び出しが 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_hwnd0 になるため、メソッドはエラーを返します。GetLastError()この命令の直後に追加しようとしましたが、常に 0 が返され、エラーは発生しません。さらに、のすべてのパラメータはCreateDialogParam()適切に初期化されているように見えます...

どんな助けでも大歓迎です!


編集

今のところ、少なくとも実用的な例を得るために、 MSDN チュートリアルで説明されているものと同じリソース/テンプレートを使用しました。


---編集 2--- :

もう少しデバッグしながら、Dialog リソースからすべてのコントロール (ボタン、スクローラー) を削除してみました。その後...すべてが機能します。CreateDialogParam()正しい値を返し、私のクラスOnActivate()が呼び出されます。最終的に、GraphEdit に「フィルター プロパティ」ページが表示されますが、空です (既定のダイアログ ウィンドウを除く)。

しかし、MF コマンド ボタンなどのコントロールを使用するとすぐに、以前の問題が発生します。

DirectShow の基本クラスと私が使用しているコントロールとの間に何らかの非互換性はありますか? (もしそうなら、提供されたサンプルで何も言及されていないのはなぜですか?) プロパティ ページにコントロールを追加する簡単な方法はありますか?

(私は間違いなく、GUI と Win32 コントロールの専門家ではありません...)

4

1 に答える 1

1

プロパティ ページのコントロールを作成する方法に問題があったようです。私は単純な「フォームビュー」リソースを使用していますが、グラフィカルリソースビューアー(またはそれを呼び出したいもの)を介してコントロールを追加しようとしていました:右クリックして「ActiveXコントロールを挿入...」を使用し、「Microsoft Form 2.0」を使用します.

CreateWindowEx()プレーンな古い Win32 コントロール (従来のメッセージ ループで初期化および管理) で Formview リソースを使用すると、すべてがうまくいきました。

助けてくれてありがとう!

于 2011-02-17T09:23:55.207 に答える