2

たとえば、DefWindowsProc()取得するWindowsイベント値があります-つまりhWnd, MsgId, wParam, lParam。通知コード付きのイベントがプッシュ ボタンから来るのか、チェック ボックスから来るのか(あるいは他の何かから来るのか)を区別することは可能ですか?WM_COMMANDBN_CLICKED

動機:より大きなアプリケーションで GUI の実装とメッセージ処理を書き直しています。最終目標は wxWidgets ですが、少しずつやらなければなりません。BEGIN_EVENT_TABLE/END_EVENT_TABLEマクロと関連するEVT_BUTTON, EVT_CHECKBOX(...,EVT_SIZEなど)を模倣しますEVT_PAINT。のようなクラスも模倣しています。そのタイプを、イベントが元のコードでキャプチャされた場合と同等またはそれwxCommandEventに設定したいと考えています。wxEVT_COMMAND_BUTTON_CLICKEDwxEVT_COMMAND_CHECKBOX_CLICKED

例: 私はこのようなマクロを持っています

#define EVT_CHECKBOX(id, func) \
    if (uMsg == WM_COMMAND && id == LOWORD(wParam)) \
    { \
        CAppCommandEvent evt(hWnd, uMsg, wParam, lParam); \
        ATLASSERT(evt.GetEventType() == appEVT_COMMAND_CHECKBOX_CLICKED); \
        func(evt); \
        lResult = evt.GetLResult(); \
        if (!evt.GetSkipped()) \
            return TRUE; \
    }

wxEVT_COMMAND_CHECKBOX_CLICKEDは意図的に に名前が変更されていますappEVT_...EVT_CHECKBOXボタンにマクロが (誤って) 使用されていないかどうかを確認できるようにしたい。はいの場合、assert コマンドは、プログラムのデバッグ バージョンで表示できるようにする必要があります。

4

2 に答える 2

4

メッセージ自体には、ボタンのタイプを識別するのに役立つものはありません。ただし、理論的には、間接的にそれを見つけることができるはずです。lParamは、コントロールのウィンドウハンドルを提供します。これを使用して、ボタンスタイルGetWindowLongを取得できます。

LONG style = ::GetWindowLong(lParam, GWL_STYLE);
if (style & BS_CHECKBOX) {
    // It's a checkbox
}
于 2012-05-14T11:35:16.270 に答える
0

"より大きなアプリケーションで GUI の実装とメッセージ処理を書き直します。最終的な目標は wxWidgets ですが、徐々にやらなければなりません。"

本当に?私見、あなたは怒っています。wxWidgets を使用するようにアプリケーションを書き直す方が、その場で自分で作成した奇妙な半分 wxWidgets と半分ネイティブ Windows API を使用するよりも、はるかに簡単かつ迅速で、バグが無限に少なくなります。私が見ることができる唯一の利点は、あなたが作成しているこのモンスターを他の誰も維持できないため、雇用の安定です.

ただし、質問に答えると、wxWidgets はこれら 2 つのイベントを区別します。wxEVT_COMMAND_CHECKBOX_CLICKED はチェックボックスによって生成され、wxEVT_COMMAND_BUTTON_CLICKED はボタンによって生成されます。wxWidgets のコードは公開されており、ドキュメントも充実しています。

于 2012-05-14T13:13:46.923 に答える