2

私はCを使用していくつかのプロジェクトに取り組んでおり、Win32APIを使用しています。別の言語を使用するか、MFC、GTK、QTなどの他のライブラリを使用することはできません。

私は次のようなWindowsメッセージ/シグナル/イベントを処理するための良い方法を探しています:

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
    switch(msg) {
        case WM_CLOSE:
            DestroyWindow(hwnd);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        case WM_COMMAND:
            switch(wparam) {
                case ID_OK_BUTTON:
                    DoSomething(hwnd);
                    break;
                case ID_FOO_BUTTON:
                    DoFoo(hwnd);
                    break;
                /*
                ....
                It's only getting more complex
                ....
                */
                case ID_BAR_BUTTON:
                    DoBar(hwnd);
                    break;
                case ID_EXIT_BUTTON:
                    SendMessage(hwnd, WM_CLOSE, wparam, lparam);
                    break;
                case ID_OPEN_BUTTON:
                    OpenFile(hwnd);
                    break;
            }
            break;
        default:
            return DefWindowProc(hwnd, msg, wparam, lparam);
    }
    return 0;
}

この部分はますます複雑で醜いものになっています。それを単純化する方法を知っていますか、おそらく私が多くのGUIライブラリでいつも見ている方法のようなものです:

some_magic(some_object, message, callback);

簡単なアドバイスは大いに役立ちます。

4

1 に答える 1

6

MFC、ATL、WTL は、マップの概念を使用して、メッセージからメンバーへのマッピングを開発者にとって使いやすい方法で定義します。マクロは、メッセージ/コマンド/通知コードの比較を隠蔽し、それぞれのメンバー関数は基準を満たすときに呼び出されます。

これがどのように機能するかを説明してくれることを願っています。線のセットはMAP_ENTRYそれほど醜く見えないはずです。

#define MAP_ENTRY(message, callback) if(msg == message) return callback(wnd, msg, wparam, lparam);
// ...
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
  MAP_ENTRY(WM_INITDIALOG, OnInitDialog)
  MAP_ENTRY(WM_DESTROY, OnDestroy)
  MAP_ENTRY(WM_TIMER, OnTimer)
  return DefWindowProc(hwnd, msg, wparam, lparam);
}
LRESULT OnInitDialog(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
  // ...
}
LRESULT OnDestroy(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
  // ...
}
LRESULT OnTimer(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
  // ...
}
于 2012-10-06T19:39:00.750 に答える