Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1039132
  • 博文数量: 836
  • 博客积分: 43880
  • 博客等级: 大将
  • 技术积分: 5485
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-20 17:36
文章分类

全部博文(836)

文章存档

2011年(1)

2008年(835)

我的朋友

分类: LINUX

2008-08-20 18:27:01


SWT与AWT本质上都是一套依赖于操作系统具体实现的GUI库。与swing在所有操作系统上外观一致的做法不同,awt和swt在不同的操作系统上的外观是和本地窗口一样的。 每一个swt和awt的窗口都对应一个本地窗口(nativewindow),自然也会有一个窗口句柄。而swing则不同,是没有本地窗口句柄的。在获得窗口句柄之后,就可以和用其他的语言(比如C )实现的GUI应用程序进行一些互操作。比如我们可以调用一些SetParene()之类的方法把一个本地的窗口嵌入到一个SWT的窗口里来,反之亦然。这样就提供了一个创建更丰富美观的,可扩充性更强的GUI应用程序的手段。 关于AWT的窗口句柄如何获得,就不多说了。大家可以参考一下你的jdk的安装目录的include子目录,可以看到里面有一个jawt.h,里面有一个很容易看懂的得到系统的windowhandle的sample.我是用的linux上的SUNj2sdk1.4,在include/linux子目录里还可以看到jawt_md.h.里面定义了一个struct:
typedefstructjawt_X11DrawingSurfaceInfo{
Drawabledrawable;
Display*display;
VisualIDvisualID;
ColormapcolormapID;
intdepth;
/*
*Since1.4
*ReturnsapixelvaluefromasetofRGBvalues.
*Thisisusefulforpalettedcolor(256color)modes.
*/
int(JNICALL*GetAWTColor)(JAWT_DrawingSurface*ds,
intr,intg,intb);
}JAWT_X11DrawingSurfaceInfo;
drawable这个成员其实就是X11的ResourceID.在jawt.h的那个sample中,只要把dsi->platforminfo转换成jawt_X11DrawingSurfaceInfo类型,就可以得到X11的resourceID了,是不是很容易呢。 至于SWT,所有控件和窗口的父类org.eclipse.swt.widgets.Control有一个成员变量handle.按照SWT的官方API的说法:thehandletotheOSresource(Warning:Thisfieldisplatformdependent)。如果是Win32平台上,那么这个handle其实就是Win32API里的那个最常见的HWND。如果用spy 的话可以很容易看到。在linux上就不是这样了。——终于说到正题了看来我还真是能拖戏啊……,hoho^O^)。 由于在Linux上,swt是基于不同的本地窗口风格来构建自己的窗口的,所以就有了Motif版的和gtk版的SWT。不知道会不会有QT版的,呵呵。我是用的gtk版本的SWT,所以org.ecllipse.swt.widgets.Control的成员handle并不是X11的resourceID,通过察看swt的sourcecode发现,这个handle其实是一个GtkWidget*类型的变量。OK,我们就可以通过类似这样一段代码来得到X11的resourceID:
JNIEXPORTjlognJNICALLJava_.......getX11Handle(JNIEnv*env,jobjectobj_this,jlongswt_handle)
{
GtkWidget*pWidget=(GtkWidget*)((int)swt_handle);
GdkWindow*pWindow=pWidget->window;
intx11id=GDK_WINDOW_XWINDOW(pWindow);
}
这样我们就得到了这个swt控件的X11ID了。 (T114)


下载本文示例代码
阅读(467) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~