Использование цветных курсоров в приложении Windows C # - PullRequest
3 голосов
/ 29 ноября 2010

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

Заранее спасибо.

Ответы [ 4 ]

11 голосов
/ 29 ноября 2010

Класс Cursor довольно плохо сделан. По какой-то таинственной причине он использует устаревший интерфейс 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");
2 голосов
/ 30 ноября 2010

Я также пробовал что-то другое, и похоже, что он работает с разными цветными курсорами, но единственная проблема с этим фрагментом кода состоит в том, что координаты горячей точки для курсоров мыши не являются точными, то есть немного смещены вправо. Но это можно исправить, учитывая смещение в коде.

Код выглядит следующим образом:

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;

        }
    }
}
1 голос
/ 29 ноября 2010

Вы можете динамически загружать курсоры из файла следующим образом:

var myCursor = new Cursor("myCursor.cur");

После загрузки вы можете установить курсор любого элемента управления следующим образом:

myControl.Cursor = myCursor;

Курсортакже принимает поток в качестве параметра конструктора.Это означает, что вы можете загружать из ресурса, встроенного в ваше приложение, а не из файловой системы.

Windows не позволит иметь более одного курсора, но вы можете нарисовать более одного на своем элементе управления.Вы можете использовать метод Draw объекта курсора следующим образом:

myCursor.Draw(g, new Rectangle(...));

Если вы используете TCP / IP для отправки данных курсора между клиентами, этого должно быть достаточно для работы.

Однако было несколько приложений, которые поддерживали множественный ввод на одном ПК.(Например, Rag Doll Kung Fu ). Для этого вы смотрите на то, что не поддерживает .NET Framework.

Возможно, вам придется изучить PInvoking некоторые вызовы USB,(У меня нет большого опыта здесь, поэтому я не могу разработать.)

0 голосов
/ 29 ноября 2010

Мне когда-то нужно было создавать динамические курсоры на лету. Оказалось, что это создает странные проблемы, тем более что полупрозрачность смешивается с черным и делает курсоры слишком темными. В конце концов, я решил проблему с помощью SO сообщества, и все решение отображается здесь:

Windows Forms: создание частично прозрачного растрового изображения курсора

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...