2009-04-11 10 views
7

JavaのCursorオブジェクトからImageオブジェクトを抽出する方法があるのだろうかと思いました。Javaでのカーソルイメージの抽出

このため、使用は、例えば次のようになります。

あなたはその後、ツールバーのボタンの上に描画することができ
Image img = extractCursorImage(Cursor.getDefaultCursor()); 

(それは私がそれをしたい目的です)。

+0

私は、ライン選択のために、プラットフォームに依存しない右向きカーソル(Y軸上にフリップ)を作成するのと同じことに興味があります。それはすべての状況で完璧ではないだろうが、確かに近いだろう。 –

答えて

7

Cursorクラスはかなり抽象的です - すべての重要なものはネイティブコードに委任されていますので、graphicsコンテキストに描画することはできません。アイコンを事前定義するかネイティブコードで行うかの必要性を直ちに理解する方法はすぐにはありません。


あなたは私はあなたが言及し、その関数を使用するのに役立つだろうか?

以下は、JNAライブラリを使用して組み込みのWindowsカーソルを描画するためのコードです。 JNAを使用することができれば、C++コンパイラを避けることができます。

おそらくネイティブコールが多すぎますが、コストはワンショットアイコンの生成には重要ではありません。

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

コードは、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のインタフェース:

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

それでは、JNIを使​​ってグラフィックを含むウィンドウリソースを見つけ、それを抽出するためのwauがあります(再びJNIを使​​用しています)? 私はJNIの使用に慣れていないので、誰かが私が感謝する方法を知っているなら、彼/彼女は私たちとそれを共有しました。 –

+0

おそらく - どのオペレーティングシステムですか? – McDowell

+0

Windows。おそらくWin32 APIが使用されるので、私はバージョンを推測していません。私はビスタbtwを使用しています。 –

0

JREからシステムカーソルイメージを見つけることができます。ソースコードを見ることも興味深いかもしれません。

+1

hm私は実際にはより一般的なものを考えていましたが、それはsystmeカーソルに制限されていませんでしたが、それは良い選択肢のように思えます。 –

関連する問題