Hi,
I'm trying to overlay a transparent JPanel on top of a native Window
that has been reparented using the approach below: I'm using Overlayout
to layer to panels on top of eachother. The native Window (DirectX)
always displays above the lightweight component. I had thought that JDK
7 allowed this, but I must not be doing something right. Has anybody
successfully done this type of thing? (I know it can be done since JOGL
windows can be mixed with lightweight components now.)
Thanks!
Rob
void attachRenderHwnd() {
//hide GE main window
try {
User32.ShowWindow(getMainHwnd(), 0); //hide GE main window
} catch (COMException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
resizeGERenderHwnd();
//attach GE render window to the GUI
try {
FuncPtr setParent = new FuncPtr("USER32.DLL", "SetParent");
setParent.invoke_I(getRenderHwnd(), this.getGUIHwnd(),
ReturnFlags.CHECK_FALSE);
} catch (COMException e) {
e.printStackTrace();
}
}
private void resizeGERenderHwnd() {
try {
FuncPtr moveWindow = new FuncPtr("USER32.DLL", "MoveWindow");
// create a NakedByteStream for the serialization of Java
variables
NakedByteStream nbs = new NakedByteStream();
// wrap it in a LittleEndianOutputStream
LittleEndianOutputStream leos = new
LittleEndianOutputStream(nbs);
// and then write the Java arguments
leos.writeInt(getRenderHwnd()); //Handle to the window
Point myCorner = new Point(this.getX(),this.getY());
JFrame frame =
(JFrame)SwingUtilities.getAncestorOfClass(JFrame.class, this);
Point corner = SwingUtilities.convertPoint(this,myCorner,
frame.getContentPane());
leos.writeInt(corner.x); //Specifies the new position of the
left side of the window
leos.writeInt(corner.y); //Specifies the new position of the
top of the window
leos.writeInt((int) this.getWidth()); // Specifies
the new width of the window
leos.writeInt((int) this.getHeight()); // Specifies
the new height of the window
leos.writeBoolean(false); //Specifies whether the
window is to be repainted //
moveWindow.invoke("IIIII:I:", 24, nbs, null,
ReturnFlags.CHECK_FALSE);
} catch (IOException e) {
e.printStackTrace();
} catch (COMException e) {
e.printStackTrace();
}
}
public final static Field getDeclaredField(Class clazz, String
fieldName) throws NoSuchFieldException {
Class c = clazz;
while (c != null && c != Object.class) {
try {
return c.getDeclaredField(fieldName);
} catch (NoSuchFieldException e) {
}
c = c.getSuperclass();
}
throw new NoSuchFieldException(fieldName);
}
private int getGUIHwnd() {
int hwnd = 0;
System.loadLibrary("jawt");
sun.awt.windows.WToolkit tk = (sun.awt.windows.WToolkit)
this.getToolkit();
System.out.println("tk" + tk);
Window w = SwingUtilities.getWindowAncestor(this);
Object peer = tk.targetToPeer(w);
System.out.println("peer\n" + peer);
try {
Class c = peer.getClass();
System.out.println("class\n" + c);
this.f = this.getDeclaredField(c,"hwnd");
System.out.println("Field\n" + f);
f.setAccessible(true);
Object result = f.get(peer);
//return
hwnd = ((Long) result).intValue();
} catch (Throwable t) {
throw new RuntimeException(t.toString());
}
return hwnd;
}
===========================================================================
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff JAVA2D-INTEREST". For general help, send email to
[EMAIL PROTECTED] and include in the body of the message "help".