IT/C#

[C#] 선택된 사각형 위에서 마우스커서 모양 변경하기

Ella.J 2022. 4. 6. 15:17
728x90
반응형

WinForm을 다루다 보면 마우스 커서의 모양을 변경해야 하는 경우가 있다.

이는 아래의 ChangeCursor(Control control) 처럼 컨트롤을 받아와서

컨트롤 위에서의 커서를 변경한다.

control.Cursor = Cursors.SizeNWSE;

커서 종류는 Visual Studio환경에서 Cursors. 하고 Ctrl+SPACE 눌러보면 확인할 수 있다.

 

아래의 코드는 입력된 Left, Top, Width, Bottom을 pictureBox1에 그리는데,

그려진 빨간 선 위에서 마우스의 커서모양이 변경되도록 한 코드이다.

pictureBox1_MouseMove 이벤트에서 마우스가 움직일 때

그려진 선 위에 마우스 커서가 위치하는 지 확인한 후에 커서 모양을 변경해준다.

 

마우스 위치별 커서 모양 및 이름
CheckMousePosition 함수의 사각형 외부에서 커서 변경 여부 차이

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
public Rectangle CropR;
public static bool MouseInLeft { get; set; }
public static bool MouseInRight { get; set; }
public static bool MouseInTop { get; set; }
public static bool MouseInBottom { get; set; }
 
public Form1()
{
    InitializeComponent();
}
 
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    CropR = new Rectangle(5050400300);
    CheckMousePosition(CropR, new Point(e.X, e.Y), true);
    ChangeCursor(pictureBox1);
}
 
private static void CheckMousePosition(Rectangle r, Point e, bool OnlyRectangle)
{
    if (OnlyRectangle) //사각형 내부에서만 마우스 커서 변경
    {
        MouseInLeft = (Math.Abs(e.X - r.X) <= 5&& (e.Y > r.Y) && (e.Y < r.Y + r.Height);
        MouseInRight = (Math.Abs(e.X - r.X - r.Width) <= 5&& (e.Y > r.Y) && (e.Y < r.Y + r.Height);
        MouseInTop = (Math.Abs(e.Y - r.Y) <= 5&& (e.X > r.X) && (e.X < r.X + r.Width);
        MouseInBottom = (Math.Abs(e.Y - r.Y - r.Height) <= 5&& (e.X > r.X) && (e.X < r.X + r.Width);
    } else // 사각형 외부에서도 마우스 커서 변경
    {
        MouseInLeft = (Math.Abs(e.X - r.X) <= 5);
        MouseInRight = (Math.Abs(e.X - r.X - r.Width) <= 5);
        MouseInTop = (Math.Abs(e.Y - r.Y) <= 5);
        MouseInBottom = (Math.Abs(e.Y - r.Y - r.Height) <= 5);
    }
}
 
private static void ChangeCursor(Control control)
{
    if (MouseInLeft)
    {
        if (MouseInTop)
        {
            control.Cursor = Cursors.SizeNWSE;
        }
        else if (MouseInBottom)
        {
            control.Cursor = Cursors.SizeNESW;
        }
        else
        {
            control.Cursor = Cursors.SizeWE;
        }
    }
    else if (MouseInRight)
    {
        if (MouseInTop)
        {
            control.Cursor = Cursors.SizeNESW;
        }
        else if (MouseInBottom)
        {
            control.Cursor = Cursors.SizeNWSE;
        }
        else
        {
            control.Cursor = Cursors.SizeWE;
        }
    }
    else if (MouseInTop || MouseInBottom)
    {
        control.Cursor = Cursors.SizeNS;
    }
    else
    {
        control.Cursor = Cursors.Default;
    }
}
cs

 

728x90
반응형