2009-04-11 12 views
7

Mi chiedevo se esiste un modo per estrarre un oggetto Immagine da un oggetto Cursore in Java.Estrai l'immagine del cursore in Java

un uso per questo sarebbe per esempio:

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

che poi possibile disegnare su un pulsante della barra degli strumenti (che è lo scopo che voglio per).

+0

Mi interessa la stessa cosa per creare un cursore fronte-piattaforma indipendente dalla piattaforma (flip sull'asse Y) per le selezioni di linea. Non sarebbe perfetto in tutte le situazioni, ma sicuramente sarebbe vicino. –

risposta

7

La classe Cursor è piuttosto astratta: tutto il materiale importante è delegato al codice nativo, quindi non è sufficiente disegnarne uno al contesto graphics. Non c'è un modo immediatamente ovvio per aggirare la necessità di predefinire le icone o farlo nel codice nativo.


potreste aiutarmi a usare quella funzione che lei ha citato?

Di seguito è riportato un codice per disegnare i cursori di Windows incorporati utilizzando la libreria JNA. Se è possibile utilizzare JNA, è possibile evitare i compilatori C++.

Probabilmente sto facendo troppe chiamate native, ma il costo non è significativo per la generazione di icone one-shot.

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

codice per visualizzare un cursore come immagine Java:

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 Interfaccia: Interfaccia

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:

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

Quindi forse c'è un wau che usa JNI per trovare la risorsa windows che contiene il grafico ed estrarre quello (ancora usando JNI)? Non ho familiarità con l'utilizzo di JNI, quindi se qualcuno conosce un modo in cui sarei grato, lo ha condiviso con noi. –

+0

Probabilmente - quale sistema operativo? – McDowell

+0

Windows. Sto indovinando la versione non importa dal momento che probabilmente verrà utilizzato l'API di Win32. Sto usando Vista btw. –

0

Potrebbe essere possibile trovare le immagini del cursore di sistema da JRE. Anche guardare il codice sorgente potrebbe essere interessante.

+1

hm stavo davvero pensando a qualcosa di più generale non limitato ai cursori di systme ma sembra una buona alternativa .. –