用程序窗口中。
窗口大小的变化:当我们的 SWT 窗口的位置或大小发生变化时,我们要通知本地应用程序窗口改变它的位置或大小。
首先我们来看窗口的创建和销毁。我们需要监听 SWT 窗口的 Paint 事件和 Dispose 事件,在响应 Paint 事件中创建本地应用程序窗口,在响应 Dispose 事件中关闭本地应用程序窗口。需要注意的是,我们创建本地应用窗口可能需要花较长的时间,为了避免阻塞 UI 线程,我们将其放在一个线程中执行。如下面的清单所示:
public class NativeControl extends Canvas{
private int childWnd = 0}
private String startCommand = null}
private String wndClassName = null}
private boolean isCreatingNative = false}
public NativeControl(Composite parent, int style) {
super(parent, style)}
this.addPaintListener(new PaintListener(){
public void paintControl(PaintEvent arg0) {
this.addPaintListener(new PaintListener(){
public void paintControl(PaintEvent arg0) {
if(childWnd==0 && !isCreatingNative){
isCreatingNative = true}
Thread thread = new Thread(){
public void run(){
childWnd = ReparentUtil.startAndReparent(
NativeControl.this.handle,startCommand,wndClassName)}
}
}}
thread.start()}
}
}
})}
}
})}
this.addDisposeListener(new DisposeListener(){
public void widgetDisposed(DisposeEvent arg0) {
if(childWnd!=0){
OS.SendMessage(childWnd, OS.WM_CLOSE, 0, 0)}
}
}
});
集成Windows本地应用到Eclipse RCP程序中(6)
时间:2011-02-15 IBM 梁骞 李辉
在 paintControl(PaintEvent arg0) 函数中调用 ReparentUtil.startAndReparent(NativeControl.this.handle,startCommand,wndClassName) 来启动 Windows 应用程序并将应用程序窗口显示到 SWT 控件中。当 SWT 空间销毁的时候也要将 Windows 应用程序的窗口销毁。SWT 的 OS 类提供了 SendMessage 方法来实现将窗口销毁:OS.SendMessage(childWnd, OS.WM_CLOSE, 0, 0);childWnd 就是要销毁的窗口的句柄。
窗口焦点的控制和窗口的销毁比较类似,我们先监听父窗口的焦点事件,一旦获取焦点,我们将焦点设置到本地应用程序的窗口中。同时,我们需要加一个键盘事件监听器,这样当用户按“Tab”键时,焦点才能跳转到我们的父窗口控件。如下面的清单所示:
this.addFocusListener(new FocusListener(){
public void focusGained(FocusEvent arg0) {
if(childWnd!=0){
OS.SetForegroundWindow(childWnd)}
}
}
public void focusLost(FocusEvent arg0) {
}
})}
this.addKeyListener(new KeyListener(){
public void keyPressed(KeyEvent arg0) {
}
public void keyReleased(KeyEvent arg0) {
}
});
SWT 的 OS 类提供了 SetForegroundWindow 函数来将焦点设置到某个窗口上,函数的参数指定要设置焦点的窗口句柄。
窗口的大小的控制也是类似的。我们需要监听父窗口的窗口事件,一旦有窗口大小变化,我们就调整本地应用程序的窗口大小。
this.addControlListener(new ControlListener(){
public void controlMoved(ControlEvent arg0) {
}
public void controlResized(ControlEvent arg0) {
if(childWnd!=0){
Rectangle rect = ((C
|