1


0

WinApi / MFCでよりクリーンなPostMessageチェーンを設計する方法

複数のフレームを持つMFC GUIアプリ(メインウィンドウでのOutlookのような動作、新しいフレームで作成されるメッセージ/予定ウィンドウ、またはマルチフレーム同期のようなSkype)があり、mallocされたデータをポストメッセージする必要がありますウィンドウ階層を通して。

たとえば、文字列を取得し、_wcsdupそれ、PostMessage(WM_NEWSTRING、…​)、および階層のどこか下のコントロールがそれを処理するか、サブスクライバーがいない場合、メッセージは削除されます。

私が今検討しているのは、すべてのメッセージがアプリケーションスレッドに投稿され、スレッドがアクティブなフレームまたは最適なフレームを見つけ、メッセージをそれに渡し、フレームがメッセージをビューに渡し、ビューがメッセージをサブビューに渡します、メッセージを処理するビューがない場合、そのメッセージは解放されます。

問題は、私が持っている各CWndクラスでメッセージ転送コードを複製する必要があるため、これらのチェーンコマンドは書くのにかなり疲れるということです。 同時に、メッセージをキャッチするウィンドウがない場合、誰かがフリーを呼び出す必要があるため、リソースのクリーンアップはかなり不快です。 したがって、特別な処理をせずにメッセージをメインメッセージポンプに単に投稿するだけで、誰かが常にキャッチすることを期待することは、有効なアプローチではありません。 PostMessageはS_OKを返し、誰もメッセージを処理可能とは見なさず、ぶら下がります。

私が探しているものに対してより良い、正しいアプローチはありますか?

1 Answer


1


あなたが説明しているように、私は決して `PostMessage`を使用しません。 私の解決策には、しばしば握手が含まれます:

// From CNotifierBlah
PostMesssage(hWnd, UWM_NEW_DATA, 0, 0);
//
LRESULT CDestinationWnd::OnNewData(WPARAM wParam, LPARAM lParam)
{
    CNewData newData = GetNotifierBlah().GetNewData(); // Thread-safe getter!
}

Observer patternとほぼ同じです。