- - PR -
非アクティブダイアログ上のツールボタンを1クリックで押したい
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-06-13 15:14
こんにちは。お世話になってます。
現在、VC.NET 2005のC++/CLIでアプリケーション開発を行ってます。 1つのアプリケーションで複数のダイアログを表示させ、それぞれのダイアログ上の ツールバーにボタンが配置されています。 Aというダイアログがアクティブ状態のときにBダイアログのツールバーのボタンを クリックしてもBダイアログがアクティブになるだけでボタンがクリックされたこと にはなりません。再度、そのボタンをクリックすると押されたことになります。 したがって、アクティブではないダイアログ上にあるツールボタンを押すのに2回 クリックしないといけません。 めんどくさいだけでなく、ダイアログがアクティブかどうかはタイトルバーの色が 微妙に薄いだけなので、1クリックか2クリックかはユーザーには非常にわかりに くいものになってます。 非アクティブダイアログ上のツールボタンを1クリックで押したいのですが、 どのようにすればいいでしょうか? | ||||||||||||
|
投稿日時: 2007-06-13 17:15
申し訳ないですが回答ではありません。
デメリットばかり指摘されていますが、逆に言えば 「アクティブにしたいがための操作で誤動作することはない」 とも言えますね。こういった有意義なスレッドがあります。
ここの理由がそもそも不適切だと思います。ユーザーが自由に変えられるわけですから。
上でも書いたことの延長になりますが、個人に依存しますから何でもかんでも自分の感じたままに対応する必要はありません。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2007-06-14 04:48
「アクティブと同時にクリック」「アクティブしてからもう1クリック」は
GUIの大きな悩みの一つのようで、いろんな話があるようですよ。 「マウスがウィンドウに入ったらアクティブ」なんて ウィンドウマネージャも多い。 Windowsでもウィンドウマネージャにパッチをあてちゃうとか 専用のツールを作ったりだとか、いろいろあるようです。 Windowsは確か、基本的には「アクティブと同時にクリック」路線、 重要なものは「アクティブしてからもう1クリック」に、 アプリケーションで変更できるようになっている、 という話だったはずです。 他スレの話題でメニューを使っていたので、 ちょっと試してみました。
なんか変に感じます。統一感がありません。 そういえばエクスプローラなどのツールバーはクリックされます。 誤動作防ぎたいならButtonコントロールのクリックをやめてほしい。 ToolStripは階層が無いのが普通ですが、 MenuStripは階層があるのが普通なので、 こちらはクリックされても誤動作の危険も少ないのでは? と、なんか納得いきません。 まぁどっちでもいいんですが。 上からだったり先方からの要望だと断れないことも多々ありますし。 MenuStripがクリックできないのはToolStripを継承してるからではないかなぁ。 VBですが。
正直、プログラミングのコストとかを考えると 普段は1クリックとか2クリックとか考えてられないですね。 MSの用意したとおりに、何もいじらないのが経験上最良です。 | ||||||||||||
|
投稿日時: 2007-06-14 09:17
返答ありがとうございます。
Unixの某ウィンドウマネージャのようにマウスカーソルがウィンドウの上に来るだけ でウィンドウが手前にチラチラくるのもWindows慣れしたユーザからすると違和感が あります。 確かに、他のアプリケーションがアクティブのときに自アプリケーションをクリック するとEXCEL方式のように、自アプリケーションはアクティブになるだけでいいのです。 が、問題は自アプリケーション内のウィンドウ同士で、ウィンドウが重なり合って いるというより、ウィンドウを並べて表示しているような状態でも、2回クリック することに違和感があるのです。 どちらかというとEXCEL方式でも、EXCEL内のVBAのツールボックスのような関係が いいのです。EXCEL本体がアクティブであっても、VBAのツールボックス上のボタン は1クリックでおせます。 | ||||||||||||
|
投稿日時: 2007-06-14 10:11
EXCELのVBAはつかったことないのでどんな振る舞いかわかりませんが。 先ほどのコード、普通はもうちょっとまともな実装にします。 アクティブなルートウィンドウを取得して それが自アプリのルートウィンドウと同じ場合は食べない(WM_ACTIVATE)、 違う場合は食べる(WM_ACTIVATEANDEAT)を返すように 作るのが王道です。 たぶん、その動作がお望みの動作ではないでしょうか? WM_MOUSEACTIVATEを見つければ難しい問題ではありません。 簡単ですので自分で作ってください。 |
1