DOBON.NET DOBON.NETプログラミング掲示板過去ログ

メニューバーのアイテム

環境/言語:[Windows XP / Visual Studio 2005 / C++ マネージアプリケーション]
分類:[.NET]

現在、私のソフトのメニューのテキストを変更できるツールを作っています。
メニューのアイテムを右クリックするとテキストの変更ウィンドウが開きます。

VisualC++のコードですが、C#とあまり変わらないのでお願いします。
(->は.と同じですし、::も.と同じです。)

現在の方法は項目一つ一つにMouseDownイベントをつくり、

if (e->Button == System::Windows::Forms::MouseButtons::Right) {//右クリックなら
Form2^ form2 = gcnew Form2();//設定画面を作成
form2->textBox1->Text = this->FileMenu->Text;//設定画面のテキストを現在のテキストに
form2->ShowDialog();//設定画面を表示
this->FileMenu->Text = form2->textBox1->Text;//メニューのテキストを設定画面で変更したものにする
}

としています。
しかし、これをすべてのメニューのアイテムに作るのはとても大変です。
メニューのアイテムによって変わるのは
this->FileMenu->Textの部分だけです。これがメニューのアイテムのNameに変わるだけです。

長くなってしまいましたが、
どのメニューのアイテムで右クリックされたか知ることができれば、
このような面倒な作業をしなくてすみます。
どなたか分かる方回答をお願いします。
添付ファイル: 1268875924.png (7 KB)
masa さんこんにちは、おのでらです。

まず、メニューのテキストを変更する際に MouseDown イベントを使用しているようですが、
引数として渡されている「sender」にはメニューアイテムのインスタンスが設定されています。
Object 型として渡されていますが、ToolStripMenuItem 型にキャストすれば
メニューアイテムのテキストにアクセスすることができます。

private: System::Void ToolStripMenuItem_MouseDown(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e)
{
    ToolStripMenuItem^ item = (ToolStripMenuItem^)sender;
    if (e->Button == System::Windows::Forms::MouseButtons::Right)
    {
        item->Text = "変ったよ!";
    }
}

このメソッドをテキストを変更したいメニューアイテムの「MouseDown」イベントに
設定してあげれば、各メニューに対してひとつのメソッドで処理することが可能です。

// MouseDown イベントの登録(メニューの変数や数は必要に応じて)
this->FileToolStripMenuItem->MouseDown += gcnew System::Windows::Forms::MouseEventHandler(this, &Form1::ToolStripMenuItem_MouseDown);
this->NewToolStripMenuItem->MouseDown += gcnew System::Windows::Forms::MouseEventHandler(this, &Form1::ToolStripMenuItem_MouseDown);


ファイルメニュー直下のアイテムのみであれば下のようなイベントの設定の仕方もありますね。

for (int i = 0; i < this->FileToolStripMenuItem->DropDownItems->Count; i++)
{
    ToolStripItem^ item = this->FileToolStripMenuItem->DropDownItems[i];
    item->MouseDown += gcnew System::Windows::Forms::MouseEventHandler(this, &Form1::ToolStripMenuItem_MouseDown);
}

一括登録の仕方については設定対象メニューの数に合わせて考えてみてください^^
できました!とても感謝しております!
この方法ならソースコードが削減でき、ファイルサイズも軽くなります。

ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板