Преобразование растрового изображения в курсор в C#

Преобразование растрового изображения в курсор непросто, но вы можете сделать это, используя функцию API CreateIconIndirect. В этом примере используется следующий метод BitmapToCursor для создания курсора из растрового изображения.

// Создаем курсор из растрового изображения.
private Cursor BitmapToCursor(Bitmap bmp, int hot_x, int hot_y)
{
    // Инициализация информации курсора.
    ICONINFO icon_info = new ICONINFO();
    IntPtr h_icon = bmp.GetHicon();
    GetIconInfo(h_icon, out icon_info);
    icon_info.xHotspot = hot_x;
    icon_info.yHotspot = hot_y;
    icon_info.fIcon = false;    // Курсор, а не значок.

    // Создаем курсор.
    IntPtr h_cursor = CreateIconIndirect(ref icon_info);
    return new Cursor(h_cursor);
}

Загрузите пример и посмотрите на код, чтобы увидеть объявления API.

Этот код создает структуру ICONINFO, чтобы описать созданный ею курсор. Он вызывает метод GetHicon растрового изображения, чтобы получить дескриптор значка, который имеет то же изображение, что и растровое изображение. Он передает этот дескриптор функции API GetIconInfo, чтобы получить данные ICONINFO, описывающие значок.

Далее код устанавливает координаты X и Y в горячую точку курсора, позицию внутри курсора, которая представляет позицию мыши. Например, стрелка курсора обычно использует наконечник стрелки как горячую точку. Крест обычно использовал бы центр курсора как его точку доступа.

Затем код устанавливает свойство ICONINFO структуры fIcon структуры false, чтобы указать, что это должен быть курсор, а не значок. Затем он вызывает метод CreateIconIndirect для создания значка и получения нового дескриптора. Наконец, код передает дескриптор конструктору класса Cursor и возвращает результирующий объект Cursor.

Обратите внимание, что эти функции API выделяют неуправляемую память, которая никогда не освобождается программой. Если программа создает только несколько курсоров, это не проблема. Если программа может создавать сотни курсоров «на лету», это может привести к утечке памяти, которая может быть проблемой. В этом случае используйте функцию DestroyIcon API для выпуска курсоров, которые больше не нужны.

Программа использует следующий код для создания своего курсора.

private void Form1_Load(object sender, EventArgs e)
{
    // Создаем пиксели, соответствующие
    // верхний левый угол прозрачный.
    Bitmap bm = Properties.Resources.Diamond;
    bm.MakeTransparent(bm.GetPixel(0, 0));
    this.Cursor = BitmapToCursor(bm, 7, 7);
}

Программа получает битмап-ресурс с именем Diamond и делает пиксели, соответствующие таковым в верхнем левом углу, прозрачным. Затем он вызывает метод BitmapToCursor и использует результат как курсор формы.

Источник: http://csharphelper.com/blog/2017/01/convert-a-bitmap-into-a-cursor-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)

Add a Comment

Ваш e-mail не будет опубликован. Обязательные поля помечены *