3

通知は、コントロールによってその親に送信されます。を使用してコントロールをサブクラス化するSetWindowSubclassと、通知をどのように処理できますか? 親のウィンドウ プロシージャでそれらを処理したくありません。サブクラス proc でできることはありますか?

エディット コントロールをサブクラス化する場合EN_CHANGE、サブクラスで通知を処理する方法は?

アップデート

これはサブクラス プロシージャです。

LRESULT CALLBACK MyEditWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{
  switch (uMsg)
  {
  default:
    return DefSubclassProc(hWnd, uMsg, wParam, lParam);
  }
}

私が使う

SetWindowSubclass(GetDlgItem(hWnd, ID_MYEDIT), MyEditWindowProc, 0, 0);

エディット コントロールをサブクラス化します。

しかし、どのメッセージを処理すればよいでしょうか? 確かWM_NOTIFYに、それは親によって処理されているためではありません。

4

3 に答える 3

4

エディット コントロールをサブクラス化する場合、サブクラスで EN_CHANGE 通知を処理する方法は?

簡単な答え: できません。編集をサブクラス化すると、送信されたメッセージのみが表示されますすでに送信されたメッセージを聞いたり傍受したりすることはできません(ただし、送信メッセージを追加することはできます)。

ただし、これを行う必要がある場合は、代わりの手法として、編集をラップする中間ウィンドウを作成して、元の親ダイアログがラッパーを子として持ち、ラッパーが編集を子として持つようにすることもできます。これで、ラッパーは、どちらの方向にも送信されるメッセージをインターセプトしてフィルタリングするように配置されました。

関連するすべてのメッセージを手動で転送し、サイズ変更やその他のハウスキーピングの問題を処理するように注意する必要があります。サブクラス化すると「無料で」その束を取得できますが、ラップするときに明示的に処理する必要があります。また、マウス/キーボード入力は引き続き内部コントロールに送られます。それを聞く必要がある場合は、ラッピングに加えてサブクラス化が必要になります。

于 2012-08-28T03:01:11.137 に答える
3

私の知る限り、Win32 API だけを使用した簡単な解決策はありません。サブクラス化により、コントロールから送信されたメッセージではなく、コントロールに送信されメッセージを処理できます。Win32 通知は、コントロールによって親に直接送信されます。この動作を変更できるとは思いません。

MFC は、メッセージ リフレクションと呼ばれる機能を介して、必要なことと同様のことを行います。メッセージは引き続き親ウィンドウに送信されますが、親は子ウィンドウで「リフレクション」ハンドラーを探し、これらのハンドラーを手動で呼び出します。

MFC リフレクションに似たものを自分で書くこともできますが、少し手間がかかるので、もっと簡単な代替手段があれば、それを使用する必要があります。

于 2012-08-28T02:58:46.457 に答える
2

EN_CHANGE などは常に親ウィンドウに送信されます。それらはコントロールに送信されず、親に送信されるため、サブクラス化されたコントロールでそれらを処理することはできません。

親のウィンドウ プロシージャにコードを追加せずにエディット コントロールの自己完結型サブクラスを実行する方法を探していて、それらの通知メッセージを処理したい場合、唯一の方法はサブクラス化することです。親ウィンドウも。

于 2012-08-28T03:00:31.853 に答える