una puntero por personalizado para modificar mano imagen icono estilo cursores cambiar c++ windows mfc cursor sfml

c++ - puntero - imagen para cursor



Cómo usar un cursor personalizado? (2)

Estoy tratando de cambiar el cursor predeterminado del sistema operativo a uno personalizado. A partir de ahora, solo estoy lidiando con Windows. Obtuve un archivo de imagen con el cursor que quiero (.png, ¿debería cambiar el formato?). En general, he estado buscando e intentando simplemente cambiar el cursor, sin éxito. Además, a partir de ahora estoy buscando la solución más simple, con la menor cantidad de líneas de códigos posible.

Si es relevante:
- Estoy usando una ventana creada con SFML (2.1).
-La siguiente compilación pero no hace diferencia:

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

Entonces, estoy buscando el conocimiento de la comunidad, ¿alguna idea?

Los siguientes trabajos :) Sin embargo, inmediatamente vuelve al mouse de Windows predeterminado:

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

Encontré este ENLACE , que parece ser el mismo problema que el mío.
Sin embargo, no puedo aplicar la respuesta que figura en el enlace

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

Yo (¿obviamente?) Obtener:

variable local no inicializada ''windowHandle'' utilizada


Después de aproximadamente 4 horas y 30 minutos tratando de obtener un mouse personalizado trabajando con SFML en Windows, finalmente logré realizar una tarea para la cual no esperaba usar más de 5 a 10 minutos. Como tal, dejo aquí la respuesta a mi propia pregunta, ya que Internet no fue capaz de proporcionarla limpia y clara a un novato como yo. Puede ser útil para quien lo necesite.

#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... :) }

Fuentes:

-Esta solución fue saqueada de todo Internet, pero principalmente de Overcomplicated for a Noob , que también fue mencionada por alguien que borró su respuesta. Mientras es [Overcomplicated for a Noob], parece proporcionar gran información sobre cómo implementar correctamente los cursores personalizados en un programa, así como cómo hacerlo en Apple OS thingy en su lugar
- Esto también fue útil.
-colinsmith mencionó que el archivo de cursor debe ser .cur o .ani, .png en verdad no funciona


  1. La creación de un cursor a partir de un mapa de bits se describe aquí http://www.codeproject.com/Articles/5220/Creating-a-color-cursor-from-a-bitmap La conversión de un png en un mapa de bits se puede hacer fácilmente con CImage. Simplemente cargue el PNG y separe el HBITMAP. Pero un mapa de bits solo no es un Cursor.
  2. Los cursores se establecen por la ventana que recibe WM_SETCURSOR. Entonces "reemplazar" un Cursor específico no funcionará. Debe interceptar el mensaje WM_SETCURSOR para cambiar el cursor que debe devolverse.
  3. Su Edit2 está mal porque necesita un identificador de ventana válido para cambiar el cursor en la clase de una ventana. Pero esto nunca funcionará, si la ventana maneja el Cursor por sí misma (ver 2)

PD: sería mejor informarte cómo maneja Windows los cursores antes de preguntar cómo cambiarlo globalmente ...