Путь разработчика    

Преобразование растрового изображения в курсор в 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/



Отзывы (через Facebook):

Оставить отзыв с помощью аккаунта FaceBook:

Как установить pip в Windows?

pip - система управления пакетами, используемая для установки и управления пакетами программного обеспечения, написанными на Python. Это замена easy_instal...

06 04 2020 6:20:16

Преобразование строки в соответствующий регистр в C#

В надлежащем случае (или титульный регистр) первая буква каждого слова капитализируется. Это довольно легко, когда вы знаете, где найти метод, который прео...

05 04 2020 0:21:42

Программирование на С++ глазами хакера, 2-е издание (Михаил Фленов)

Рассмотрены нестандартные приемы программирования, а также примеры использования недокументированных функций и возможностей языка C++ при разработке шуточн...

04 04 2020 22:43:49

Что делает ключевое слово yield в Python?

Если компилятор определяет ключевое слово yield внутри функции, эта функция больше не возвращается через оператор return. Вместо этого он немедленно возвра...

03 04 2020 2:36:16


Parse error: syntax error, unexpected ',' in /home/users/9/9161484547/domains/flash-mx.ru/lessons/926.php on line 69