Skip to content

Commit 8a45e25

Browse files
committed
refactor: rewrite custom WM_NCHITTEST implementation on Windows
1 parent 4e41a62 commit 8a45e25

File tree

1 file changed

+28
-42
lines changed

1 file changed

+28
-42
lines changed

src/Native/Windows.cs

Lines changed: 28 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -24,34 +24,6 @@ internal struct RECT
2424
public int bottom;
2525
}
2626

27-
internal enum HitTest
28-
{
29-
HTERROR = -2,
30-
HTTRANSPARENT = -1,
31-
HTNOWHERE = 0,
32-
HTCLIENT = 1,
33-
HTCAPTION = 2,
34-
HTSYSMENU = 3,
35-
HTGROWBOX = 4,
36-
HTMENU = 5,
37-
HTHSCROLL = 6,
38-
HTVSCROLL = 7,
39-
HTMINBUTTON = 8,
40-
HTMAXBUTTON = 9,
41-
HTLEFT = 10,
42-
HTRIGHT = 11,
43-
HTTOP = 12,
44-
HTTOPLEFT = 13,
45-
HTTOPRIGHT = 14,
46-
HTBOTTOM = 15,
47-
HTBOTTOMLEFT = 16,
48-
HTBOTTOMRIGHT = 17,
49-
HTBORDER = 18,
50-
HTOBJECT = 19,
51-
HTCLOSE = 20,
52-
HTHELP = 21
53-
}
54-
5527
[StructLayout(LayoutKind.Sequential)]
5628
internal struct MARGINS
5729
{
@@ -103,32 +75,46 @@ public void SetupWindow(Window window)
10375
handled = true;
10476

10577
if (window.WindowState == WindowState.FullScreen || window.WindowState == WindowState.Maximized)
106-
return (IntPtr)HitTest.HTCLIENT;
78+
return 1; // HTCLIENT
10779

10880
var p = IntPtrToPixelPoint(lParam);
10981
GetWindowRect(hWnd, out var rcWindow);
11082

11183
var borderThinkness = (int)(4 * window.RenderScaling);
112-
int row = 1;
113-
int col = 1;
84+
int y = 1;
85+
int x = 1;
11486
if (p.X >= rcWindow.left && p.X < rcWindow.left + borderThinkness)
115-
col = 0;
87+
x = 0;
11688
else if (p.X < rcWindow.right && p.X >= rcWindow.right - borderThinkness)
117-
col = 2;
89+
x = 2;
11890

11991
if (p.Y >= rcWindow.top && p.Y < rcWindow.top + borderThinkness)
120-
row = 0;
92+
y = 0;
12193
else if (p.Y < rcWindow.bottom && p.Y >= rcWindow.bottom - borderThinkness)
122-
row = 2;
94+
y = 2;
12395

124-
ReadOnlySpan<HitTest> zones = stackalloc HitTest[]
96+
var zone = y * 3 + x;
97+
switch (zone)
12598
{
126-
HitTest.HTTOPLEFT, HitTest.HTTOP, HitTest.HTTOPRIGHT,
127-
HitTest.HTLEFT, HitTest.HTCLIENT, HitTest.HTRIGHT,
128-
HitTest.HTBOTTOMLEFT, HitTest.HTBOTTOM, HitTest.HTBOTTOMRIGHT
129-
};
130-
131-
return (IntPtr)(zones[row * 3 + col]);
99+
case 0:
100+
return 13; // HTTOPLEFT
101+
case 1:
102+
return 12; // HTTOP
103+
case 2:
104+
return 14; // HTTOPRIGHT
105+
case 3:
106+
return 10; // HTLEFT
107+
case 4:
108+
return 1; // HTCLIENT
109+
case 5:
110+
return 11; // HTRIGHT
111+
case 6:
112+
return 16; // HTBOTTOMLEFT
113+
case 7:
114+
return 15; // HTBOTTOM
115+
default:
116+
return 17; // HTBOTTOMRIGHT
117+
}
132118
}
133119

134120
return IntPtr.Zero;

0 commit comments

Comments
 (0)