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

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

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

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


(過去ログ 161 を表示中)

[トピック内 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 >>

このトピックに書きこむ

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

管理者用

- Child Tree -