C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: 動的メニュー項目


(過去ログ 81 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■47921 / inTopicNo.1)  動的メニュー項目
  
□投稿者/ サル (5回)-(2010/03/17(Wed) 23:04:00)

分類:[C#] 

C#(Visual C# 2008 Express Editionを利用)にて通知領域のアイコンを利用するランチャーのような物を作りたくて
動的にContextMenuを使ってランチャーの部分の下記の様なサンプルを作って動作確認していたのですが
ToolStripMenuItem item = new ToolStripMenuItem();
item.Text = abc.ToString();
this.cmMain.Items.Add(item);
abc++;

これだと必ず下に下にとメニューに項目が追加されるようになります。これを下ではなくて上に対して追加したり位置をプログラムから指定して好きな位置に追加したり
または、ファームデザイン時にでるようなサブメニュー(?って言い方で良いのかな?)項目の右に→みたいな感じで出る場所に追加する方法って言うのは
どうやれば良いのでしょうか?
引用返信 編集キー/
■47922 / inTopicNo.2)  Re[1]: 動的メニュー項目
□投稿者/ Hongliang (573回)-(2010/03/17(Wed) 23:15:04)
No47921 (サル さん) に返信
> これを下ではなくて上に対して追加したり位置をプログラムから指定して好きな位置に追加したり
Add の代わりに Insert を使います。

> または、ファームデザイン時にでるようなサブメニュー(?って言い方で良いのかな?)項目の右に→みたいな感じで出る場所に追加する
追加する親の ToolStripMenuItem の DropDownItems に Add/Insert します。一度デザイナでデザインした後、Form1.designer.cs を覗いてみて下さい。
引用返信 編集キー/
■47925 / inTopicNo.3)  Re[2]: 動的メニュー項目
□投稿者/ サル (6回)-(2010/03/18(Thu) 00:04:08)
No47922 (Hongliang さん) に返信
両方できました。
質問ついでみたいになってしまいますが
現状通知領域のアイコンに対しては
NotifyIconに対してプロパティのContextMenuStripを指定すれば簡単に右クリックメニューは作れますが
左クリックに対してのメニューは現状ではWin32API(TrackPopupMenu()API)を使わないとできないと考えて良いですか?

引用返信 編集キー/
■47928 / inTopicNo.4)  Re[3]: 動的メニュー項目
□投稿者/ Hongliang (574回)-(2010/03/18(Thu) 00:28:00)
ContextMenuStrip.Show を呼び出せば不可能ではありません。
引用返信 編集キー/
■47929 / inTopicNo.5)  Re[4]: 動的メニュー項目
□投稿者/ サル (8回)-(2010/03/18(Thu) 01:07:47)
No47928 (Hongliang さん) に返信
> ContextMenuStrip.Show を呼び出せば不可能ではありません。
ありがとうございました。自分の説明不足でした。それはもう質問の前からネットで見かけて試していたんです。
ただこの処理だと左クリックと右クリックで同じメニュー表示になってしまいますよね。
これを別々のメニューにしたい場合にはやはりWin32API(TrackPopupMenu()API)を利用って事になりますよね?
VB6からC#に以降したばかりでまだまだちんぷんかんぷんです。
VB6ではタスクトレイアプリを作っていたのを移植したくて今の作業をしているのです。
Win32API(TrackPopupMenu()API)に関しては一応VB6の時には使ったことがあったのでC#でも同じ処理の場合はこれ使わないとだめかな?って思いました。

ついでにまたまた質問になってしまいますが
Add/Insertで追加したメニューに対してどうやってクリックイベントを発生させればいいのか?がわからないです。
なんか効いてばかりですがお願いします。
引用返信 編集キー/
■47930 / inTopicNo.6)  Re[5]: 動的メニュー項目
□投稿者/ Hongliang (575回)-(2010/03/18(Thu) 02:23:20)
> ただこの処理だと左クリックと右クリックで同じメニュー表示になってしまいますよね。
> これを別々のメニューにしたい場合にはやはりWin32API(TrackPopupMenu()API)を利用って事になりますよね?
いいえ。
それぞれ別々の ContextMenuStrip を用意して、NotifyIcon の MouseClick でクリックされたボタンに応じた ContextMenuStrip を表示させるだけです。
// 右クリック分は NotifyIcon.ContextMenuStrip を使っても構いませんが。
ContextMenuStrip は一つだけにして、表示前にメニューアイテムをごっそり入れ替えるという方法もあります。
なお、Win+B から表示中のアイコンを選択して Enter を入力した場合、MouseClick が MouseButtons.Left として発生するようです。

> Add/Insertで追加したメニューに対してどうやってクリックイベントを発生させればいいのか?がわからないです。
AddHandler キーワードおよび AddressOf キーワードを使用します。
ToolStripMenuItem の場合、New するときに直接クリック時のイベントハンドラを指定することもできます。
引用返信 編集キー/
■47987 / inTopicNo.7)  Re[6]: 動的メニュー項目
□投稿者/ サル (9回)-(2010/03/18(Thu) 21:38:57)
No47930 (Hongliang さん) に返信
> それぞれ別々の ContextMenuStrip を用意して、NotifyIcon の MouseClick でクリックされたボタンに応じた ContextMenuStrip を表示させるだけです。
> // 右クリック分は NotifyIcon.ContextMenuStrip を使っても構いませんが。
> ContextMenuStrip は一つだけにして、表示前にメニューアイテムをごっそり入れ替えるという方法もあります。
新たにContextMenuStripを追加してそれをshowして表示しましたが表示されたContextMenuが画面の左上に表示されてしまいました。
一応Cursor.Position.XとCursor.Position.Yでマウスポインタの位置を取得して
Show(this, new Point(Cursor.Position.X, Cursor.Position.Y))を試したのですが変な位置にまだ表示されてしまいました。



> AddHandler キーワードおよび AddressOf キーワードを使用します。
> ToolStripMenuItem の場合、New するときに直接クリック時のイベントハンドラを指定することもできます。
EventHandlerを利用することでできました。イベントパンドラを追加することができました。
ただ今度は作成したイメージパンドラでsender.ToString()でクリックしたConTextMenuのtextは取得することができましたが
実際にはConTextMenuのTagに必要な値をセットしてあるのでこれを取得したいのですがどうやったら良いのでしょうか?

引用返信 編集キー/
■48001 / inTopicNo.8)  Re[7]: 動的メニュー項目
□投稿者/ Hongliang (576回)-(2010/03/19(Fri) 10:52:17)
> 新たにContextMenuStripを追加してそれをshowして表示しましたが表示されたContextMenuが画面の左上に表示されてしまいました。
> 一応Cursor.Position.XとCursor.Position.Yでマウスポインタの位置を取得して
> Show(this, new Point(Cursor.Position.X, Cursor.Position.Y))を試したのですが変な位置にまだ表示されてしまいました。
ToolStripDropDownDirection も指定するようにすればそれっぽく見えるようになると思います。
// 限られた環境で使う場合なら問題にならないかも知れませんが、通知領域が画面上部とかに配置されている可能性とかもあります。
また、ただ Show しただけだとフォーカスが外れたときにメニューが消えないという問題があります。いくつか回避策はありますが、分かりやすいものとしては、ContextMenuStrip の表示直前に、Win32API の SetForegroundWindow 関数を使って ContextMenuStrip の Handle を最前面にするなどが考えられます。
参考:http://www.codeproject.com/KB/menus/notifyicondualmenus.aspx?msg=2820516
// こういう問題があるから「不可能ではない」などという奥歯に物の挟まった表現になりました。

> ただ今度は作成したイメージパンドラでsender.ToString()でクリックしたConTextMenuのtextは取得することができましたが
> 実際にはConTextMenuのTagに必要な値をセットしてあるのでこれを取得したいのですがどうやったら良いのでしょうか?
sender はイベントを起こしたオブジェクトそのものですから、メニュー項目がクリックされた場合そのメニュー項目を表す ToolStripMenuItem 自身になります。
ですので単に sender をキャストしてやればいいです。
// ん? ContextMenu の Tag? メニュー項目である ToolStripMenuItem ではなく?
// ToolStripMenuItem から ContextMenuStrip を取得するなら GetCurrentParent メソッドが使えますが……。
引用返信 編集キー/
■48049 / inTopicNo.9)  Re[8]: 動的メニュー項目
□投稿者/ サル (11回)-(2010/03/23(Tue) 00:24:53)
No48001 (Hongliang さん) に返信
メニューの位置が変なの以外はなんとかなりました。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -