c++ - переместить - свой курсор c#




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

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

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

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

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

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

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

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

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' используется


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

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


Примерно через 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... :)
}

Источники:

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





sfml