Transparentes Fenster?

javaprogger1987

Erfahrenes Mitglied
Ich hätte gern ein transparentes Fenster, auf dem man aber so zeichnen kann, dass das gezeichnete nicht transparent wird... Hab bisher zwei Versionen mit JNI probiert.. Kennt jemand noch eine andere?

Code:
BOOL init = FALSE;
//JNI-Methode
JNIEXPORT void JNICALL Java_JNI_setState
(JNIEnv *env, jclass clazz, jobject window)
{
/* if (!init)
{
	hDLL = LoadLibrary ("user32");
	pSetLayeredWindowAttributes = (PSLWA) GetProcAddress(hDLL,"SetLayeredWindowAttributes");
init = TRUE;
}*/
HWND hWnd = getHWnd(window, env);
/*
SetWindowLong (hWnd , (-20) , GetWindowLong (hWnd , (-20) ) | 0x00080000 );
pSetLayeredWindowAttributes (hWnd, 
	RGB(255,255,255), (int)100, 0x00000001|0x00000002);
*/
SetWindowLong((HWND)hWnd, GWL_EXSTYLE, GetWindowLong ((HWND)hWnd, GWL_EXSTYLE )|WS_EX_TRANSPARENT);
SetWindowPos((HWND)hWnd, HWND_NOTOPMOST, 0,0,0,0,SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
}

Danke!
 
Ok hab das jetzt soweit geschafft, das ich eine bestimmte Farbe transparent hab. Neues Problem ist, dass ich da ein PNG-Bild (mit Transparenz) drauf zeichnen will. Das Problem ist nun, dass das Bild aber auch halbtransparente Bereiche hat (Der Schatten -> s. Bild). Da ich als transparente Farbe weiß gewählt hab (255,255,255) wird das Weiß unter dem Schatten aber nicht transparent, weil es ja nicht mehr weiß ist.. Ich hätte aber gerne nur den Schatten ohne weiß ;) Geht das?

Vielen Dank!
 

Anhänge

  • menu_trans.png
    menu_trans.png
    5,5 KB · Aufrufe: 240
  • screen1.png
    screen1.png
    114,3 KB · Aufrufe: 451
Hallo,

könntest du mir kurz erläutern wie das mit dem transparenten Fenster funktioniert. Welche zwei Möglichkeiten mit JNI sind das? Oder wo kann ich diese nachlesen und wo finde die dazugehöre library hierzu?

Vielen Dank im voraus.

VG Erdal
 
Danke erstmal, dass jemand antwortet :)

@flashray Hab die DLL selber gemacht, folgender Code:

Code:
#include <jawt_md.h>
#include "JNI.h"
#include <winuser.h>
#include <windows.h>
 
#define LWA_COLORKEY 0x00000001
#define WS_EX_LAYERED 0x00080000
//HWND hWnd;
HMODULE hDLL;
typedef DWORD (WINAPI *PSLWA)(HWND, DWORD, BYTE, DWORD);
typedef DWORD (WINAPI *PULW)(HWND, HDC, POINT, SIZE, HDC, POINT, COLORREF, BLENDFUNCTION, DWORD);
PSLWA pSetLayeredWindowAttributes;
PULW pUpdateLayeredWindow;
HWND hWnd;
 
HWND getHWnd (jobject window, JNIEnv * env)
{
	JAWT awt;
	JAWT_DrawingSurface* ds;
	JAWT_DrawingSurfaceInfo* dsi;
	JAWT_Win32DrawingSurfaceInfo* dsi_win;
	
	//Initalisieren
	awt.version = JAWT_VERSION_1_3;
	JAWT_GetAWT(env, &awt);
	ds = awt.GetDrawingSurface(env, window);
	ds->Lock(ds);
	dsi = ds->GetDrawingSurfaceInfo(ds);
	dsi_win = (JAWT_Win32DrawingSurfaceInfo*)dsi->platformInfo;
 
	//Handle speichern
	HWND tmp = dsi_win->hwnd;
	
	//Aufraeumen
	ds->FreeDrawingSurfaceInfo(dsi);
	ds->Unlock(ds);
	awt.FreeDrawingSurface(ds);
	
	return tmp;
}
 
void upadate(int r, int g, int b)
{
   HDC hDc = GetDC(hWnd);
   HDC hDcComp = CreateCompatibleDC(hDc);
   //pUpdateLayeredWindow( hWnd, NULL, NULL, NULL, hDcComp, NULL, RGB((int)r,(int)g,(int)b),0,/*ULW_COLORKEY*/LWA_COLORKEY );
}
 
BOOL init = FALSE;
//JNI-Methode
 
JNIEXPORT void JNICALL Java_JNI_setState
(JNIEnv *env, jclass clazz, jobject window, jint r, jint g, jint b)
{
  if (!init)
  {
	hDLL = LoadLibrary ("user32");
	pSetLayeredWindowAttributes = (PSLWA) GetProcAddress(hDLL,"SetLayeredWindowAttributes");
	pUpdateLayeredWindow = (PULW) GetProcAddress(hDLL,"UpdateLayeredWindow");
	init = TRUE;
  }
  hWnd = getHWnd(window, env);
  SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);
  pSetLayeredWindowAttributes(hWnd, RGB((int)r,(int)g,(int)b), 0, LWA_COLORKEY); 
}
 
JNIEXPORT void JNICALL Java_JNI_update
(JNIEnv * env, jclass clazz)
{
  //update((int)r, (int)g, (int)b);
  UpdateWindow(hWnd);
}

Implementierung in Java (Übergeben wird das Fenster und die Farbe die transparent sein soll.
Code:
public static native void setState(Window window, int r, int g, int b);
Wie man am JNI Code sehen kann hab ich mir schon überlegt das Fenster zu aktualisieren, bevor (in der paint(..) Methode) das png gezeichnet wird..
Komm aber mit den Parametern von UpdateLayeredWindow nicht weiter :(

@Tom Jo mit dem Thread hab ich angefangen, hab auch die Grundzüge deiner Implementierung übernommen und noch ein bissel verändert -> Eine Farbe des Fensters transparent..
Das Problem ist jetzt wie gesagt nur noch, dass wie man in den Bildern (mein voheriger Post) entnehmen kann, die Transparenz des PNG's nicht richtig ist weil halt nur weiß transparent wird.
Und ganz durchsichtig kann ich das mit deiner Lösung nicht machen, weil man dann das gezeichnete nicht mehr sieht...

Oder meintest du das anders? Danke für euere Hilfe :)
 
Zuletzt bearbeitet:
Zurück