0

WM_COMMANDWin32 で単純なフレームワークを作成していますが、メッセージをキャッチできないようです。WndProc を通過するすべてのメッセージを出力コンソールに出力しましたが、WM_COMMANDメッセージはありません。私のプログラムは、ウィンドウと編集ボックス(「EDIT」クラスを含む)で構成されています。

これが私のその場しのぎのメッセージ ループです (これはテスト用です)。

MSG msg;
BOOL ret;
while( ( ret = ::GetMessage( &msg, NULL, 0, 0 ) ) > 0 )
{
    if(msg.hwnd == NULL)
        continue;
    else if(ret == -1)
        break;
    else {
        ::TranslateMessage( &msg );
        ::DispatchMessage( &msg );
    }
}

WndProc は次のとおりです。

LRESULT CALLBACK Win32Base::GlobalWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    Win32Base *pWindow;

    pWindow = reinterpret_cast<Win32Base*>( GetWindowLong( hWnd, GWL_USERDATA ) );
    if( pWindow ) {
        MSG msgdata;
        msgdata.hwnd = hWnd;
        msgdata.message = msg;
        msgdata.wParam = wParam;
        msgdata.lParam = lParam;

        return pWindow->OnMessage( msgdata );
    }

    return DefWindowProc(hWnd, msg, wParam, lParam);
}

エディットボックスもサブクラス化しています。WM_CHARメッセージなどはキャッチできますが、メッセージはWM_COMMANDありません(ただし、メッセージは存在しないはずです)。

子育ての仕方に問題があるのではないかと思います。Windows の親の動的変更を追加しました。コントロールが作成されたときに、まだ親がない可能性があります。したがって、 でコントロールを作成すると、WS_CHILD親がないためエラーが発生します。そのため、親を割り当てるときに、WS_CHILDスタイルも追加します (または、親を削除する場合は削除します)。これは良い習慣ですか?メイン ウィンドウが編集ボックスの WM_COMMAND メッセージを受信するのを妨げている可能性がありますか?

また、入力時にエディットボックス自体が再描画されないため、強制的に再描画する必要があり、非常に遅いです...

4

1 に答える 1

3

エディット コントロールは、作成時に親ウィンドウをキャッシュし、これを更新することはありません。そのため、エディット コントロールの親を変更しても、元の親に通知メッセージが送信されます。

1 つの解決策は、エディット コントロールをホストし、エディット コントロールから送信された通知メッセージをその親に転送するダミーの「ラッパー」ウィンドウ クラスを作成することです。

于 2013-01-05T21:46:21.353 に答える