SWT的視覺化控制元件的X11視窗控制程式碼簡介

Just4life發表於2013-08-22
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:

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;

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:

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

這樣我們就得到了這個swt控制元件的X11 ID了。

相關文章