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

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

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

Re[5]: コンテキストメニューの使い方


(過去ログ 128 を表示中)

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

■76093 / inTopicNo.1)  コンテキストメニューの使い方
  
□投稿者/ よぽん (19回)-(2015/06/01(Mon) 12:54:27)

分類:[.NET 全般] 

テキストボックスの右クリックでコンテキストメニューが表示されますが、
ラベルで同じことをしたいのですがどうすればよいのでしょうか?

標準で表示されるコンテキストメニューの使用方法がわからないので

ContextMenuStrip を貼り付けて、

項目に[コピー][貼り付け]を追加して
ラベルの MouseDown イベントから 右クリックを判断して表示させるところまでは
できるのですが、

[コピー][貼り付け]をクリックしたときのイベント処理の方法がわかりません。

引用返信 編集キー/
■76094 / inTopicNo.2)  Re[1]: コンテキストメニューの使い方
□投稿者/ shu (751回)-(2015/06/01(Mon) 13:05:23)
No76093 (よぽん さん) に返信

ToolStripMenuItemがクリックされたときの記述方法が
分からないのでしょうか?
それとも貼り付け処理の方法が分からないのでしょうか?
引用返信 編集キー/
■76096 / inTopicNo.3)  Re[2]: コンテキストメニューの使い方
□投稿者/ よぽん (20回)-(2015/06/01(Mon) 14:39:28)
ContextMensuStrip は初めて使うのでわからなかったのですが、
フォームに張り付けた場合は、フォームから項目の入力等ができるんですね。

でもラベルで処理しようとしたので
UserControl を作成して派生元をラベルに変更しました。
そこにContextMenuStrip を貼り付けると

アイコンが表示されるだけで、項目追加とか、編集はこのアイコンを右クリックで[項目の編集]から
項目コレクションエディターでしか変更できないみたいですね。
なので、ToolStripMenuItem をクリックした時のイベント等は手作りするしかないようなんですね。
で、コンストラクタの InitializeComponent() の後に
Copy.Click += tmiCopy_Click; と、Paste.Click += tmiPaste_Click; を追加してできるようになりました。

で、標準っていったらいいんでしょうか、テキストボックスで自動的に(何もしなくても)表示される
コンテキストメニューと処理機能は利用できないんでしょうか?


引用返信 編集キー/
■76097 / inTopicNo.4)  Re[3]: コンテキストメニューの使い方
□投稿者/ shu (752回)-(2015/06/01(Mon) 14:58:14)
No76096 (よぽん さん) に返信


> なので、ToolStripMenuItem をクリックした時のイベント等は手作りするしかないようなんですね。
> で、コンストラクタの InitializeComponent() の後に
> Copy.Click += tmiCopy_Click; と、Paste.Click += tmiPaste_Click; を追加してできるようになりました。
プロパティウィンドウのコンボボックスより作成したToolStripMenuItemを選択します。
イベントアイコン(カミナリっぽいアイコン)をクリックするとイベント一覧が表示されるのでClickのところで
ダブルクリックすればClickイベントの割り当てが出来ます。



>
> で、標準っていったらいいんでしょうか、テキストボックスで自動的に(何もしなくても)表示される
> コンテキストメニューと処理機能は利用できないんでしょうか?
>
作成した派生LabelのContextMenuStripプロパティに作成したContextMensuStripを割り当てれば右クリックで自動的に
コンテキストメニューを表示することは出来ます。そういうことでしょうか?

引用返信 編集キー/
■76098 / inTopicNo.5)  Re[3]: コンテキストメニューの使い方
□投稿者/ Hongliang (312回)-(2015/06/01(Mon) 15:42:48)
> で、標準っていったらいいんでしょうか、テキストボックスで自動的に(何もしなくても)表示される
> コンテキストメニューと処理機能は利用できないんでしょうか?

Unicode制御文字どうこうとかが表示される既定のコンテキストメニューは、コードから利用することはできないですね。
既定のコンテキストメニューを使用するか、自作のコンテキストメニューで完全に置き換えるかのどちらかです。
機能の一部はTextBoxにメソッドとして公開されています。「すべて選択」ならSelectAllメソッドなど。
引用返信 編集キー/
■76099 / inTopicNo.6)  Re[1]: コンテキストメニューの使い方
□投稿者/ 魔界の仮面弁士 (356回)-(2015/06/01(Mon) 18:23:20)
No76093 (よぽん さん) に返信
> [コピー][貼り付け]をクリックしたときのイベント処理の方法がわかりません。

【Visual Basic】

'コピー処理
Clipboard.Clear()
Clipboard.SetText(Label1.Text)


'貼り付け処理
If Clipboard.ContainsText() Then
 Label1.Text = Clipboard.GetText()
End If




> 標準で表示されるコンテキストメニューの使用方法がわからないので
Label 自体に TextBox を内包しておき、そこから
「テキストボックスのコンテキストメニュー」を呼んでみました。

【C#】

public class MenuedLabel : System.Windows.Forms.Label
{
 private System.Windows.Forms.TextBox textBox;
 public MenuedLabel()
 {
  this.textBox = new System.Windows.Forms.TextBox();
  this.textBox.TextChanged += delegate { this.Text = this.textBox.Text; };
 }
 protected override void Dispose(bool disposing)
 {
  if (disposing && textBox != null)
  {
   textBox.Dispose();
   textBox = null;
  }
  base.Dispose(disposing);
 }
 protected override void OnTextChanged(EventArgs e)
 {
  base.OnTextChanged(e);
  if (this.textBox != null && !this.textBox.IsDisposed)
  {
   this.textBox.Text = base.Text;
  }
 }
 protected override void OnMouseUp(System.Windows.Forms.MouseEventArgs e)
 {
  if (e.Button == System.Windows.Forms.MouseButtons.Right)
  {
   const int WM_CONTEXTMENU = 0x7B;
   var pos = System.Windows.Forms.Cursor.Position;
   int xy = (pos.Y << 16) | (pos.X & 0xFFFF);
   SendMessage(textBox.Handle, WM_CONTEXTMENU, textBox.Handle, new IntPtr(xy));
  }
  else
  {
   base.OnMouseUp(e);
  }
 }
 [System.Runtime.InteropServices.DllImport("user32")]
 private static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
}
引用返信 編集キー/
■76103 / inTopicNo.7)  Re[4]: コンテキストメニューの使い方
□投稿者/ よぽん (21回)-(2015/06/02(Tue) 10:14:13)
No76097 (shu さん) に返信

> プロパティウィンドウのコンボボックスより作成したToolStripMenuItemを選択します。
> イベントアイコン(カミナリっぽいアイコン)をクリックするとイベント一覧が表示されるのでClickのところで
> ダブルクリックすればClickイベントの割り当てが出来ます。

はい、認識してます。でも、これってコンテキストメニューのクリックイベントで
その下に配置した [コピー][貼り付け]のイベントじゃないですよね。
どっちが選択されたかとかの判断が必要だと思うのですけど。その方法がわからなかったです。


> 作成した派生LabelのContextMenuStripプロパティに作成したContextMensuStripを割り当てれば右クリックで自動的に
> コンテキストメニューを表示することは出来ます。そういうことでしょうか?

ContextMenuStripプロパティってあったんですね。気づかなかったです。
MouseDownイベントで処理する必要なかったんですね。



引用返信 編集キー/
■76104 / inTopicNo.8)  Re[2]: コンテキストメニューの使い方
□投稿者/ よぽん (22回)-(2015/06/02(Tue) 10:21:57)
No76099 (魔界の仮面弁士 さん) に返信

>>[コピー][貼り付け]をクリックしたときのイベント処理の方法がわかりません。
>
> 【Visual Basic】
>
> 'コピー処理
> Clipboard.Clear()
> Clipboard.SetText(Label1.Text)
>
>
> '貼り付け処理
> If Clipboard.ContainsText() Then
>  Label1.Text = Clipboard.GetText()
> End If
>
ごめんなさい。書き方間違ってますね。
[コピー][貼り付け]それぞれをクリックしたときのそれぞれの処理を行うためのイベントの発生方法がわかりません。
ということでした。でも私の場合、GetTextとSetText しかしてなかったのですけど、
Clear とか ContaintsText ってあった方がいいんですね。

>>標準で表示されるコンテキストメニューの使用方法がわからないので
> Label 自体に TextBox を内包しておき、そこから
> 「テキストボックスのコンテキストメニュー」を呼んでみました。
>
> 【C#】
>
> public class MenuedLabel : System.Windows.Forms.Label
> {
>  private System.Windows.Forms.TextBox textBox;
>  public MenuedLabel()
>  {
>   this.textBox = new System.Windows.Forms.TextBox();
>   this.textBox.TextChanged += delegate { this.Text = this.textBox.Text; };
>  }
>  protected override void Dispose(bool disposing)
>  {
>   if (disposing && textBox != null)
>   {
>    textBox.Dispose();
>    textBox = null;
>   }
>   base.Dispose(disposing);
>  }
>  protected override void OnTextChanged(EventArgs e)
>  {
>   base.OnTextChanged(e);
>   if (this.textBox != null && !this.textBox.IsDisposed)
>   {
>    this.textBox.Text = base.Text;
>   }
>  }
>  protected override void OnMouseUp(System.Windows.Forms.MouseEventArgs e)
>  {
>   if (e.Button == System.Windows.Forms.MouseButtons.Right)
>   {
>    const int WM_CONTEXTMENU = 0x7B;
>    var pos = System.Windows.Forms.Cursor.Position;
>    int xy = (pos.Y << 16) | (pos.X & 0xFFFF);
>    SendMessage(textBox.Handle, WM_CONTEXTMENU, textBox.Handle, new IntPtr(xy));
>   }
>   else
>   {
>    base.OnMouseUp(e);
>   }
>  }
>  [System.Runtime.InteropServices.DllImport("user32")]
>  private static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
> }
あ・・実は、わたしもこのやり方考えました。
テキストボックスのVisible を false にして見えないようにして、右クリックしたら
LabelとTextboxを入れ替えてとか・・いろいろ試して・・・
無理!!
それで終わっちゃいましたけど。こういう風になるんですね。
やっぱり私には無理でした。

引用返信 編集キー/
■76105 / inTopicNo.9)  Re[5]: コンテキストメニューの使い方
□投稿者/ shu (753回)-(2015/06/02(Tue) 10:51:55)
No76103 (よぽん さん) に返信
> ■No76097 (shu さん) に返信
>
>>プロパティウィンドウのコンボボックスより作成したToolStripMenuItemを選択します。
>>イベントアイコン(カミナリっぽいアイコン)をクリックするとイベント一覧が表示されるのでClickのところで
>>ダブルクリックすればClickイベントの割り当てが出来ます。
>
> はい、認識してます。でも、これってコンテキストメニューのクリックイベントで
> その下に配置した [コピー][貼り付け]のイベントじゃないですよね。
> どっちが選択されたかとかの判断が必要だと思うのですけど。その方法がわからなかったです。
>
[コピー]、[貼り付け]それぞれのToolStripMenuItemがプロパティのオブジェクト一覧には存在するはずですが
ないでしょうか?
引用返信 編集キー/
■76106 / inTopicNo.10)  Re[3]: コンテキストメニューの使い方
□投稿者/ 魔界の仮面弁士 (357回)-(2015/06/02(Tue) 11:08:44)
No76104 (よぽん さん) に返信
> ということでした。でも私の場合、GetTextとSetText しかしてなかったのですけど、
> Clear とか ContaintsText ってあった方がいいんですね。

ContaintsText はあった方が良いとおもいますよ。

たとえば、「ペイント」で画像をコピーした場合、文字列情報が記録されないため、
テキストボックスのコンテキストメニューで『貼り付け』が無効になりますよね。
文字列が入っていない場合は、文字列のペースト動作自体を無効化するのが一般的です。

文字列がコピーされていない状態で、ContaintsText を使わずに GetText するということは、
『貼り付け』が有効になっていて、かつ、空文字列がペーストされる状態を意味します。


一方、Clear は念のために書いただけで、必須と言うわけではありません。
VB6 の Clipboard の時は Clear が必要だったので、その時の癖ですね。


【VB6】
'Clipboard.Clear
Clipboard.SetData objImage
Clipboard.SetText strText

上記のコードでは、画像とテキストの両方がセットされます。
事前にクリアしておかないと、他のアプリでセットされたクリップボード情報の
一部の書式のみを差し替えることになってしまうため、都合が悪いのです。

たとえば、Microsoft Word の「ワードアート」で範囲選択してコピーした場合、
メタファイル画像、各種テキストなどなど、十数種のデータが保持されるのですが、
上記を実行すると、その中の一部に、VB6アプリのデータを混入させてしまうことになります。



【VB.NET】
'Clipboard.Clear()
Clipboard.SetImage(objImage)
Clipboard.SetText(strText)

一方上記では、クリップボードに残るのは、最後にセットした strText のみです。
.NET で画像とテキストの両方をセットしたい場合には、下記のようにします。

【VB.NET】
Dim o As New DataObject()
o.SetImage(objImage)
o.SetText(strText)
Clipboard.SetDataObject(o)



> テキストボックスのVisible を false にして見えないようにして、右クリックしたら
> LabelとTextboxを入れ替えてとか・・いろいろ試して・・・
もういっそのこと、ReadOnly 指定の TextBox で代用するとか。
少なくともコピー動作は行えますよね。
(ペーストまでしたいなら、事前に ReadOnly を解除しないといけませんが)
引用返信 編集キー/
■76107 / inTopicNo.11)  Re[3]: コンテキストメニューの使い方
□投稿者/ 魔界の仮面弁士 (358回)-(2015/06/02(Tue) 11:49:45)
No76104 (よぽん さん) に返信
> [コピー][貼り付け]それぞれをクリックしたときのそれぞれの処理を行うためのイベントの発生方法がわかりません。

こういうことではなく?

private void Form1_Load(object sender, EventArgs e)
{
  this.label1.ContextMenuStrip = this.contextMenuStrip1;
}

private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
{
  this.toolStripMenuItem1Copy.Enabled = this.label1.Text.Length > 0;
  this.toolStripMenuItem2Paste.Enabled = Clipboard.ContainsText();
}

private void toolStripMenuItem1Copy_Click(object sender, EventArgs e)
{
  Clipboard.SetText(this.label1.Text);
}

private void toolStripMenuItem2Paste_Click(object sender, EventArgs e)
{
  this.label1.Text = Clipboard.GetText();
}
引用返信 編集キー/
■76108 / inTopicNo.12)  Re[4]: コンテキストメニューの使い方
□投稿者/ 魔界の仮面弁士 (359回)-(2015/06/02(Tue) 12:18:03)
No76107 (魔界の仮面弁士) に追記
>>[コピー][貼り付け]それぞれをクリックしたときのそれぞれの処理を行うためのイベントの発生方法がわかりません。
> こういうことではなく?

コンテキストメニューを複数のコントロールで共有している場合:

private void Form1_Load(object sender, EventArgs e)
{
  this.label1.ContextMenuStrip = this.contextMenuStrip1;
  this.label2.ContextMenuStrip = this.contextMenuStrip1;
  //this.ActiveControl = this.label1;
}

private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
{
  var ctrl = contextMenuStrip1.SourceControl as Control ?? this.label1;
  this.toolStripMenuItem1Copy.Enabled = ctrl.Text.Length > 0;
  this.toolStripMenuItem2Paste.Enabled = Clipboard.ContainsText();
}

private void toolStripMenuItem1Copy_Click(object sender, EventArgs e)
{
  var ctrl = contextMenuStrip1.SourceControl as Control ?? this.label1;
  Clipboard.SetText(ctrl.Text);
}

private void toolStripMenuItem2Paste_Click(object sender, EventArgs e)
{
  var ctrl = contextMenuStrip1.SourceControl as Control ?? this.label1;
  ctrl.Text = Clipboard.GetText();
}
引用返信 編集キー/
■76111 / inTopicNo.13)  Re[6]: コンテキストメニューの使い方
□投稿者/ よぽん (23回)-(2015/06/02(Tue) 14:51:12)
No76105 (shu さん) に返信

> [コピー]、[貼り付け]それぞれのToolStripMenuItemがプロパティのオブジェクト一覧には存在するはずですが
> ないでしょうか?

はい、ToolStripMenuItem という項目はどこにもありませんでしたよ。
プロパティのオブジェクト一覧というのがわかってないのでしょうか?
Tで始まるのは、TabIndex,Tag,Text,TextAlignしかないです。

それとも稲妻の方でしょうか?
TabIndexChanged, TextAlignChanged, TextChangeed の3つしか見当たらないです。
引用返信 編集キー/
■76112 / inTopicNo.14)  Re[7]: コンテキストメニューの使い方
□投稿者/ 魔界の仮面弁士 (361回)-(2015/06/02(Tue) 15:02:13)
No76111 (よぽん さん) に返信
>>[コピー]、[貼り付け]それぞれのToolStripMenuItemがプロパティのオブジェクト一覧には存在するはずですが
>>ないでしょうか?
> はい、ToolStripMenuItem という項目はどこにもありませんでしたよ。

プロパティウィンドウの最上部に、
  『label1  System.Windows.Forms.Label』
などと表示されるドロップダウンがありますよね。
名前(label1の部分)が太字になっているはずです。


そのドロップダウンの項目の中に
  『何某  System.Windows.Forms.ToolStripMenuItem』
と書かれた項目はありませんか?


> それとも稲妻の方でしょうか?
Click イベントは、親元となる ContextMenuStrip クラスに対してではなく、
ContextMenuStrip の下に追加した、それぞれのメニュー項目に対して割り当ててください。
引用返信 編集キー/
■76113 / inTopicNo.15)  Re[7]: コンテキストメニューの使い方
□投稿者/ shu (754回)-(2015/06/02(Tue) 15:06:26)
No76111 (よぽん さん) に返信


> はい、ToolStripMenuItem という項目はどこにもありませんでしたよ。
ToolStripMenuItemという項目ではなくて作成したToolStripMenuItemの名前を
探してください。提示済コードから判断すると『Copy』とか『Paste』に
なります。


こちらと同じ画面か分かりませんが
プロパティウィンドウは下のような配置になっていませんか?

┌────────────────┐
│プロパティ        ▼ ×│
├────────────────┤
│ ここのリストにあると思う  ▼│
├────────────────┤
│各アイコンが表示されている   │
├────────────────┤
│各プロパティ名と値       │




引用返信 編集キー/
■76114 / inTopicNo.16)  Re[8]: コンテキストメニューの使い方
□投稿者/ よぽん (24回)-(2015/06/02(Tue) 15:32:55)
No76113 (shu さん) に返信

ありました。ありがとうございます。隠しコマンド(違う?)だったんですね。
そんなところからパーツを選ぶことなんて想定外でした。
見えてるパーツしか選択できないものだとばかり。
ありがとうございました。
引用返信 編集キー/
■76115 / inTopicNo.17)  Re[5]: コンテキストメニューの使い方
□投稿者/ よぽん (25回)-(2015/06/02(Tue) 15:49:32)
魔界の仮面弁士さんありがとうございました。
いろいろ勉強になりました。

説明不足もありご迷惑おかけしました。

shuさんにも 基本的な操作方法すら知らなくって
ご迷惑かけました。


みなさんどうもありがとうございました。


解決済み
引用返信 編集キー/
■76116 / inTopicNo.18)  Re[9]: コンテキストメニューの使い方
□投稿者/ 魔界の仮面弁士 (362回)-(2015/06/02(Tue) 15:53:01)
2015/06/02(Tue) 15:54:15 編集(投稿者)

# 入れ違いで「解決済み」が付いたようなので、チェックしなおしておきます。

No76114 (よぽん さん) に返信
> ありました。ありがとうございます。隠しコマンド(違う?)だったんですね。
> そんなところからパーツを選ぶことなんて想定外でした。
> 見えてるパーツしか選択できないものだとばかり。

Form 下部に置かれた ContextMenuStrip1 をクリックすれば、
プロパティ画面は ContextMenuStrip のものとなりますよね。
その時、フォームデザイナ上では Copy / Paste のメニュー項目も
表示されてくるかと思います。

デザイナ上に表示された、それらの Copy / Paster の各メニュー項目を
クリックすれば、プロパティ画面が ToolStripMenuItem のものになりますよ。
解決済み
引用返信 編集キー/
■76156 / inTopicNo.19)  Re[10]: コンテキストメニューの使い方
□投稿者/ よぽん (26回)-(2015/06/04(Thu) 10:40:06)
No76116 (魔界の仮面弁士 さん) に返信
> デザイナ上に表示された、それらの Copy / Paster の各メニュー項目を
> クリックすれば、プロパティ画面が ToolStripMenuItem のものになりますよ。

はい、フォーム上に張り付けるとそうなるんですけど
ユーザーコントロール(ラベル)だとフォームデザイナがないので
Copy/Paste が選択できないんですよね。

どうもありがとうございます。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -