Fenster durch Maus verschieben



  • Guten Tag zusammen.

    Ich versuche gerade mein Fenster zu verschieben, wenn der linke Maus-Button über einem Button gedrückt ist und die Maus verschoben wird. Das klappt auch alles wunderbar, auser wenn ich die Maus zu schnell bewege. Denn dann ist der Cursor außerhalb des Buttons und ich muss erst wieder mit der Maus auf den Button um das Fenster weiter verschieben zu können.

    Es soll am Ende eigentlich so funktionieren wie wenn ich ein normales Windows-Fenster am Rahmen verschiebe.

    Hier ist der Code:

    case WM_MOUSEMOVE:
    		 {
    
    			 if (wParam & MK_LBUTTON)
    			 {
    			 GetCursorPos(&pt);
    			 SetWindowPos(hWndg, HWND_TOPMOST, pt.x-43, pt.y-35, 300, 130, //-43 und -35 damit der Mauscursor nach dem verschieben wieder über dem Button ist.
    					SWP_SHOWWINDOW|SWP_NOSIZE);
    			 return 0;
    			 }
    
    		 }
    

    Mfg



  • Ok hat sich geklärt ich habe es einfach so gemacht:

    case WM_SETCURSOR: 
    		 {
             HCURSOR cursor = LoadCursor(0,IDC_SIZEALL);
            SetCursor(cursor); 
    		return 0;
    		}
    	 case WM_LBUTTONDOWN:
    		 {
    			 SetTimer(hWnd3, 1, 1, NULL);
    			 return 0;
    		 }
    	 case WM_LBUTTONUP:
    		 {
    			 KillTimer(hWnd3, 1);
    			 return 0;
    		 }
    	 case WM_TIMER:
    		 {
    			 GetCursorPos(&pt1);
    			 SetWindowPos(hWndg, HWND_TOPMOST, pt1.x-43, pt1.y-35, 300, 130, //-43 und -35 damit der Mauscursor nach dem verschieben wieder über dem Button ist.
    					SWP_SHOWWINDOW|SWP_NOSIZE);
    			 return 0;
    		 }
    

  • Mod

    Das sollte soweit viel einfacher gehen, wenn Du auf WM_NCHITTEST HTCAPTION zurückgibst.
    Dann macht Windows den Rest für Dich.



  • ALso das funktionier überhaupt nicht...???!!!

    switch (message)
       {
    	case WM_SETCURSOR: 
             { 
             HCURSOR cursor = LoadCursor(0,IDC_SIZEALL); 
            SetCursor(cursor); 
            return 0; 
            } 
    	case WM_NCHITTEST:
    		{
    			return HTCAPTION;
    		}
    		return 0;
    
    	}
    

    MfG


  • Mod

    Was funktioniert wie nicht?



  • Sry. Es passiert nichts. Der Cursor verändert sich zwar aber ich kann mein Fenster nicht verschieben...

    Edit: achja und weis jemand wie ich bei einem Setup-Project von Visual Studio eine .exe NACH der Installation starten kann??



  • Nur mal schnell zusammenkopiert, stammt von einem Dialog, kann aber auch auf normale Fenster angewendet werden, Unterschied siehe Kommentar:

    case WM_NCHITTEST:
    //xPos = LOWORD( lParam );  //Horizontal position of cursor.
    //yPos = HIWORD( lParam );  //Vertical position of cursor.
    //The simplest way to drag a window by its client area (or drag a window if it has no title bar),
    //is to handle the WM_NCHITTEST message that is sent to every window when a mouse event occurs.
    //By returning a value of HTCAPTION from the WM_NCHITTEST message handler, you can fool windows into
    //thinking that the mouse is over a caption bar, and the window can be dragged around with the mouse.
    //It is best to only allow dragging by the client area of a window - otherwise, the window borders would become unusable.
    //To achieve this, call the default window procedure, and check if its return value is HTCLIENT -
    //if it is, then return HTCAPTION instead. Otherwise, just let the default behaviour take place.
    //Windows Vista: When creating custom frames that include the standard caption buttons, this message should first be passed to the DwmDefWindowProc() function.
    //               This enables the Desktop Window Manager (DWM) to provide hit-testing for the captions buttons.
    //               If DwmDefWindowProc() does not handle the message, further processing of WM_NCHITTEST may be needed.
    lresult = DefWindowProc( hwnd_dialog, WM_NCHITTEST, wParam, lParam );
    if ( lresult == HTCLIENT )  //indicating the position of the cursor hot spot in a client area.
    {
      lresult = HTCAPTION;      //indicating the position of the cursor hot spot in a title bar.
                                //Hiermit wird Windows vorgegaukelt, daß sich der Mauscursor in der Titelleiste befindet.
    }
    SetWindowLong( hwnd_dialog, DWL_MSGRESULT, lresult );
                                //Der tatsächliche Rückgabewert bei Dialogen.
                                //Bei Fenstern kann man den Wert via return zurückgeben - bei Dialogen muss man mit SetWindowLong() arbeiten.
    return( TRUE );             //Nachricht wurde bearbeitet -> TRUE.
    break;                      //Zwar wg. return überflüssig, ist bei mir aber disziplinarische Gewohnheit
    

    Aber was in meinen Augen vermutlich gravierender ist:
    Bei Deinen Switch-case Konstrukten fehlen die obligatorischen breaks bei jedem case-Zweig!

    HTH,
    Martin


Anmelden zum Antworten