2

次のコードを使用して、ダイアログボックスで進行状況コントロールをサブクラス化しようとしています。

ATL::CContainedWindowT<WTL::CProgressBarCtrl> progress;
// ...
progress.SubclassWindow(GetDlgItem(IDC_PROGRESS));

そこにすべて良い。今私がこれをやろうとすると:

progress.SetRange(0, 100);

SendMessage些細なWTLのSetRange()実装でアクセス違反の例外が発生します。私は上下に検索してきましたが、これは「古いATLコンポーネントを使用するアプリケーションでDEPとの競合が発生する可能性がある」で説明したように、「サンク」の問題である可能性があります。これは、最新のATLとWTLを使用しているため実際には当てはまりません。 (Visual Studio2010およびWTL8.1)。WTL 8.0を使用しても、同じ問題が発生します。

HWNDが有効であるため、サブクラス化は正常に実行されました。何か案は?

4

2 に答える 2

2

WTL :: CProgressBarCtrl m_Progress; <〜CContainedWindowではなく、プログレスバーをアタッチするために使用します。

于 2012-05-16T21:02:14.233 に答える
2

ウィンドウをサブクラス化する場合は、このサブクラス化されたコントロールのメッセージマップを実装する必要があります。これには、メンバー変数をコンストラクターでメッセージマップに接続ALT_MSG_MAPし、クラスメッセージマップに追加することが含まれます。あなたはこれをしていますか?私はあなたがそうしないと思います。

そもそもこれが必要ですか?サブクラス化する必要のないメッセージのみを送信するHWNDには、CProgressBarCtrlインスタンスにrealをアタッチするだけで済みます。

WTL::CProgressBarCtrl m_ProgressBar;
// ...
m_ProgressBar = GetDlgItem(IDC_PROGRESS);
m_ProgressBar.SetRange(...

HWNDが有効であるため、サブクラス化は正常に行われました。

いいえ、それはOKではありませんでした。ウィンドウをフックしましたが、WindowProcを提供しませんでした。したがって、問題。

于 2012-05-17T08:08:56.123 に答える