tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^4: Labelのダブルクリックでテキストのコピーが邪魔
投稿日: 2025/05/29(Thu) 23:32
投稿者たこやき
> 『新しいバージョンではe.Cancel=Trueで自動コピーを停止できますが』という先の発言は、
> どのバージョンの .NET における、どのイベント引数のことを指しているのでしょうか?

既に忘れてます。
マイクロソフトのサイトで見たと思いますけど、再度調べる気にはならないです。
「どうしよう→検索→マイクロソフトの何か→なるほど、これで解決だな(あったか?)→ないじゃん!?」
なので、自分で試して確認してないです。

なお、
  Private Sub Label1_MouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Label1.MouseDoubleClick
の「e」です。
e.Handlerもe.Cancelもないですね。

'上記から呼び出す予定だった使い物にならないゴミ関数
    Private Shared Function CancelCopyAtLabelDoubleClick(ByVal e As System.Windows.Forms.MouseEventArgs) As Integer
'略
            If e.Clicks >= 2 Then
                e.Cancel = True 'そんなプロパティありません
            End If
'略
    End Function

なんか落ちてないかなと思って継承しても、
    Public Class NewMouseEventArgs
        Inherits System.Windows.Forms.MouseEventArgs
        Public Sub New(ByVal button As System.Windows.Forms.MouseButtons, ByVal clicks As Integer, ByVal x As Integer, ByVal y As Integer, ByVal delta As Integer)
            MyBase.New(button, clicks, x, y, delta)
        End Sub
    End Class
引数を見る限り詰んでました。



> > やはり、継承したクラス作るのが王道ですよね…。
> コントロールを差し替えたくないのなら、NativeWindow クラスでサブクラス化して
> WM_LBUTTONDBLCLK 時の処理を握りつぶしてしまえば良いかと思います。
>
> > MouseDoubleClickイベントを使ってるので、
> > イベント自体潰しちゃうと使えなくなってしまいますね…
> ダブルクリック イベント自体は必要、という話になると、
> No.12314 のように、SS_NOTIFY スタイルを解除する案も駄目かも知れませんね。
> No.12313 のように、WM_GETTEXTLENGTH でゼロを返すようにサブクラス化したらどうなりますか?
> (Win10 でしか試してないので、Win11 でうまくいくかは分かりません)

前提として、
コードを直接書いて良いエリアと書いてはいけないエリアで分けてます。
Designer.vbのコードを直接触らないと書いたとおり、
VSのフォーム表示なGUI操作(Form1 [デザイン])のときの影響が嫌なので
Designer.vbに影響を及ぼすコントロール系では継承や処理を手前で変えるのを避けてます。
コントロールを継承したものを使うのはForm_Load以降です。



今回どう対応するかを自分の考えを確認したところ、

・Designer.vbはフォーム表示環境のGUI操作経由以外では触らない
・何かやるならForm_Load時にやる
・Label風コントロールのイベントを普通に使えるようにする
・他のコントロールのイベントの影響があっても支障ない
・他のプロジェクトで再利用するとき、書き込むコードの増量を(ラベル1つあたり)3行以内にする☆ここ大事☆
 例(2行):
 @Private WithEvents NewLabelClass1 As NewLabelClass
  : :
 ANewLabelClass1 = New NewLabelClass(Label1) 'Form_Load時
というのを満たすことを前提にしてますね。


たぶん上記例の延長線上には、
NewLabelClassはPictureBoxを継承し、内部では

Public Property Text As String 'ラベルに引き渡す

'ラベルのイベントを捕まえて、代わりにイベントを出す
Public Shadows Event TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)

というのを作ったり、

Dock(PictureBoxはFill固定、Dock自体はLabelに渡す)、
BackColor(PictureBoxは透明固定、色変更はLabelに渡す)、
その他Anchor,ForeColor,Fonts等々のPropetyを上書きします。

このときデッドロックが起きないよう
全プロパティにSystem.Threading.MutexとSyncLockを使わないといけない。

概ねこういう方向性で対応することになると思います。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。