当前位置: 首页 > 图文教程 > 操作系统 > Unix/Linux > SWT(implemented with gtk)的可视化控件的X11窗口句柄

Unix/Linux
如何在linux下面运行招商银行专业版
Windows和Linux系统共存 完美解决方案
Linux 和对称多处理应用程序介绍
Red Hat Linux 附加引导和内核引导选项
Linux 2.6.11内核文件IO系统调用详解
走向高手之路 Linux系统内核技术解读
菜鸟乐园 Linux系统内核代码特色一览
Linux内核和传统Unix内核的比较
内核中的物理内存分配函数kernel api
使用 Linux 系统调用的内核命令
详细解析 Linux内核的主要配置选项
内核操作 Linux2.6内核驱动移植参考
Linux内存中Swap和Buffer Cache机制
高手进阶 更换Fedora Core 6的内核
高手风范 Linux操作系统内核编码风格
Linux操作系统内核中工作队列的操作
揭开Linux系统内核调试器的神秘面纱
系统“大挪移” Linux服务器迁移大法
高手进阶 重新编译Linux操作系统的内核
Ubuntu系统关于驱动模块命令的一些使用

Unix/Linux 中的 SWT(implemented with gtk)的可视化控件的X11窗口句柄


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-01   浏览: 230 ::
收藏到网摘: n/a


--谨献给我一样试图使用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:
[code:1:f8fe5d1f80]
typedef struct jawt_X11DrawingSurfaceInfo {
Drawable drawable;
Display* display;
VisualID visualID;
Colormap colormapID;
int depth;
/*
* Since 1.4
* Returns a pixel value from a set of RGB values.
* This is useful for paletted color (256 color) modes.
*/
int (JNICALL *GetAWTColor)(JAWT_DrawingSurface* ds,

int r, int g, int b);
} JAWT_X11DrawingSurfaceInfo;
[/code:1:f8fe5d1f80]
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:
[code:1:f8fe5d1f80]
JNIEXPORT jlogn JNICALL Java_.......getX11Handle(JNIEnv* env, jobject obj_this, jlong swt_handle)
{
GtkWidget* pWidget = (GtkWidget*)((int)swt_handle);
GdkWindow* pWindow = pWidget->window;
int x11id = GDK_WINDOW_XWINDOW(pWindow);
return (jlong)x11id;
}
[/code:1:f8fe5d1f80]
这样我们就得到了这个swt控件的X11 ID了。

[size=9:f8fe5d1f80] (为了在linux也能查看当前所有的可视窗口的Handle,我写了一小段程序,用树形结构来显示当前已经map了的window的id.
http://www.sakulagi.org/Source/GTk+/SWT-gtk/ListHdl.zip
[/size:f8fe5d1f80]
eagerly1 回复于:2003-11-14 17:06:09 辛苦了
sakulagi 回复于:2003-11-16 09:18:51 谢谢,那个小工具已经放到我的主页上了。希望有用