`
yiqieanhao
  • 浏览: 66139 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

鼠标样式的相关问题

    博客分类:
  • JAVA
阅读更多
JAVA对于底层对象比如鼠标等还是得依靠JNI或是JNA来处理,这里记录下如何实现鼠标的获取、是否是默认鼠标样式判断等。

获取鼠标样式并显示:
import java.awt.image.BufferedImage;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

import com.sun.jna.Pointer;

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);
	        }
	      }
	    }
	  }

	}


判断鼠标是否是默认样式
import com.sun.jna.Pointer;

public class CursorTest {

	public static boolean isDefaultCursor() {

		final int width = 128;
		final int height = 128;

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

		Pointer hIcon = user32.LoadCursorW(Pointer.NULL, User32.IDC_HAND);
		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,
				User32.DI_MASK);

		for (int x = 0; x < width; x++) {
			for (int y = 0; y < width; y++) {
				int rgb = gdi32.GetPixel(hdc, x, y);
				// System.out.print(rgb+",");
				if (rgb == 0)
					return true;
			}
		}

		return false;
	}

	public static void main(String[] args) {

		boolean defaultCursor = isDefaultCursor();
		System.out.println(defaultCursor);
	}

}


相关类:
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;

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);

	}


import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;

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);

	}
分享到:
评论

相关推荐

    解决css中hover做遮盖罩闪动问题(推荐)

    主要介绍了解决css中hover做遮盖罩闪动问题的相关知识,需要的朋友可以参考下

    Jquery编写的替换系统title提示

    为了更好的用户体验或者SEO优化,我们一般会在按钮、链接或者图片的鼠标经过事件中添加一个提示,如果只是为了SEO优化,用title、alter方法是个好主意,但如果不止这些,比如还要让用户知道这个按钮的用途及相关信息...

    openLayers geoserver常见问题

    WebGIS相关的OpenGIS规范 58 geoserver中地图以外的区域以自定义图片填充 62 怎样修改 geoServer 的用户名密码 65 GeoServer中的WMS服务生成的png图片背景色为透明 65 比例尺 65 需不需要一个layer对应一个store 66 ...

    CCTalk4-5-18-92.exe

    3.改进了CT程序内网页相关功能的稳定性 CCTalk4.5.16.76 1.支持答题功能,目前支持单选题,并且可以设置题干和答案 2.支持给老师献花,献花由参加答题答对获得 3.优化了讲义上传速度和体验,支持显示上传进度 4....

    Flash大转盘模板.rar

    解决了用样式和JS实现转盘抽奖活动效果不佳的问题。 功能如下: 1.只需换几张图片就可以完成转盘,资源名称随便定义; 2.奖品数量可控制; 3.按钮灵活定义!; 4.指针自动旋转效果; 5.鼠标指针效果可以启用; 6.兼容...

    asp.net中GridView数据鼠标移入显示提示信息

    问题提出: 在asp.net开发中,如果有这样的一个需求,如果在列表控件,如GridView中的某列中显示的是一个计算公式得出的值,那么需求来了,鼠标移入该数字,显示该数字的计算公式和过程,如何做? 解决方案分析: ...

    YxB2B V4.1商务网.rar

    26、增加会员资讯页显示发布会员相关信息功能; 27、增加截取信息鼠标指向提示功能; 28、增加公司库及公司列表等页显示会员等级图标功能; 29、增加未通过审核供求、产品原因反馈功能; 30、增加过期供求、产品...

    Altium Designer Beta 19.0.10完整版安装包+安装教程+和谐文件

    修复了一个问题,即在重命名相关的PCB文档后,Draftsman会崩溃。 26542 修复了回归,其中未选择丝网印刷图形的组件的装配视图中缺少阴影线(BC:9416)。 26867 修复了回归,其中没有显示缺少3D体的Not Fitted组件的...

    易语言程序免安装版下载

    6) 修改MYSQL支持库跨静态编译的EXE和DLL传递连接句柄和记录集句柄无效的BUG(改动较大,可能会产生兼容性问题,我们已经仔细测试,也请使用到此库的用户帮助我们多多测试,以便及早发现问题,谢谢) 7) 其它修改 ...

    HTML5跨屏框架ZUI 1.9.1

    修复了有时在单元格上点击鼠标右键,弹出的右键菜单上没有包含单元格相关菜单项的问题;新增通过placeholder选项为编辑器设置并显示没有内容时的占位提示文本;新增通过pasteImage选项实现贴图自动上传功能;新增...

    KODExplorer 芒果云-资源管理器

    - ie 8~10样式问题调整 ###ver2.6 `2014/7/6` ---- ####update: - 完全性优化;加入严格的校验机制 - 首次运行环境检测[data目录检测,必须的函数支持提示] - 上传已存在处理——创建副本(另外包括粘贴,解压) ...

    ZUI前端html5框架 v1.9.1.zip

    现在可以使用颜色命名的辅助类添加文本颜色、背景样式,包括(.text-red,.text-green,.bg-yellow,hl-blue 等); 对话框触发器: 支持使用 className 选项来指定生成的对话框额外添加的 CLASS 属性; 图表: ...

    DataGridView控件使用大全(转+中文对应)

    大部分章节含有一个“Q & A”部分,来回答该章节相关的一些常见问题。注意,某些问题会由于知识点的关联性重复出现在多个章节。这些问题、答案及其附带的示例代码都包含在本文档的附录部分。 一、...

    第34章 项目1-博客前端:封装库--百度分享侧栏1

    引入相关代码,但我们还是需要了解一下这种效果是如何完成的。一.问题所在第一步,先使用 CSS 把百度侧栏分享滑动的样式整理好。第二步,滑动的侧栏主要是由鼠标移入

    TnTrayIcon XE8

    随鼠标指针的提示文本, 这是老式的, 下面有新型的. TrayIcon.BalloonHint、BalloonTitle、BalloonFlags、BalloonTimeout 这都是新型的 Hint 相关的. TrayIcon.BalloonHint: Hint 文本 TrayIcon.BalloonTitle: Hint ...

    sketch-71-symbol-resync:修复了Sketch 71中缺少的库ID问题

    如果文档中的符号和共享样式已停止在检查器中显示其源库,而是显示“此文档”,则您将遇到此问题。 用法 下载并安装插件(有关更多详细信息,请参见“安装”部分) 直接从Cloud中打开有问题的文档,选择一个Symbol...

    IBM WebSphere Portal门户开发笔记01

    42、CSS鼠标样式 319 43、IFRAME WINDOW、DOCUMENT获取与其他 320 44、CSS Z-INDEX 取值范围 320 45、CSS背景图片与内容放大与缩小时相对定位 321 46、JS ATTACHEVENT与ADDEVENTLISTENER区别 321 47、JS WINDOW....

    dux 6.0.zip

    修改 文章修改鼠标滑过背景色及添加彩色边框效果 更新记录 5.3版本更新: 新增全面兼容 PHP 7.3 新增对WordPress5.0+新版编辑器的兼容支持 新增登录注册找回密码链接的 nofollow 更新Awesome图标库到最新版5.7.2,...

Global site tag (gtag.js) - Google Analytics