Использование пользовательских цветных курсоров в приложении C# Windows



Я разрабатываю приложение SDG (Single Display Groupware), и для этого мне нужно несколько курсоров (до простейших разных цветов) для одного окна. Я узнал, что с помощью C# можно просто использовать черно-белые курсоры, что не решает мою проблему. Поэтому, пожалуйста, помогите мне с этой проблемой.



Заранее благодарю.

543   4  

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

    Ничего не найдено.