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".

Reply via email to