- PR -

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

投稿者投稿内容
けんたろ
会議室デビュー日: 2006/09/29
投稿数: 8
お住まい・勤務地: なら
投稿日時: 2007-04-07 23:56
VB2005で作成したアプリケーションにおける、非アクティブ時のメニュー操作についてご教授下さい。
MenuStripやToolStripにて、メニューバーやツールバーを作成したアプリケーションにおいて、ウィンドウが非アクティブの際に、そのウィンドウのメニュー項目を1回クリックすると、まずはウィンドウがアクティブになり、もう1回クリックするとメニュー項目が開きます。

そこで、アプリケーションが非アクティブの場合であっても、クリック1回でメニューやツールを一気に開くにはどのように設定すればいいのでしょうか?

なお、シェアウェアの「Becky!」や「秀丸エディタ」等のアプリケーションはこのような操作ができます。

どうぞ宜しくお願い致します。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-04-08 01:22
引用:

けんたろさんの書き込み (2007-04-07 23:56) より:

そこで、アプリケーションが非アクティブの場合であっても、クリック1回でメニューやツールを一気に開くにはどのように設定すればいいのでしょうか?


Activate と MouseDown のメッセージを補足して、マウスの位置とボタンの位置で判断することになりそうです。

引用:

なお、シェアウェアの「Becky!」や「秀丸エディタ」等のアプリケーションはこのような操作ができます。


2 つとも古くからあるアプリケーションであり、最近のトレンドではないかもしれません。とはいえ、Toolbar 系であれば標準動作のような気がします。(Outlook, IE, RssBandit... etc)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
けんたろ
会議室デビュー日: 2006/09/29
投稿数: 8
お住まい・勤務地: なら
投稿日時: 2007-04-08 16:01
けんたろです。じゃんぬねっとさん早速のご返答有難うございます。

引用:

じゃんぬねっとさんの書き込み (2007-04-08 01:22) より:

Activate と MouseDown のメッセージを補足して、マウスの位置とボタンの位置で判断することになりそうです。



アドバイス有難うございます。
しかし、Buttonコントロールであればプロパティ等の設定を特別意識してしなくても、非アクティブ状態でもクリック1回で動作するのに、MenuStripやToolStripコントロールの場合はプログラムに工夫がいるのですね・・。

アドバイスを参考にして挑戦してみようと思いますが、私はVBのアプリケーション開発入門等の文献をかじってプログラムを作っている程度のレベルなので、もし宜しければ、サンプルをご教授いただけますと大変助かります。
じゃんぬねっとさんのHPを拝見いたしましたが、どのサンプルを応用したら実現できるのかわからなかったため、お手数をおかけしますが、どうぞ宜しくお願い致します。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2007-04-08 18:27
引用:

けんたろさんの書き込み (2007-04-08 16:01) より:
アドバイス有難うございます。
しかし、Buttonコントロールであればプロパティ等の設定を特別意識してしなくても、非アクティブ状態でもクリック1回で動作するのに、MenuStripやToolStripコントロールの場合はプログラムに工夫がいるのですね・・。


じゃんぬねっと氏が言いたいのはそういうのじゃなくって。
MenuStripやToolStripではこれが標準動作でこの動きを変えるのは面倒くさい。
だから別のコントロールを使ったら?といいたいんだと思う。
ToolBarの話題が出ているくらいだし。調べたかい?

[ メッセージ編集済み 編集者: ぶさいくろう 編集日時 2007-04-08 18:29 ]
けんたろ
会議室デビュー日: 2006/09/29
投稿数: 8
お住まい・勤務地: なら
投稿日時: 2007-04-08 20:55
けんたろです。ぶさいくろうさんコメント有難うございます。

勉強不足で恐縮です。ToolBar関連でまた調べて、プログラム作りに挑戦してみます。
あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2008-03-04 14:57
古いスレッドを掘り返してすみません。

僕のアプリでも同様の処理が必要になり調べてみました。

好みの問題は、
非アクティブなウィンドウがクリックされた時のガイドライン? (atmarkit.co.jp)
にある通りですのでさて置きまして、

SDIのフォーム・アプリを作っていて、
フォーム1とフォーム2があったとして、フォーム1にフォーカスがあるとき、
フォーム2のツールボタン(ToolStripButton)が押せるようにするか、
押せないようにするか?

要件によりますので、一概には言えませんが、
.NET Frameworkの標準(デフォルト?)の動きは、少しおかしいと思います。

なぜなら、フォーム1にフォーカスがあっても、フォーム2のツールボタンが
ハイライトし、押せそうな雰囲気がするからです。

なぜ、このような仕様になったのかと考えてみましたが、
MDIであれば、フォーカスのないフォームのツールボタンも押せるようですので、
SDIアプリに対してあまり配慮されてないのかと思っています。

いずれにせよ、何らかの対策が必要でしたので、
以下のようにコーディングして、フォーカスがなくても押せるようにしてみました。

コード:
private void Form2_Activated(object sender, EventArgs e)
{
    if (CurrentToolStripButton != null)
    {
        CurrentToolStripButton.Checked = !CurrentToolStripButton.Checked;
        CurrentToolStripButton = null;
    }
}

private ToolStripButton CurrentToolStripButton = null;

private void ToolStripButton1_MouseEnter(object sender, EventArgs e)
{
    CurrentToolStripButton = (ToolStripButton)sender;
}

private void ToolStripButton1_MouseLeave(object sender, EventArgs e)
{
    CurrentToolStripButton = null;
}



ToolStripButton1には、マウス移動系のイベントは来ますが、
押下系イベントが来ないため、

ボタン上にマウスがあるときに、アクティベイトが発生した場合、
クリックとみなすようにしました。

仮実装ですので、まだ、抜けがあるかも知れません。
あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2008-03-04 16:47
CurrentToolStripButtonを、CurrentToolStripItemに変えて、

CurrentToolStripButton.Checked = !CurrentToolStripButton.Checked;

を、

CurrentToolStripItem.PerformClick();

としてみました。

しかし、PerformClick()では、メニュー(ToolStripMenuItem)
が選択されないようです。


コード:
private void Form2_Activated(object sender, EventArgs e)
{
    if (CurrentToolStripItem != null)
    {
        CurrentToolStripItem.PerformClick();
        CurrentToolStripItem = null;
    }
}

private ToolStripItem CurrentToolStripItem = null;

private void ToolStripItem1_MouseEnter(object sender, EventArgs e)
{
    CurrentToolStripItem = (ToolStripItem)sender;
}

private void ToolStripItem1_MouseLeave(object sender, EventArgs e)
{
    CurrentToolStripItem = null;
}



れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2008-03-05 13:13
以前同じ質問があったような。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=39021&forum=7

を参照してください。

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