免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6818 | 回复: 2
打印 上一主题 下一主题

[原创]SWT(implemented with gtk)的可视化控件的X11窗口句柄 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-11-14 15:11 |只看该作者 |倒序浏览
--谨献给我一样试图使用JNI把java和naitve window掺和在一起的developer

SWT与AWT本质上都是一套依赖于操作系统具体实现的GUI库。与swing在所有操作系统上外观一致的做法不同,awt和swt在不同的操作系统上的外观是和本地窗口一样的。
    每一个swt和awt的窗口都对应一个本地窗口(native window),自然也会有一个窗口句柄。而swing则不同,是没有本地窗口句柄的。在获得窗口句柄之后,就可以和用其他的语言(比如C++)实现的GUI应用程序进行一些互操作。比如我们可以调用一些SetParene()之类的方法把一个本地的窗口嵌入到一个SWT的窗口里来,反之亦然。这样就提供了一个创建更丰富美观的,可扩充性更强的GUI应用程序的手段。
   
    关于AWT的窗口句柄如何获得,就不多说了。大家可以参考一下你的jdk的安装目录的include子目录,可以看到里面有一个jawt.h,里面有一个很容易看懂的得到系统的window handle的sample. 我是用的linux上的SUN j2sdk 1.4,在include/linux子目录里还可以看到jawt_md.h.里面定义了一个struct:
   

  1.    typedef struct jawt_X11DrawingSurfaceInfo {
  2.     Drawable drawable;
  3.     Display* display;
  4.     VisualID visualID;
  5.     Colormap colormapID;
  6.     int depth;
  7.     /*
  8.      * Since 1.4
  9.      * Returns a pixel value from a set of RGB values.
  10.      * This is useful for paletted color (256 color) modes.
  11.      */
  12.     int (JNICALL *GetAWTColor)(JAWT_DrawingSurface* ds,
  13.         int r, int g, int b);
  14. } JAWT_X11DrawingSurfaceInfo;
  15.    
复制代码

    drawable这个成员其实就是X11的Resource ID.在jawt.h的那个sample中,只要把dsi->;platforminfo转换成jawt_X11DrawingSurfaceInfo类型,就可以得到X11的resource ID了,是不是很容易呢。
   
    至于SWT,所有控件和窗口的父类org.eclipse.swt.widgets.Control有一个成员变量handle.按照SWT的官方API的说法:the handle to the OS resource (Warning: This field is platform dependent) 。如果是Win32平台上,那么这个handle其实就是Win32 API里的那个最常见的HWND。如果用spy++的话可以很容易看到。在linux上就不是这样了。——终于说到正题了看来我还真是能拖戏啊……,hoho ^O^ )。
   
    由于在Linux上,swt是基于不同的本地窗口风格来构建自己的窗口的,所以就有了Motif版的和gtk版的SWT。不知道会不会有QT版的,呵呵。我是用的gtk版本的SWT,所以org.ecllipse.swt.widgets.Control的成员handle并不是X11的resource ID,通过察看swt的source code发现,这个handle其实是一个GtkWidget*类型的变量。OK,我们就可以通过类似这样一段代码来得到X11的resource ID:
   

  1.     JNIEXPORT jlogn JNICALL Java_.......getX11Handle(JNIEnv* env, jobject obj_this, jlong swt_handle)
  2.     {
  3.         GtkWidget* pWidget = (GtkWidget*)((int)swt_handle);
  4.         GdkWindow* pWindow = pWidget->;window;
  5.         int x11id = GDK_WINDOW_XWINDOW(pWindow);
  6.         return (jlong)x11id;
  7.     }
  8.    
复制代码

    这样我们就得到了这个swt控件的X11 ID了。
   
   
    (为了在linux也能查看当前所有的可视窗口的Handle,我写了一小段程序,用树形结构来显示当前已经map了的window的id.
http://www.sakulagi.org/Source/GTk+/SWT-gtk/ListHdl.zip

论坛徽章:
0
2 [报告]
发表于 2003-11-14 17:06 |只看该作者

[原创]SWT(implemented with gtk)的可视化控件的X11窗口句柄

辛苦了

论坛徽章:
0
3 [报告]
发表于 2003-11-16 09:18 |只看该作者

[原创]SWT(implemented with gtk)的可视化控件的X11窗口句柄

谢谢,那个小工具已经放到我的主页上了。希望有用
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP