Fenster festnageln!



  • Hallo Leute,
    wie kann ich ein Fenster einer MDI Anwendung an seine Position festnageln? Ich habe es mit SetWindowPos(... SWP_NOMOVE) versucht, erhalte aber immer einen Assert(dabei hat in der Funktion SetWindowPos hWnd den Wert 0x00000000)?! An welche stelle muß das SetWindowPos? Und wie bekomme ich den Handle des gewünschten Fensters?

    Danke und Gruß
    rg_Basser



  • Das Schlüsselwort heißt nicht SetWindowPos() sondern WM_GETMINMAXINFO.



  • Nööö, geht so leider nicht - hab das ganze gerade mal in einer Dialog - Anwendung getestet. Ich kann das Fenster verschieben wie ich will, in die WM_GETMINMAXINFO läuft er mir nie rein. Ich mache das derzeit mit WM_WINDOWPOSCHANGED. Das hat aber den unschönen Effekt, das der Benutzer das Fenster erst wegziehen kann und ich es erst dann wieder an der von mir gewünschten Stelle "festtacker". - Ich wäre somit auch ganz gespannt auf eine "schöne" Lösung :).



  • Versuch mal OnMove zu überschreiben
    Dann in OnMove machst du SetWindowPos(NULL, PosX, PosY, NULL, NULL, SWP_NORESIZE);



  • Hi Leute,
    ich habe selber mal ein wenig bei Codeguru rumgestöbert und habe auch was gutes gefunden, was bei mir auch schon funktioniert:

    // Fenster an seine Position Festnageln (siehe hit-test code unter 'CWnd::OnNcHitTest')
    void CChildFrame::OnNcLButtonDblClk(UINT nHitTest, CPoint point) 
    {
        if(nHitTest == HTCAPTION)
            return;
    
        CMDIChildWnd::OnNcLButtonDblClk(nHitTest, point);
    }
    
    void CChildFrame::OnNcLButtonDown(UINT nHitTest, CPoint point) 
    {
        if(nHitTest == HTCAPTION)
            return;
    
        CMDIChildWnd::OnNcLButtonDown(nHitTest, point);
    }
    

    d.h. wenn auf den 'Caption' Balken auf irgendeine Art geklickt wird, passiert einfach gar nichts. 😮

    Danke für eure Vorschläge und viele Grüße
    rg_Basser 🕶



  • P.S. Wäre das nicht auch mal was für die FAQ, da ich schon des öfteren gesehen habe, das irgendwelche Leute ihr Fenster an einer Stelle fixieren wollen? 🙄



  • @Cpp_Junky : Laut MSDN wird WM_MOVE auch erst ausgelöst, wenn die Bewegung schon abgeschlossen ist.

    @all: Die Lösung als API Variante würde mich schon auch interessieren
    -> Dann wäre die Sache auch vollständig und könnte in die FAQ

    @rg_Basser: Die Variante funktioniert, ist aber eigentlich gemogelt :). Das ganze geht so zum Beispiel bei einer Dialoganwendung nicht. Aber es hat mich auf die entscheidende Idee gebracht einfach WM_LBUTTONDOWN auf die Titelleiste abzufangen.

    [ Dieser Beitrag wurde am 02.09.2002 um 17:08 Uhr von TheBigW editiert. ]



  • Hihi, ich werde dein Fenster dann mal per Tastatur verschieben. 😃



  • Dieser WinAPI-Code in der WindowProc sorgt dafür, dass das Fenster weder verschoben noch in der Größe verändert werden kann.

    switch(Msg)
    {
       case WM_SYSCOMMAND:
          switch(wParam)
          {
             case SC_CLOSE:
                SendMessage(hwnd, WM_CLOSE, 0, 0);
                break;
    
             case SC_MINIMIZE:
                ShowWindow(hwnd, SW_MINIMIZE);
                break;
    
             case SC_MAXIMIZE:
                ShowWindow(hwnd, SW_MAXIMIZE);
                break;
    
             case SC_RESTORE:
                ShowWindow(hwnd, SW_RESTORE);
                break;
          }
          return 0;
    }
    


  • @rg_Basser

    Was mich interessieren würde ist, wie oft Du diese Frage noch stellst !!!

    Have a look on this

    Leider kommt man im Forum nicht mehr so weit zurück... naja ich hatte es noch im Backup 😃

    MfG veganza



  • @veganza
    Das heißt: "Have a look at this. 😉 Wenn, dann sollte Volles Lösung in die FAQ!



  • @WebFritzi

    Sind wir hier in einem MFC Forum oder im "english for advanced" 😕

    Bin gespannt ob man den alten Thread vom 1.3. noch verschieben kann, soweit kommt man ja im Forum überhaupt nicht mehr zurück...

    MfG veganza



  • Na gut, dann schreiben wir hier doch noch einmal die Lösung hin.

    LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
       switch(uMsg)
       {
          case WM_SYSCOMMAND:
             if((wParam & 0xFFF0) == SC_MOVE)
                return 0;
             break;
       }
       return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
    


  • @Veganza,
    danke für den Link, diese Diskussion hatte ich eigentlich gesucht, sonst hätt' ich natürlich nicht schoon wieder danach gefragt 🙄



  • Tja dann muß ich wohl nochmal nerven :). Bei mir (Dilaog-Anwendung) läuft er nämlich nicht in WM_SYSCOMMAND rein beim anklicken des Systemmenues oder verschieben. Das geht nur beim Minimieren, Maximieren und Schließen. Liegt das an den verwendeten Styles des Dialoges? Ein Dialog ist doch auch nur ein Fenster wie jedes andere auch, oder?



  • -> yop, geht dort genauso, man darf halt nicht versuchen, die WM_SYSCOMMAND in der PreTranslateMessage(..) abzufangen, denn dort kommt sie natürlich nie an...... 🙄


Anmelden zum Antworten