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

Unix/Linux
linux查看内存的大小
在linux下写的代码,用的是utf-8,结果拿到XP下运行的时候,所有的中文都成乱码
linux su和sudo命令的区别
linux cron 下的定时执行工具使用技巧
linux 查找进程及终止进程操作的相关命令
redhat linux 安装 gcc编译器
Linux Mplayer播放各种格式的电影
一起回顾一下linux常用命令
Linux 网站项目发布要做哪些配置
linux SSH配合SecureCRT的密匙完美使用方法
GD 编译出错解决方法
Facebook Open Platform编译FAQ
Linux 系统硬盘 优化
linux 挂载详解
linux crontab定时命令
Linux 系统中确保访问三级域名畅通的方法
Linux 特权帐号VS普通帐号
确保Linux系统安全的前提条件 漏洞防护
Linux 监视系统资源使用率
Red Hat Linux上使用BIND建立DNS服务器

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-01   浏览: 78 ::
收藏到网摘: 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 谢谢,那个小工具已经放到我的主页上了。希望有用