tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル右クリックのメニュー非表示について
記事No1339
投稿日: 2005/01/26(Wed) 10:57
投稿者tyt
[OSのVer]:Windows2000    [VBのVer]:VB.NET  

いつもお世話になっております。

画面上のテキストで、右クリック時に表示されるメニューを
非表示にしたいと思い、画面Load時に
TextBox1.ContextMenu = New ContextMenu
とし、空のContextMenuオブジェクトを指定しています。

テキスト上で右クリックをすると、メニューは表示されないのですが、
右クリックしたままフォーム上どこかにドラッグし、手を離すと
メニューが出てしまいます。

右クリックで表示されるメニューを完全に出さない方法を
実装された方がいらっしゃれば、ヒントでもいただけないかと思っています。

よろしくお願いいたします。

[ツリー表示へ]
タイトルRe: 右クリックのメニュー非表示について
記事No1340
投稿日: 2005/01/26(Wed) 12:27
投稿者花ちゃん
下記でどうですか?

'貼り付け防止処理をしたカスタムテキストボックスを作成
Public Class cmTextBox
    'テキストボックスを継承
    Inherits System.Windows.Forms.TextBox

---- Windows フォーム デザイナで生成されたコード省略 ----
  
    'WndProc のオーバーライド
    Protected Overrides Sub WndProc(ByRef m As Message)
        Const WM_CUT As Integer = &H300         'カット(P840)
        Const WM_COPY As Integer = &H301        'コピー(P837)
        Const WM_PASTE As Integer = &H302       'ペースト(P876)
        Const WM_CONTEXTMENU As Integer = &H7B  'ポップアップメニュー
        Const WM_RBUTTONUP As Integer = &H205   '右ボタンアップ    
        Select Case m.Msg

        Case WM_CONTEXTMENU, WM_CUT, WM_PASTE, WM_RBUTTONUP
            m.Result = IntPtr.Zero
            Exit Sub
        End Select

        'オブジェクト変数と同じように動作する
        MyBase.WndProc(m)
    End Sub
End Class

'1.メニューのユーザコントロールの追加でファイル名をcmTextBox.vbにして追加する。
'2.作成した、cmTextBox.vb に上記のコードを記入してビルドする。
'3.ツールボックス上(マイユーザコントロールの欄)にcmTextBox コントロールが
'    出来ているのでForm1に貼り付ける

[ツリー表示へ]
タイトルRe: 右クリックのメニュー非表示について
記事No1341
投稿日: 2005/01/26(Wed) 12:39
投稿者じゃんぬねっと
参照先http://jeanne.wankuma.com/
じゃんぬねっと です。

下記も参照してみてください。
hhttp://www.gdncom.jp/general/bbs/ShowPost.aspx?PostID=23363

[ツリー表示へ]
タイトルRe^2: 既にレイアウト済みの画面で・・
記事No1349
投稿日: 2005/01/27(Thu) 10:10
投稿者tyt
 
花ちゃんさん、じゃんぬねっとさん、早速の回答ありがとうございます。

初歩的な質問であるかもしれませんが、さらに質問させてください。

右クリックでのメニューを完全に消したい画面は、
既にレイアウト済みの10画面、テキストボックスの総数は200個近くに上ります。
(リリース後の追加要望なのです)

テキストを全てユーザーコントロールにする場合、
画面ロード時に、既に配置している全てのテキストを名称、プロパティを引き継いで
ユーザーコントロールに置き換えることができるでしょうか。

現在、全ての画面をロードする際に呼び出す共通のメソッドがあって、
その中でテキストにイベントの追加(AddHandler)を行っています。
その中で何とかできないものか思案中です。

テキストのイベントにさらにイベントを追加して、
右クリックのイベントを拾って回避するか・・。

スマート?な方法を考え中です。

[ツリー表示へ]
タイトルRe^3: 既にレイアウト済みの画面で・・
記事No1350
投稿日: 2005/01/27(Thu) 11:01
投稿者じゃんぬねっと
参照先http://jeanne.wankuma.com/
> テキストを全てユーザーコントロールにする場合、
> 画面ロード時に、既に配置している全てのテキストを名称、プロパティを引き継いで
> ユーザーコントロールに置き換えることができるでしょうか。
TextBox を継承したカスタムコントロールにすれば、
独自で実装した部分は考慮してなくても良いでしょう。
ただし、コントロールの貼り替えは当然必要となります。
(コードから直接置換しても良いですが... ちょっと危険かな)

> 現在、全ての画面をロードする際に呼び出す共通のメソッドがあって、
> その中でテキストにイベントの追加(AddHandler)を行っています。
> その中で何とかできないものか思案中です。
Windows メッセージを処理するとなると、ちょっと独自イベントのハンドラでどうこうは無理かなぁ...

[ツリー表示へ]
タイトルRe: 既にレイアウト済みの画面で・・
記事No1352
投稿日: 2005/01/27(Thu) 19:08
投稿者K.J.K.
Application.AddMessageFilter メソッドなどに関して
調べてください。

[ツリー表示へ]
タイトル解決しました!
記事No1358
投稿日: 2005/01/31(Mon) 11:16
投稿者tyt
K.J.K.さん、じゃんぬねっとさん、花ちゃんさん、
ありがとうございました。

K.J.K.さんからいただいたアドバイスを元に、
Application.AddMessageFilter
で、右クリックに関するメッセージを全てブロックできました。

これであれば、簡単なクラスの追加と、
アプリケーションのLoad時に
AddMessageFilter の1行を追加するだけで
実現できそうです。

本当にありがとうございました。

[ツリー表示へ]