Как использовать пользовательский курсор?

Я пытаюсь изменить курсор ОС по умолчанию на пользовательский. На данный момент я имею дело только с Windows. Я получил файл изображения с курсором, который я хочу (.png, я должен изменить формат?). В общем, я искал и пытался просто изменить курсор, но безуспешно. Кроме того, на данный момент я ищу самое простое решение с минимальным количеством строк кода.

При необходимости:
-Я использую окно, созданное с помощью SFML (2.1).
-Следующие компилируются, но без разницы:

HCURSOR hCursor = LoadCursor(NULL, "path/filename.png");
SetCursor(hCursor);

Итак, я ищу знания сообщества, есть идеи?

Следующие работы :) Однако он сразу же возвращается к мыши по умолчанию в Windows:

HCURSOR hCursor = LoadCursorFromFile("path/filename.cur");
SetCursor(hCursor);

Я нашел эту ССЫЛКУ , которая, похоже, является той же проблемой, что и шахта.
Однако я не могу применить ответ, указанный в ссылке

HWND windowHandle;
int GCL_Hcursor = -12; //GCL_HCURSOR
HCURSOR hCursor = LoadCursorFromFile("Graphics/Cursors/Pointer_small.cur");
SetCursor(hCursor);
SetClassLong(windowHandle, GCL_Hcursor, (DWORD)hCursor);

Я (очевидно?) получаю:

  

используется неинициализированная локальная переменная 'windowHandle'

4 голоса | спросил VLV 7 AM00000010000002231 2014, 01:42:22

2 ответа


0

После примерно 4 часов и 30 минут попыток настроить пользовательскую мышь для работы с SFML в Windows мне наконец удалось выполнить задачу, для которой я ожидал использовать не более 5-10 минут. Поэтому я оставляю здесь ответ на свой собственный вопрос, так как Интернет не смог обеспечить его чистоту и ясность для такого нуба, как я. Пусть это будет полезно для тех, кому это может понадобиться.

#include <SFML/Graphics.hpp>
#include <windows.h>

int main()
{
    sf::RenderWindow window(sf::VideoMode(800, 600), "Simple Cursor Demonstration");

    // {This is what matters}
    { 
        sf::WindowHandle wHandle;
        wHandle = window.getSystemHandle();
        HCURSOR Cursor = LoadCursor(NULL, IDC_HAND); // IDC_ARROW IDC_WAIT IDC_HAND...  http://msdn.microsoft.com/en-us/library/ms648391%28v=vs.85%29.aspx
        //HCURSOR Cursor = LoadCursorFromFile("path/filename.cur"); //.cur or .ani
        SetCursor(Cursor);
        SetClassLongPtr(wHandle, GCLP_HCURSOR, reinterpret_cast<LONG_PTR>(Cursor));
    }


    // to prove it works, just move the mouse around
    // not 100% sure the following actually proves it, but the above worked wonders on the project I wanted it for
    window.clear(sf::Color(sf::Color(0, 255, 0))); 
    window.display();
    sf::sleep(sf::milliseconds(3000));

    return 0; //I've read this line or equivalent is a good idea... :)
}

Источники:

-Это решение было разграблено по всему Интернету, но в основном из чрезмерного усложнения для Нуб , о котором также упоминал кто-то, кто удалил свой ответ. Будучи [Слишком сложным для Noob], он, кажется, предоставляет отличную информацию о том, как правильно реализовать пользовательские курсоры в программе, а также о том, как сделать это на Apple OS, вместо этого
- Это также было полезно.
-colinsmith упомянул, что файл курсора должен быть .cur или .ani, .png действительно не работает

ответил VLV 8 AM00000030000001731 2014, 03:22:17
0
  1. Создание курсора из растрового изображения описано здесь http://www.codeproject.com/Articles/5220/Creating-a-color-cursor-from-a-bitmap Преобразование PNG в растровое изображение может быть легко сделано с помощью CImage. Просто загрузите PNG и отсоедините HBITMAP. Но только растровое изображение не является курсором.
  2. Курсоры устанавливаются окном, которое получает WM_SETCURSOR. Таким образом, «замена» определенного курсора не будет работать. Вы должны перехватить сообщение WM_SETCURSOR, чтобы изменить курсор, который должен быть возвращен.
  3. Ваш Edit2 неверен, потому что вам нужен правильный дескриптор окна, чтобы изменить курсор в классе окна. Но это никогда не сработает, если окно обрабатывает курсор самостоятельно (см. 2).

PS. Было бы лучше узнать, как Windows обрабатывает курсоры, прежде чем спрашивать, как изменить его глобально ...

ответил xMRi 7 AM00000090000000531 2014, 09:58:05

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132