[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Newsgroup Home]
[news.eclipse.platform.swt] Re: Transparent Shell question

You are correct, I read the code wrong.... Anyway  I was never able to get
rid of the 1 pixel shell border.  I eventually has to implement another
native method to set the Window Region to prevent the 1 pixel shell border
from showing.

final Shell shell = new Shell(SWT.NO_TRIM);
shell.setBounds(100, 100, 400, 400);
shell.setLayout(new FillLayout());
shell.setBackground(new Color(null, 255, 0, 255));
final Background b = new Background(shell, 0);

int alpha = 75; /* 0=transparent, 255=opaque only matters if using LWA_ALPHA
*/
OS.SetWindowLong(shell.handle, OS.GWL_EXSTYLE,
OS.GetWindowLong(shell.handle, OS.GWL_EXSTYLE) | OSEx.WS_EX_LAYERED);
OSEx.SetLayeredWindowAttributes(shell.handle, 255, 0, 255, alpha,
OSEx.LWA_COLORKEY);
OSEx.SetWindowRegion(shell.handle, 2, 2, 400, 400);
shell.open();

Where OSEX implementation is:

JNIEXPORT jboolean JNICALL Java_OSEx_SetLayeredWindowAttributes
(JNIEnv *, jclass theClass, jint windowHandle, jint red, jint green, jint
blue, jint alpha, jint flags)
{
    if ( flags == OSEx_LWA_COLORKEY ) {
        return( SetLayeredWindowAttributes((HWND)windowHandle,
               (COLORREF)RGB(red,green,blue), (BYTE)alpha, (DWORD)flags ));
    } else {
        return( SetLayeredWindowAttributes((HWND)windowHandle, NULL,
        (BYTE)alpha, (DWORD)flags ));
    }
}

JNIEXPORT jboolean JNICALL Java_OSEx_SetWindowRegion
(JNIEnv *, jclass theClass, jint windowHandle, jint x, jint y, jint width,
jint height)
{
    CRgn r;
    r.CreateRectRgn( x, y, x+width, y+height );
    return( SetWindowRgn((HWND)windowHandle, r, TRUE ));
}

Note that when the shell resizes the window region must be reset.

Ross


"Steve Northover" <steve_northover@xxxxxxxxxx> wrote in message
news:bf1ljf$f7l$1@xxxxxxxxxxxxxx
> Can't seem to find the exclusion of SWT.NO_BACKGROUND in my code.
>
> "Ross Yakulis" <yakulis@xxxxxxxxx> wrote in message
> news:beunj9$bhd$1@xxxxxxxxxxxxxx
> > As for hammering  the EXStyle, I initially did not, that was just to see
> if
> > it
> > would make a difference, it did not.   I was hoping not to have to drag
> out
> > the
> > MS compiler, but it looks like I may have to.  Though if I have to do
that
> > then I may just end up writting the app in MS c++ (yuck).
> >
> > In reading through the swt source, the checkstylebuts for shell excluded
> > SWT.NO_BACKGROUND not sure why of if this would matter.
> > I will try some other things and post another reply if I figure this
out.
> >
> > "Steve Northover" <steve_northover@xxxxxxxxxx> wrote in message
> > news:beukto$86v$1@xxxxxxxxxxxxxx
> > > One thing that seems funny in your code is that you hammer GWL_EXSTYLE
> > > instead of just adding WS_EX_LAYERED to it.  Do you have a functioning
C
> > > example?  If so, it's easy to rewrite it to use the internal Windows
> > > implementation classes to experiment and see what is wrong.  I
wouldn't
> > > suggest shipping a final product that uses the implementation classes
> but
> > > they are handy to see what is going on.  This is exactly the process I
> use
> > > when presented with a mystery.
> > >
> > > Another possiblilty is to temporarily hack Control.createHandle() to
> > create
> > > the window with the appropriate style bits?  Might make a difference?
> > > (probably not).
> > >
> > > "Ross Yakulis" <yakulis@xxxxxxxxx> wrote in message
> > > news:bemopq$2a7$1@xxxxxxxxxxxxxx
> > > > I have that already.
> > > >
> > > >
> > > > public static void main(String[] args) {
> > > >     Shell shell = new Shell(SWT.NO_TRIM);
> > > >
> > > >     shell.setLayout(new FillLayout());
> > > >     shell.setBackground(new Color(null, 255, 255, 255));
> > > >     Background b = new Background(shell, 0); // draws an irregular
> image
> > > >     int alpha = 128; //0=transparent, 255=opaque only matters if
using
> > > > LWA_ALPHA
> > > >     OS.SetWindowLong(shell.handle, OS.GWL_EXSTYLE,
> OSEx.WS_EX_LAYERED);
> > > >     OSEx.SetLayeredWindowAttributes(shell.handle, null, alpha,
> > > > OSEx.LWA_COLORKEY);
> > > >     shell.open();
> > > >     Display display = shell.getDisplay();
> > > >     while (!shell.isDisposed()) {
> > > >         if (!display.readAndDispatch()) {
> > > >             display.sleep();
> > > >         }
> > > >     }
> > > > }
> > > >
> > > > Where OSEX is a native that calls :
> > > >
> > > > public class OSEx {
> > > >     static {
> > > >         System.loadLibrary("osex");
> > > >     }
> > > >     public static final native boolean
SetLayeredWindowAttributes(int
> > > hwnd,
> > > > RGB crKey,
> > > >             int bAlpha, int     dwFlags);
> > > >     public static final int LWA_COLORKEY = 1;
> > > >     public static final int LWA_ALPHA = 2;
> > > >     public static final int WS_EX_LAYERED = 0x80000;
> > > > }
> > > >
> > > > // CPP implementation of SetLayeredWindowAttributes
> > > > JNIEXPORT jboolean JNICALL
> > > > Java_com_avaya_osex_OSEx_SetLayeredWindowAttributes
> > > > (JNIEnv *env, jclass theClass, jint windowHandle, jobject crKey,
jint
> > > alpha,
> > > > jint flags) {
> > > >  SetLayeredWindowAttributes((HWND)windowHandle,
> > > (COLORREF)RGB(255,255,255),
> > > > (BYTE)alpha, (DWORD)flags );
> > > >  return( 0 );
> > > > }
> > > >
> > > > "Steve Northover" <steve_northover@xxxxxxxxxx> wrote in message
> > > > news:bemnki$1ae$1@xxxxxxxxxxxxxx
> > > > > Use SWT.NO_TRIM.
> > > > >
> > > > > "Ross Yakulis" <yakulis@xxxxxxxxx> wrote in message
> > > > > news:bekc50$p3s$1@xxxxxxxxxxxxxx
> > > > > > I read the post on Nov 2002 "shell alpha channel transparency"
and
> > > > > > implemented that solution.  (setting the EX_STYLE to layered
> window
> > > > > > and then setting the layered window attributes).  So now my
shell
> > > > > > rectangular area is transparent and I can place my iregular
image
> in
> > > it
> > > > > and
> > > > > > have the
> > > > > > shell appear as a non-rectangular window (almost).
> > > > > >
> > > > > > My problem is that no matter what combination of styles I use,
> > > > > > I always get a thin rectangular border, even though the inside
> > > > > > area of the shell is transparent.   How do I get rid of that
> border?
> > > > The
> > > > > > application I an creating is windows only.
> > > > > >
> > > > > > Ross
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>