Fenster ohne Caption erstellen



  • WS_POPUP als Fensterstil nehmen.
    Transparenz kriegt man sehr einfach mit WS_EX_LAYERED hin.
    Mit SetLayeredWindowAttributes() kann man dann eine Farbe setzen, die transparent sein soll. Alles was man dann in der WM_PAINT() mit der Farbe zeichnet bleibt transparent.

    Alternativ ginge auch mit einer Region alles transparent zu setzen und die dann via SetWindowRgn() setzen, was aber aufwendiger ist.



  • k, vielen dank, wunderbar, genau das hab ich gesucht.

    jetzt hab ich noch 2 frage:

    - wie mache ich, dass das fenster keinen hintergrund hat? also auch nicht weiß, sondern einfach transparent
    - wie verhindere ich, dass mein fenster beim drücken auf den "alle fenster minimieren" button minimiert wird?



  • Transparenz:

    myWnd = CreateWindowEx(WS_EX_LAYERED|WS_EX_NOACTIVATE|WS_EX_TOPMOST,"blupp.class", "blupp", WS_POPUP, 10, 15, 200, 30, NULL, NULL, hInstance, NULL);
    	if (!myWnd)
    	{
    		return 0;
    	}
    	SetLayeredWindowAttributes(myWnd,RGB(255,255,255),0,LWA_COLORKEY);
    

    ...alles was weiß gezeichnet wird, ist hinterher transparent.
    Funktioniert aber nur ab Win2k 😉
    Edit: Und funktioniert nicht bei Child-Windows!

    "Alle Fenster minimieren" kannst du nicht verhindern, aber sofort wieder rückgängig machen - Du kriegst eine WM_SIZE-Message.



  • WNDCLASS wc;
    wc.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH);

    auf

    wc.hbrBackground= NULL;

    setzten, das hab ich früher mal urtümlich gemacht, und hab micht gewundert warum dort ein Renster ohne inhalt gezeichnet wurde ^^



  • wc.hbrBackground= NULL;

    funktioniert nicht, dann wirds so komisch schwarz. trotzdem danke

    @geeky: genau das hab ich gesucht. nochmals danke ^^

    zum minimieren:

    hab 2 dinge versucht, funktionieren beide nicht:
    - direkt bei WM_SIZE die funktion ShowWindow(hWnd, SW_SHOW) aufrufen
    - bei WM_SIZE eine selbst definierte nachricht WM_SHOW senden, die ShowWindow(hWnd, SW_SHOW) aufruft

    Wann soll ich das fenster denn anzeigen lassen?

    MfG, Herr-Vorragend



  • geht es denn überhaupt?



  • also mit folgendem ausschnitt bekomm ich beim drücken auf den "Alle fenster minimieren"-button keine WM_SIZE nachricht:

    ...
    WM_SIZE:
        MessageBox(NULL, "bla", "blabla", MB_OK);
        return 0;
    ...
    


  • Hmm, vielleicht wird WM_WINDOWPOSCHANGED gesendet ?
    Prüf mal einfach via Spy++ was Windows da so ans Fenster sendet 😉



  • hm, also irgendwie bekomm ich da gar keine nachricht, selbst folgendes hat keinen effekt:

    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
             ShowWindow(hWnd, SW_SHOW);
    
    	return DefWindowProc(hWnd, message, wParam, lParam);
    }
    


  • das problem besteht übrigens immernoch ^^



  • WM_SIZE ist die falsche Message, du muss folgendes abfangen:

    if (msg==WM_SYSCOMMAND && wParam==SC_MINIMIZE) {
    ...
    }



  • also dieser code nützt auch nichts 😕

    case WM_SYSCOMMAND:
    		if (wParam == SC_MINIMIZE)
    			MessageBox(NULL, "a", "b", MB_OK);
    		return 0;
    

    das heißt es kommt keine message box...



  • hm, ich hab eben mal mit spy++ geschaut, irgendwie bekomm ich gar keine nachricht, das kanns doch nicht sein, oder?!



  • Also irgenedwas ist bei die kpmisch ich erhalte jede Menge Nachrichten:

    WM_WINDOWPOSCHANGING
    WM_GETMINMAXINFO
    WM_NCCALCSIZE
    WM_WINDOWPOSCHANGED
    WM_MOVE
    WM_SIZE



  • hm, stimmt, andere fenster bekommen mehrere nachrichten....also ich erstelle mein fenster so:

    hWnd = CreateWindowEx(	WS_EX_LAYERED | WS_EX_NOACTIVATE,
    							szAppName,
    							"MHDesktop",
    							WS_POPUP,
    							CW_USEDEFAULT,
    							CW_USEDEFAULT,
    							CW_USEDEFAULT,
    							CW_USEDEFAULT,
    							NULL,
    							NULL,
    							hInstance,
    							NULL);
    

    und später benutze ich noch

    SetWindowPos(hWnd, HWND_BOTTOM, 674, 50, 300, 200, SWP_NOACTIVATE);
    


  • hat denn noch nie jemand ein ähnliches problem gehabt? das eigentliche problem ist ja, dass mein fenster zu wenige nachrichten bekommt...



  • ein totes fenster sendet für gewöhnlich auch keine nachrichten:

    SWP_NOACTIVATE Does not activate the window. If this flag is not set, the window is activated and moved to the top of either the topmost or non-topmost group (depending on the setting of the hWndInsertAfter parameter).



  • .....und empfängt auch keine



  • hm, das fenster muss aber deaktiviert bleiben...fällt jemand ne möglichkeit ein, wie ich das problem lösen kann? mir fiele da nur ein hook-ein, aber das find ich en bißchen aufwendig für die ganze sache, fällt jemand was simpleres ein?

    MfG, Herr-Vorragend



  • warum versteckst dus nicht einfach mit ShowWindow + SW_HIDE? Dann kanns atmen, aber stört keinen mit seinem Anklitz...


Anmelden zum Antworten