Использование пользовательских цветных курсоров в приложении C# Windows
Я разрабатываю приложение SDG (Single Display Groupware), и для этого мне нужно несколько курсоров (до простейших разных цветов) для одного окна. Я узнал, что с помощью C# можно просто использовать черно-белые курсоры, что не решает мою проблему. Поэтому, пожалуйста, помогите мне с этой проблемой.
Заранее благодарю.
4 ответов:
Класс Курсора выполнен довольно плохо. По какой-то загадочной причине он использует устаревший COM-интерфейс (IPicture), который не поддерживает цветные и анимированные курсоры. Это можно исправить с помощью довольно уродливой смазки локтя:
using System; using System.ComponentModel; using System.Windows.Forms; using System.Runtime.InteropServices; using System.Reflection; static class NativeMethods { public static Cursor LoadCustomCursor(string path) { IntPtr hCurs = LoadCursorFromFile(path); if (hCurs == IntPtr.Zero) throw new Win32Exception(); var curs = new Cursor(hCurs); // Note: force the cursor to own the handle so it gets released properly var fi = typeof(Cursor).GetField("ownHandle", BindingFlags.NonPublic | BindingFlags.Instance); fi.SetValue(curs, true); return curs; } [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] private static extern IntPtr LoadCursorFromFile(string path); }Пример использования:
this.Cursor = NativeMethods.LoadCustomCursor(@"c:\windows\cursors\aero_busy.ani");
Я также попробовал что-то другое, и это, кажется, работает с разными цветными курсорами, но единственная проблема с этим куском кода заключается в том, что координаты точки доступа для курсоров мыши не точны, т. е. они немного сдвинуты вправо. Но это можно исправить, рассмотрев смещение в коде.
Код выглядит следующим образом:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; using System.Runtime.InteropServices; namespace MID { public partial class CustomCursor : Form { [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] public static extern IntPtr LoadCursorFromFile(string filename); public CustomCursor() { InitializeComponent(); Bitmap bmp = (Bitmap)Bitmap.FromFile("Path of the cursor file saved as .bmp"); bmp.MakeTransparent(Color.Black); IntPtr ptr1 = blue.GetHicon(); Cursor cur = new Cursor(ptr1); this.Cursor = cur; } } }
Вы можете динамически загружать курсоры из файла следующим образом:
var myCursor = new Cursor("myCursor.cur");После того, как вы загрузили его, вы можете установить курсор любого элемента управления следующим образом:
myControl.Cursor = myCursor;Курсор также принимает поток в качестве параметра конструктора. Это означает, что вы можете загружать данные из ресурса, встроенного в приложение, а не из файловой системы.
Windows не позволит вам иметь более одного курсора, но вы можете нарисовать более одного на вашем элементе управления. Вы можете использовать объект курсора
Drawметод такой:myCursor.Draw(g, new Rectangle(...));Если вы используете TCP/IP для передачи данных курсора между клиентами, то этого должно быть достаточно для работы.
Тем не менее, было несколько приложений, которые поддерживали несколько входов на одном ПК. (Например, тряпичная кукла Кунг-Фу ) для этого вы смотрите на то, что платформа .NET framework не поддерживает.
Вам, вероятно, придется посмотреть на PInvoking некоторые вызовы USB. (У меня нет большого опыта здесь, поэтому я не могу ellaborate.)
Когда-то мне нужно было создавать динамические курсоры на лету. Это, как оказалось, создавало странные проблемы, тем более что полупрозрачность смешивалась с черным и делала курсоры слишком темными. В конце концов я решил проблему с некоторой помощью сообщества SO, и все решение отображается здесь:
Windows Forms: создание растрового изображения курсора частично прозрачным
Comments