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

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

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

子コントロールのマウスイベントを全て親コントロールに渡す方法

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

■93012 / inTopicNo.1)  子コントロールのマウスイベントを全て親コントロールに渡す方法
  
□投稿者/ RAGI (1回)-(2019/11/13(Wed) 22:52:24)

分類:[C#] 

https://qiita.com/yaju/items/b86be7b86c1e54e08e39

↑こちらの記事のように、ボタンの上にラベルを重ねたコントロールを作成しています。
(ボタンの子コントロールとしてラベルを持たせている)

このときラベルをクリックしても、ボタンのクリックイベントではなく、ラベルのクリックイベントが呼ばれるため何も反応しません。
現在は解決策として、ラベルのクリックイベントでボタンのクリックイベントを呼び出すようにしています。

同様にMouseEnterやMouseLeaveでもボタンのイベントが呼び出されるよう一つ一つ記述しているのですが、泥臭さが否めません。

子コントロールのマウスイベントを全て親コントロールに受け流すようなスマートな方法はないでしょうか。




引用返信 編集キー/
■93013 / inTopicNo.2)  Re[1]: 子コントロールのマウスイベントを全て親コントロールに渡す方法
□投稿者/ KOZ (31回)-(2019/11/14(Thu) 01:00:59)
No93012 (RAGI さん) に返信
> https://qiita.com/yaju/items/b86be7b86c1e54e08e39
> ↑こちらの記事のように、ボタンの上にラベルを重ねたコントロールを作成しています。
> (ボタンの子コントロールとしてラベルを持たせている)

私だったら文字は直接書いてしまいます。
#プロパティに関しては、値が変わったら Invalidate を行うような処理が必要ですが、端折っています。

using System.Drawing;
using System.Windows.Forms;

public class CommentButton : Button
{
    public string CommentText { get; set; } = string.Empty;
    public Color CommentColor { get; set; } = SystemColors.WindowText;
    public Font CommentFont { get; set; } = Control.DefaultFont;

    protected override void OnPaint(PaintEventArgs pevent) {
        base.OnPaint(pevent);
        var g = pevent.Graphics;
        StringFormat stringFormat = new StringFormat();
        stringFormat.Alignment = StringAlignment.Center;
        stringFormat.LineAlignment = StringAlignment.Center;
        SizeF textSize = g.MeasureString(Text, Font, ClientSize, stringFormat);
        int commentHeight = (int)((ClientSize.Height - textSize.Height) / 2);
        int commentTop = ClientRectangle.Bottom - commentHeight;
        Rectangle commentBounds = new Rectangle(ClientRectangle.Left, commentTop, ClientSize.Width, commentHeight);
        using (var brush = new SolidBrush(CommentColor)) {
            g.DrawString(CommentText, CommentFont, brush, commentBounds, stringFormat);
        }
    }
}

使うときは

public partial class Form1 : Form
{
    public Form1() {
        InitializeComponent();

        var button = new CommentButton();
        button.Font = new Font("MS UI Gothic", 18F, FontStyle.Bold,GraphicsUnit.Point);
        button.Bounds = new Rectangle(50, 50, 300, 100);
        button.Text = @"注釈ありボタン";
        button.CommentText= @"※ 注釈コメントがついています。";
        button.CommentFont = new Font("MS UI Gothic", 15F, FontStyle.Bold, GraphicsUnit.Point);
        button.CommentColor = Color.Red;
        Controls.Add(button);
    }
}


引用返信 編集キー/
■93019 / inTopicNo.3)  Re[2]: 子コントロールのマウスイベントを全て親コントロールに渡す方法
□投稿者/ RAGI (2回)-(2019/11/14(Thu) 23:17:18)
No93013 (KOZ さん) に返信

OnPaintは完全に盲点でした!
ご提示いただいたコードでやりたかったことが完璧に実現できました。
ありがとうございます!


解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ