Posts C# 윈폼 - 마우스 이벤트를 통과시킬 수 있는 컨트롤 만들기
Post
Cancel

C# 윈폼 - 마우스 이벤트를 통과시킬 수 있는 컨트롤 만들기

목표


  • 마우스 이벤트를 모두 무시할 수 있는 컨트롤(버튼, 레이블 등) 만들기


방법


  • 특정 컨트롤 클래스(Button, Label, …)를 상속받는 클래스를 작성한다.

  • 아래와 같이 프로퍼티와 메소드를 작성한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public bool Ignored { get; set; } = false;

protected override void WndProc(ref Message m)
{
    const int WM_NCHITTEST = 0x0084;
    const int HTTRANSPARENT = (-1);

    if (Ignored && m.Msg == WM_NCHITTEST)
    {
        m.Result = (IntPtr)HTTRANSPARENT;
    }
    else
    {
        base.WndProc(ref m);
    }
}
  • 자신의 Form 클래스에서 직접 해당 컨트롤을 생성하고, 필요한 프로퍼티들을 지정해야 한다.

  • 단점


예시 : 버튼 클래스


IgnorableButton.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class IgnorableButton : Button
{
    public bool Ignored { get; set; } = false;

    protected override void WndProc(ref Message m)
    {
        const int WM_NCHITTEST = 0x0084;
        const int HTTRANSPARENT = (-1);

        if (Ignored && m.Msg == WM_NCHITTEST)
        {
            m.Result = (IntPtr)HTTRANSPARENT;
        }
        else
        {
            base.WndProc(ref m);
        }
    }

    public IgnorableButton(Form parentForm, string name, string text)
    {
        UseVisualStyleBackColor = true;

        this.Name = name;
        this.Text = text;

        parentForm.Controls.Add(this);
    }

    public void SetLocationAndSize(int locX, int locY, int width, int height)
    {
        this.Location = new System.Drawing.Point(locX, locY);
        this.Size = new System.Drawing.Size(width, height);
    }
}


Form1.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public partial class Form1 : Form
{
    IgnorableButton _igbutton;

    public Form1()
    {
        InitializeComponent();
    }
    private void Form1_Load(object sender, EventArgs e)
    {
        _igbutton = new IgnorableButton(this, "iButton1", "IG-Button");
        _igbutton.SetLocationAndSize(250, 200, 200, 100);
        _igbutton.BringToFront();
    }

    private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {
        _igbutton.Ignored = checkBox1.Checked;
    }
}


Preview


2021_0509_IgnorableButton


References


This post is licensed under CC BY 4.0 by the author.