我想知道是否有办法从
Java中的Cursor对象中提取Image对象.
例如:用于此目的:
Image img = extractCursorImage(Cursor.getDefaultCursor());
然后,您可以在工具栏按钮上绘制(这是我想要的目的).
解决方法
Cursor类非常抽象 – 所有重要的东西都被委托给本机代码,所以你不能只在
graphics上下文中绘制一个.没有一种直接明显的方法来满足预定义图标或在本机代码中执行此操作的需要.
could you help me use that function you mentioned?
下面是使用JNA库绘制内置Windows游标的一些代码.如果您可以使用JNA,则可以避免使用C编译器.
我可能会拨打太多原生电话,但是对于一次性图标生成而言,成本并不高.
hand cursor drawn in Java http://f.imagehost.org/0709/hand.png
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,hIcon,height,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,BufferedImage.TYPE_INT_ARGB); draw(image,User32.IDC_HAND,User32.DI_NORMAL); BufferedImage mask = new BufferedImage(width,BufferedImage.TYPE_INT_RGB); draw(mask,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,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,Pointer,int) */ public static final int DI_COMPAT = 4; /** @see #DrawIconEx(Pointer,int) */ public static final int DI_DEFAULTSIZE = 8; /** @see #DrawIconEx(Pointer,int) */ public static final int DI_IMAGE = 2; /** @see #DrawIconEx(Pointer,int) */ public static final int DI_MASK = 1; /** @see #DrawIconEx(Pointer,int) */ public static final int DI_NORMAL = 3; /** @see #DrawIconEx(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); }