- PR -

非アクティブのウィンドウのメニュー操作について

投稿者投稿内容
あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2008-03-07 12:37
引用:

れいさんの書き込み (2008-03-05 13:13) より:
以前同じ質問があったような。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=39021&forum=7
を参照してください。



ありがとうございます。
参考になりました。

僕もれいさんと同じく「変に感じ」ます。

Strip系だけクリックされない訳ですね。

このスレッドでは、複数のアプリケーションの場合と、
一つのアプリケーション内の複数ウィンドウの場合の区別が曖昧ですので、
話が混乱してしまっているように思えます。

一つのアプリケーション内の複数ウィンドウの場合に絞って、
考えました。

不自然なのは、れいさんが指摘された不統一感に加え、

 1. フォーカスは当たって(色が変わって)押せそうなのに押せないこと
 2. Strip系でもMDIなら押せること

が、あります。

という訳で、上記の対処をした訳ですが、

未だに、メニューストリップのほうには効かない状態です。

れいさんのご指摘で気付きましたが、
MainMenuコントロールを使うという手がありますね?

調査してみます。


[ メッセージ編集済み 編集者: あぶぽん 編集日時 2008-03-07 12:39 ]
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2008-03-07 16:41
引用:

あぶぽんさんの書き込み (2008-03-07 12:37) より:
このスレッドでは、複数のアプリケーションの場合と、
一つのアプリケーション内の複数ウィンドウの場合の区別が曖昧ですので、
話が混乱してしまっているように思えます。



いいえ。混乱してません。
私の説明がわかりづらいですが。

Focusが移ったり、メニューが開いたりというイベントの前に、
WM_MOUSEACTIVATEメッセージが送られます。
それに何を返すかで、
アクティブ化されるかされないか、
後にMouseDown系のイベントが続くか続かないかが決まります。

ウィンドウが複数あるときも、他のアプリから遷移するときも、仕組みは同じです。

MainMenuやMenuStripは、
コンポーネント内にMOUSEACTIVATEを処理し適当な値を返すコードがあります。
その実装具合によって振る舞いが変わっているだけです。

他のアプリからの遷移かどうかどうか、
トップレベルウィンドウかどうか、
などを調べているわけです。

ですから、
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=39021&forum=7
にあるコードをうまく作りかえれば
望みの動作ができます。

MenuStripでもSDIでもMDIでも、
WM_MOUSEACTIVATEのハンドリングだけで
フォーカスが無くてもメニューが押せるように作れます。

PerformClickとかMouseEnterとか、
そういったものを使っているとうまく動くものを作るのはかなり困難です。

スキルアップ/キャリアアップ(JOB@IT)