2

WM_NCHITTEST (HTCLIENT と適切な領域を除く) の下で HTCAPTION を返すことによってクライアント領域ベースのウィンドウのドラッグをシミュレートしようとすると、親ウィンドウで使用すると問題なく動作しますが、拡張スタイル WS_EX_TRANSPARENT に設定されている場合でも、タブ プレースホルダー ウィンドウなどの子ウィンドウが存在します。クリックが親ウィンドウへの WM_NCHITTEST メッセージの受け渡しに失敗する原因となります (同様の方法でローカルの WM_NCHITEST メッセージを処理しようとすると、親自体ではなく親の周りに子ウィンドウをドラッグするという予期される結果が生じます)。

そのタブの子ウィンドウのすべての領域がクライアント領域と見なされるように見える場合、代わりに WM_LBUTTONDOWN を処理すると、目的の効果が得られるように見えます (以下を参照)。

    case WM_LBUTTONDOWN: {
        SendMessage(mainWnd.hWnd, WM_NCLBUTTONDOWN, HTCAPTION, lParam); 
    break;
    }

mainWnd.hWnd は親ウィンドウ ハンドルです (hWnd は設計されたウィンドウ プロパティ ヘルパー クラスのメンバーです)。

これにより目的の効果が得られますが、WS_EX_TRANSPARENT が実際に下層のウィンドウにクリックを通過させることを意図しているかどうか、およびより適切な解決策があるかどうかについて混乱していますか?

4

1 に答える 1

2

タブ コントロールの WM_NCHITTEST から HTTRANSPARENT を返そうとしましたか? メッセージを親ウィンドウに伝播する必要があると思います。

WS_EX_TRANSPARENT は、ウィンドウがどのように描画されるかに関係しています。

于 2011-06-09T22:06:27.003 に答える