1
2
3
4
5
6 using System;
7 using System.Windows.API;
8
9 namespace System.Windows
10 {
11 public enum StandardCursorId : int
12 {
13 IDC_APPSTARTING = 32650,
14 IDC_ARROW = 32512,
15 IDC_CROSS = 32515,
16 IDC_HAND = 32649,
17 IDC_HELP = 32651,
18 IDC_IBEAM = 32513,
19 IDC_NO = 32648,
20 IDC_SIZEALL = 32646,
21 IDC_SIZENESW = 32643,
22 IDC_SIZENS = 32645,
23 IDC_SIZENWSE = 32642,
24 IDC_SIZEWE = 32644,
25 IDC_UPARROW = 32516,
26 IDC_WAIT = 32514
27 }
28
29 public class Cursor : Resource
30 {
31 public Cursor() : cursorHandle(null), standard(false)
32 {
33 }
34 public Cursor(void* cursorHandle_) : cursorHandle(cursorHandle_), standard(false)
35 {
36 }
37 public Cursor(void* cursorHandle_, bool standard_) : cursorHandle(cursorHandle_), standard(standard_)
38 {
39 }
40 public Cursor(Cursor&& that) : cursorHandle(that.cursorHandle), standard(that.standard)
41 {
42 that.cursorHandle = null;
43 that.standard = false;
44 }
45 public ~Cursor()
46 {
47 if (cursorHandle != null && !standard)
48 {
49 WinDestroyCursor(cursorHandle);
50 }
51 }
52 public default void operator=(Cursor&&);
53 suppress Cursor(const Cursor&);
54 suppress void operator=(const Cursor&);
55 public void* Handle() const
56 {
57 return cursorHandle;
58 }
59 public bool IsStandard() const
60 {
61 return standard;
62 }
63 public void SetStandard()
64 {
65 standard = true;
66 }
67 private void* cursorHandle;
68 private bool standard;
69 }
70
71 [nodiscard]
72 public Result<Cursor> LoadStandardCursor(StandardCursorId cursorId)
73 {
74 void* cursorHandle = WinLoadStandardCursor(cast<int>(cursorId));
75 if (cursorHandle == null)
76 {
77 int errorId = WinAllocateWindowsError("could not load standard cursor", WinGetLastError());
78 return Result<Cursor>(ErrorId(errorId));
79 }
80 return Result<Cursor>(Cursor(cursorHandle, true));
81 }
82
83 [nodiscard]
84 public Result<Cursor> LoadCursor(const string& cursorName)
85 {
86 auto cursorResult = LoadCursor(cursorName.Chars());
87 if (cursorResult.Error())
88 {
89 return Result<Cursor>(ErrorId(cursorResult.GetErrorId()));
90 }
91 return Result<Cursor>(Cursor(cursorResult.Value()));
92 }
93
94 public Cursor GetCursor()
95 {
96 return Cursor(WinGetCursor(), true);
97 }
98
99 public void SetCursor(Cursor* cursor)
100 {
101 WinSetCursor(cursor->Handle());
102 }