2009-04-11 19 views
7

Me preguntaba si hay una forma de extraer un objeto Imagen de un objeto Cursor en Java.Extraer la imagen del cursor en Java

Un uso para esto sería por ejemplo:

Image img = extractCursorImage(Cursor.getDefaultCursor()); 

que luego se puede dibujar en un botón de la barra de herramientas (que es el propósito para lo quiero).

+0

Estoy interesado en lo mismo para crear una plataforma independiente del cursor hacia la derecha (giro en el eje Y) para la selección de líneas. No sería perfecto en todas las situaciones, pero seguro estaría cerca. –

Respuesta

7

La clase Cursor es bastante abstracta: todo lo importante se delega en el código nativo, por lo que no se puede dibujar uno en el contexto graphics. No hay una forma inmediata obvia de evitar la necesidad de predefinir los iconos o hacerlo en el código nativo.


podría usted ayudarme a usar esa función que usted ha mencionado?

A continuación se muestra un código para dibujar los cursores incorporados de Windows utilizando la biblioteca JNA. Si puede usar JNA, puede evitar los compiladores de C++.

Probablemente haga demasiadas llamadas nativas, pero el costo no es significativo para la generación de iconos de una sola vez.

hand cursor drawn in Java http://f.imagehost.org/0709/hand.png

Código para mostrar un cursor sobre una imagen Java como:

public class LoadCursor { 

    public static void draw(BufferedImage image, int cursor, 
     int diFlags) { 
    int width = image.getWidth(); 
    int height = image.getHeight(); 

    User32 user32 = User32.INSTANCE; 
    Gdi32 gdi32 = Gdi32.INSTANCE; 

    Pointer hIcon = user32 
     .LoadCursorW(Pointer.NULL, cursor); 
    Pointer hdc = gdi32.CreateCompatibleDC(Pointer.NULL); 
    Pointer bitmap = gdi32.CreateCompatibleBitmap(hdc, 
     width, height); 

    gdi32.SelectObject(hdc, bitmap); 
    user32.DrawIconEx(hdc, 0, 0, hIcon, width, height, 0, 
     Pointer.NULL, diFlags); 

    for (int x = 0; x < width; x++) { 
     for (int y = 0; y < width; y++) { 
     int rgb = gdi32.GetPixel(hdc, x, y); 
     image.setRGB(x, y, rgb); 
     } 
    } 

    gdi32.DeleteObject(bitmap); 
    gdi32.DeleteDC(hdc); 
    } 

    public static void main(String[] args) { 
    final int width = 128; 
    final int height = 128; 

    BufferedImage image = new BufferedImage(width, height, 
     BufferedImage.TYPE_INT_ARGB); 
    draw(image, User32.IDC_HAND, User32.DI_NORMAL); 
    BufferedImage mask = new BufferedImage(width, height, 
     BufferedImage.TYPE_INT_RGB); 
    draw(mask, User32.IDC_HAND, User32.DI_MASK); 
    applyMask(image, mask); 

    JLabel icon = new JLabel(); 
    icon.setIcon(new ImageIcon(image)); 

    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setContentPane(icon); 
    frame.pack(); 
    frame.setVisible(true); 
    } 

    private static void applyMask(BufferedImage image, 
     BufferedImage mask) { 
    int width = image.getWidth(); 
    int height = image.getHeight(); 
    for (int x = 0; x < width; x++) { 
     for (int y = 0; y < height; y++) { 
     int masked = mask.getRGB(x, y); 
     if ((masked & 0x00FFFFFF) == 0) { 
      int rgb = image.getRGB(x, y); 
      rgb = 0xFF000000 | rgb; 
      image.setRGB(x, y, rgb); 
     } 
     } 
    } 
    } 

} 

User32.dll interfaz:

public interface User32 extends Library { 

    public static User32 INSTANCE = (User32) Native 
     .loadLibrary("User32", User32.class); 

    /** @see #LoadCursorW(Pointer, int) */ 
    public static final int IDC_ARROW = 32512; 
    /** @see #LoadCursorW(Pointer, int) */ 
    public static final int IDC_IBEAM = 32513; 
    /** @see #LoadCursorW(Pointer, int) */ 
    public static final int IDC_WAIT = 32514; 
    /** @see #LoadCursorW(Pointer, int) */ 
    public static final int IDC_CROSS = 32515; 
    /** @see #LoadCursorW(Pointer, int) */ 
    public static final int IDC_UPARROW = 32516; 
    /** @see #LoadCursorW(Pointer, int) */ 
    public static final int IDC_SIZENWSE = 32642; 
    /** @see #LoadCursorW(Pointer, int) */ 
    public static final int IDC_SIZENESW = 32643; 
    /** @see #LoadCursorW(Pointer, int) */ 
    public static final int IDC_SIZEWE = 32644; 
    /** @see #LoadCursorW(Pointer, int) */ 
    public static final int IDC_SIZENS = 32645; 
    /** @see #LoadCursorW(Pointer, int) */ 
    public static final int IDC_SIZEALL = 32646; 
    /** @see #LoadCursorW(Pointer, int) */ 
    public static final int IDC_NO = 32648; 
    /** @see #LoadCursorW(Pointer, int) */ 
    public static final int IDC_HAND = 32649; 
    /** @see #LoadCursorW(Pointer, int) */ 
    public static final int IDC_APPSTARTING = 32650; 
    /** @see #LoadCursorW(Pointer, int) */ 
    public static final int IDC_HELP = 32651; 
    /** @see #LoadCursorW(Pointer, int) */ 
    public static final int IDC_ICON = 32641; 
    /** @see #LoadCursorW(Pointer, int) */ 
    public static final int IDC_SIZE = 32640; 

    /** @see #DrawIconEx(Pointer, int, int, Pointer, int, int, int, Pointer, int) */ 
    public static final int DI_COMPAT = 4; 
    /** @see #DrawIconEx(Pointer, int, int, Pointer, int, int, int, Pointer, int) */ 
    public static final int DI_DEFAULTSIZE = 8; 
    /** @see #DrawIconEx(Pointer, int, int, Pointer, int, int, int, Pointer, int) */ 
    public static final int DI_IMAGE = 2; 
    /** @see #DrawIconEx(Pointer, int, int, Pointer, int, int, int, Pointer, int) */ 
    public static final int DI_MASK = 1; 
    /** @see #DrawIconEx(Pointer, int, int, Pointer, int, int, int, Pointer, int) */ 
    public static final int DI_NORMAL = 3; 
    /** @see #DrawIconEx(Pointer, int, int, Pointer, int, int, int, Pointer, int) */ 
    public static final int DI_APPBANDING = 1; 

    /** http://msdn.microsoft.com/en-us/library/ms648391(VS.85).aspx */ 
    public Pointer LoadCursorW(Pointer hInstance, 
     int lpCursorName); 

    /** http://msdn.microsoft.com/en-us/library/ms648065(VS.85).aspx */ 
    public boolean DrawIconEx(Pointer hdc, int xLeft, 
     int yTop, Pointer hIcon, int cxWidth, int cyWidth, 
     int istepIfAniCur, Pointer hbrFlickerFreeDraw, 
     int diFlags); 

} 

Gdi32.dll interfaz:

public interface Gdi32 extends Library { 

    public static Gdi32 INSTANCE = (Gdi32) Native 
     .loadLibrary("Gdi32", Gdi32.class); 

    /** http://msdn.microsoft.com/en-us/library/dd183489(VS.85).aspx */ 
    public Pointer CreateCompatibleDC(Pointer hdc); 

    /** http://msdn.microsoft.com/en-us/library/dd183488(VS.85).aspx */ 
    public Pointer CreateCompatibleBitmap(Pointer hdc, 
     int nWidth, int nHeight); 

    /** http://msdn.microsoft.com/en-us/library/dd162957(VS.85).aspx */ 
    public Pointer SelectObject(Pointer hdc, Pointer hgdiobj); 

    /** http://msdn.microsoft.com/en-us/library/dd145078(VS.85).aspx */ 
    public int SetPixel(Pointer hdc, int X, int Y, int crColor); 

    /** http://msdn.microsoft.com/en-us/library/dd144909(VS.85).aspx */ 
    public int GetPixel(Pointer hdc, int nXPos, int nYPos); 

    /** http://msdn.microsoft.com/en-us/library/dd183539(VS.85).aspx */ 
    public boolean DeleteObject(Pointer hObject); 

    /** http://msdn.microsoft.com/en-us/library/dd183533(VS.85).aspx */ 
    public boolean DeleteDC(Pointer hdc); 

} 
+0

Entonces, ¿tal vez hay un wau que usa JNI para encontrar el recurso de Windows que contiene el gráfico y extraerlo (de nuevo usando JNI)? No estoy familiarizado con el uso de JNI, así que si alguien sabe de qué manera le agradecería que lo haya compartido con nosotros. –

+0

Probablemente, ¿qué sistema operativo? – McDowell

+0

Windows. Supongo que la versión no importará, ya que probablemente se utilizará la API Win32. Estoy usando vista por cierto. –

0

Es posible encontrar las imágenes del cursor del sistema desde JRE. Ver el código fuente también puede ser interesante.

+1

hm en realidad estaba pensando en algo más general no restringido en los cursores de sistema pero eso suena como una buena alternativa ... –

Cuestiones relacionadas