@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

非アクティブダイアログ上のツールボタンを1クリックで押したい

1
投稿者投稿内容
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 2007-06-13 15:14
こんにちは。お世話になってます。

現在、VC.NET 2005のC++/CLIでアプリケーション開発を行ってます。
1つのアプリケーションで複数のダイアログを表示させ、それぞれのダイアログ上の
ツールバーにボタンが配置されています。

Aというダイアログがアクティブ状態のときにBダイアログのツールバーのボタンを
クリックしてもBダイアログがアクティブになるだけでボタンがクリックされたこと
にはなりません。再度、そのボタンをクリックすると押されたことになります。
したがって、アクティブではないダイアログ上にあるツールボタンを押すのに2回
クリックしないといけません。
めんどくさいだけでなく、ダイアログがアクティブかどうかはタイトルバーの色が
微妙に薄いだけなので、1クリックか2クリックかはユーザーには非常にわかりに
くいものになってます。

非アクティブダイアログ上のツールボタンを1クリックで押したいのですが、
どのようにすればいいでしょうか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-06-13 17:15
申し訳ないですが回答ではありません。

引用:

maruさんの書き込み (2007-06-13 15:14) より:

したがって、アクティブではないダイアログ上にあるツールボタンを押すのに2回
クリックしないといけません。


デメリットばかり指摘されていますが、逆に言えば 「アクティブにしたいがための操作で誤動作することはない」 とも言えますね。こういった有意義なスレッドがあります。

引用:

めんどくさいだけでなく、ダイアログがアクティブかどうかはタイトルバーの色が微妙に薄いだけなので


ここの理由がそもそも不適切だと思います。ユーザーが自由に変えられるわけですから。

引用:

1クリックか2クリックかはユーザーには非常にわかりにくいものになってます。


上でも書いたことの延長になりますが、個人に依存しますから何でもかんでも自分の感じたままに対応する必要はありません。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-06-14 04:48
「アクティブと同時にクリック」「アクティブしてからもう1クリック」は
GUIの大きな悩みの一つのようで、いろんな話があるようですよ。
「マウスがウィンドウに入ったらアクティブ」なんて
ウィンドウマネージャも多い。
Windowsでもウィンドウマネージャにパッチをあてちゃうとか
専用のツールを作ったりだとか、いろいろあるようです。

Windowsは確か、基本的には「アクティブと同時にクリック」路線、
重要なものは「アクティブしてからもう1クリック」に、
アプリケーションで変更できるようになっている、
という話だったはずです。

他スレの話題でメニューを使っていたので、
ちょっと試してみました。


  • Button、Text、ComboBoxコントロール
    Activeと同時にクリックされる
  • ToolStrip
    Activeと同時にクリックされない
  • MainMenuコントロール
    Activeと同時にクリックされる
  • MenuStrip
    Activeと同時にクリックされない


なんか変に感じます。統一感がありません。
そういえばエクスプローラなどのツールバーはクリックされます。
誤動作防ぎたいならButtonコントロールのクリックをやめてほしい。
ToolStripは階層が無いのが普通ですが、
MenuStripは階層があるのが普通なので、
こちらはクリックされても誤動作の危険も少ないのでは?
と、なんか納得いきません。

まぁどっちでもいいんですが。
上からだったり先方からの要望だと断れないことも多々ありますし。
MenuStripがクリックできないのはToolStripを継承してるからではないかなぁ。

VBですが。

コード:
Public Class NoEatMenuStrip
    Inherits MenuStrip

    Const WM_MOUSEACTIVATE = &H21
    Const MA_ACTIVATE = 1
    Const MA_ACTIVATEANDEAT = 2
    Const MA_NOACTIVATE = 3
    Const MA_NOACTIVATEANDEAT = 4

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        If m.Msg = WM_MOUSEACTIVATE Then
            m.Result = MA_ACTIVATE
            Exit Sub
        End If
        MyBase.WndProc(m)
    End Sub
End Class



正直、プログラミングのコストとかを考えると
普段は1クリックとか2クリックとか考えてられないですね。
MSの用意したとおりに、何もいじらないのが経験上最良です。
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 2007-06-14 09:17
返答ありがとうございます。

Unixの某ウィンドウマネージャのようにマウスカーソルがウィンドウの上に来るだけ
でウィンドウが手前にチラチラくるのもWindows慣れしたユーザからすると違和感が
あります。

確かに、他のアプリケーションがアクティブのときに自アプリケーションをクリック
するとEXCEL方式のように、自アプリケーションはアクティブになるだけでいいのです。

が、問題は自アプリケーション内のウィンドウ同士で、ウィンドウが重なり合って
いるというより、ウィンドウを並べて表示しているような状態でも、2回クリック
することに違和感があるのです。

どちらかというとEXCEL方式でも、EXCEL内のVBAのツールボックスのような関係が
いいのです。EXCEL本体がアクティブであっても、VBAのツールボックス上のボタン
は1クリックでおせます。
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-06-14 10:11
引用:

どちらかというとEXCEL方式でも、EXCEL内のVBAのツールボックスのような関係が
いいのです。EXCEL本体がアクティブであっても、VBAのツールボックス上のボタン
は1クリックでおせます。



EXCELのVBAはつかったことないのでどんな振る舞いかわかりませんが。

先ほどのコード、普通はもうちょっとまともな実装にします。
アクティブなルートウィンドウを取得して
それが自アプリのルートウィンドウと同じ場合は食べない(WM_ACTIVATE)、
違う場合は食べる(WM_ACTIVATEANDEAT)を返すように
作るのが王道です。

たぶん、その動作がお望みの動作ではないでしょうか?
WM_MOUSEACTIVATEを見つければ難しい問題ではありません。
簡単ですので自分で作ってください。

1

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