Fenster Transparent machen (einige Teile davon jedoch nicht)

roxX0r

Mitglied
Huhu,

ich möchte über eine DLL (rufe die Funktion dann über Java auf) ein Fenster erstellen, welches Transparent und "durchklickbar" ist. Ich habe beides schon hinbekommen, jedoch habe ich noch ein Problem. Ich möchte, dass Dinge, die ich auf das Fenster nachträglich zeichne, nicht durchsichtig sind.

Ich möchte z.B. mit Textout Strings auf das Fenster malen, oder auch Bitmaps, diese sollen nicht durchsichtig sein, alles andere (einfach der windows background) schon..

die transparenz und durchklickbarkeit mache ich wie folgt.

Code:
SetWindowLong(hwnd, 
              GWL_EXSTYLE, 
              GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED | WS_EX_TRANSPARENT);
	 
ShowWindow  (hwnd,SW_SHOW);
UpdateWindow(hwnd);

das wird nach CreateWindow() aufgerufen ..

Und noch eine kleine Frage: Ich möchte das Fenster ohne Ränder haben, auch kein X oben rechts usw.. es soll komplett unsichtbar sein, bis auf die sachen die ich draufmale ...

Danke :)
 
So gelöchterte Windows bekommst du mit REGIONs hin. Ich weiß allerdings nicht, ob sich die mit der Transparenz kombinieren lassen.

Ein Fenster ohne Rahmen/Caption läßt sich mit WS_POPUP erzeugen. Ggf. mußt du noch die Stile für Rahmen/Caption raus-bit-masken.
 
Und ich habe noch ein anderes Problem :)

Ich erzeuge das Fenster in einer DLL und die rufe ich über Java auf, und das sieht dann so aus:

Code:
void createW(){

 const char g_szClassName [] = "My Window Class";
 
 
	HINSTANCE hInstance = GetModuleHandle(NULL);
	
	WNDCLASSEX wc;
	wc.cbSize = sizeof(WNDCLASSEX);
	wc.style  = 0;
	wc.lpfnWndProc = WndProc ;
	wc.cbClsExtra  = 0;
 	wc.cbWndExtra  = 0;
	wc.hInstance   = hInstance;
	wc.hIcon       = LoadIcon  (NULL,IDI_APPLICATION);
	wc.hCursor     = LoadCursor(NULL,IDC_ARROW);
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
	wc.lpszMenuName  = NULL;
	wc.lpszClassName = g_szClassName;
    wc.hIconSm       = LoadIcon(NULL,IDI_APPLICATION);

	if(!RegisterClassEx(&wc))
	{

        	MessageBox(NULL , "Failed to register window class" ,
                        "Error" , MB_ICONEXCLAMATION | MB_OK );
 	        return;

	}

     HWND hwnd;
     hwnd = CreateWindowEx(
                   WS_EX_CLIENTEDGE ,
                   g_szClassName    ,
                   "Title Of Me Window !" ,
                   WS_OVERLAPPEDWINDOW    ,
                   CW_USEDEFAULT , CW_USEDEFAULT , 240 , 120 ,
                   NULL , NULL , 
				  hInstance , NULL
            );

	kaka = hwnd;
     if(hwnd == NULL)
     {
           MessageBox(NULL , "Failed to create window"
                        , "Error"
                        , MB_ICONEXCLAMATION | MB_OK );
           return ;
     }

	 SetWindowLong(hwnd, 
              GWL_EXSTYLE, 
              GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED | WS_EX_TRANSPARENT);
	 
      ShowWindow  (hwnd,SW_SHOW);
      UpdateWindow(hwnd);



	MSG Msg;
	while(GetMessage(&Msg,NULL,0,0)){
//Hier blockt alles
        	TranslateMessage(&Msg);
        	DispatchMessage (&Msg);
      	}
	

} 

JNIEXPORT int JNICALL Java_MainClass_NewJFrame_makeWindow(JNIEnv *env, jobject obj){
	
	createW();

Das Problem ist jetzt die Message while Schleife... dadrin bleibt die DLL jetzt stecken (und somit mein ganzes Programm). Wie umgehe ich das denn? Brauch ich dafür jetzt nen neuen Thread? Wie t das bei "normalen" Windows Programmen? Er müsste doch immer in dieser "Endlosschelife" stecken bleiben ..
 
Zurück