2009-04-11 16 views
7

Zastanawiam się, czy istnieje sposób na wyodrębnienie obiektu Image z obiektu Cursor w Javie.Wyodrębnij obraz kursora w Javie

Zastosowanie tego byłoby na przykład:

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

które następnie można narysować na przycisku paska narzędzi (to jest cel chcę go).

+0

Interesuje mnie to samo, aby utworzyć niezależny od platformy kursor (odwrócenie osi Y) dla wyboru linii. Nie byłby idealny we wszystkich sytuacjach, ale na pewno byłby blisko. –

Odpowiedz

7

Klasa Cursor jest dość abstrakcyjna - wszystkie ważne rzeczy są przekazywane do kodu natywnego, więc nie można po prostu narysować go w kontekście graphics. Nie ma od razu oczywistego sposobu na obejście potrzeby albo predefiniowania ikon, albo zrobienia tego w natywnym kodzie.


mógłby mi pomóc wykorzystać tę funkcję, o którym mowa?

Poniżej znajduje się kod do rysowania wbudowanych kursorów systemu Windows przy użyciu biblioteki JNA. Jeśli możesz użyć JNA, możesz uniknąć kompilatorów C++.

Prawdopodobnie wykonuję zbyt wiele połączeń natywnych, ale ich koszt nie jest znaczący w przypadku generowania pojedynczych ikon.

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

Kod do wyświetlania kursora jako obraz 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 interfejs:

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

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

Więc może istnieje Wau przy użyciu JNI, aby znaleźć zasób Windows zawierający grafikę i wyciąg, który (ponownie używając JNI)? Nie jestem zaznajomiony z używaniem JNI, więc jeśli ktoś zna sposób, byłbym wdzięczny, że on/ona udostępnił go nam. –

+0

Prawdopodobnie - jaki system operacyjny? – McDowell

+0

Windows. Zgaduję, że wersja nie będzie miała znaczenia, ponieważ prawdopodobnie będzie używane api Win32. Używam vista btw. –

0

Możliwe, że można znaleźć obrazy kursora systemowego ze środowiska JRE. Patrzenie na kod źródłowy również może być interesujące.

+1

hm naprawdę myślałem o czymś bardziej ogólnym, nie ograniczonym do systme kursorów, ale to brzmi jak dobra alternatywa .. –