Moving Grip



  • ich habs befürchtet, dass ich das so machen muss...naja, erstmal danke

    Mfg Ominion



  • Einfacher:

    switch(uiMessage)
    {
    case WM_NCHITTEST:
        // Wenn Maus im Grip-Bereich
        return HTCAPTION;
        // Ansonsten Weiterleitung an DefWindowProc
        break;
    
    ...
    }
    

    Weitere mögliche Rückgabewerte von WM_NCHITTEST siehe
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/mouseinput/mouseinputreference/mouseinputmessages/wm_nchittest.asp

    Walter Z



  • ich habe das jetzt so probiert:

    case WM_NCHITTEST:
    	x = LOWORD (lParam);
    	y = HIWORD (lParam);
    
    	if (x >= 0 && x <= 200 && y >= 0 && y <= 100)
    		return HTCAPTION;
    break;
    

    wenn ich jetzt aber in mein label klicke und das fenster ziehen will, klappt das nicht. auch nicht wenn ich in das main-fenster klicke und ziehe. was mache ich falsch?

    Mfg Ominion



  • *push*



  • Die Koordinaten in lParam beziehen sich auf den Bildschirm.
    Die Prüfung x >= 0 && x <= 200 dürfte also im wahrsten Sinn des Wortes danebenliegen.

    Walter Z



  • Das klappt auch nicht, wenn ich mein fenster am oberen rand erstelle 😞

    Mfg Ominion



  • *push*



  • *push* in der hoffnung, dass jemand eine idee hat, weil das wirklich wichtig ist.

    Mfg Ominion



  • *pop*

    Hauptfenster verschieben mit Klick im Client-Bereich :

    // hWnd -> Handle vom Hauptfenster
    
     case WM_LBUTTONDOWN : { 
    
      ReleaseCapture ();
      SendMessage   (hWnd,WM_SYSCOMMAND,SC_MOVE + HTCAPTION,0);
    
      break;
     }
    

    Falls "label" ein Child ist und eine eigene "WinProc" hat :

    // hWnd -> Handle von "label"
    
     case WM_LBUTTONDOWN : { 
    
      ReleaseCapture ();
      SendMessage   (GetParent (hWnd),WM_SYSCOMMAND,SC_MOVE + HTCAPTION,0);
    
      break;
     }
    

    Einen Bereich kannst Du Dir via lParam je nach Bedarf selbst definieren.

    *EDIT* Schreibfehler korrigiert



  • es klappt immer noch nicht 😞

    long __stdcall LoadProc (HWND hLoad, unsigned int message, unsigned int wParam, long lParam)
    {
    	HDC hDC;
    	PAINTSTRUCT ps;
    
    	HANDLE hBitmap;
    
    	int x, y = 0;
    
    	switch (message)
    	{
    		case WM_CREATE:
    			InitCommonControls();
    			WaxEngBMPField = CreateWindow ("Static", NULL, WS_CHILD | WS_VISIBLE | SS_BITMAP, 0, 0, 500, 300, hLoad, (HMENU)4, WaxEngLoadHinstance, NULL); //<-- bedeckt das ganze Fenster, klappt aber auch nicht, wenn es das nicht tut
    			hBitmap = LoadImage (GetModuleHandle (NULL), "start_screen.bmp", IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR | LR_LOADFROMFILE);
    			SendMessage (WaxEngBMPField, STM_SETIMAGE, (WPARAM) IMAGE_BITMAP, (LPARAM)(HANDLE) hBitmap);
    
    			st =  CreateWindow (PROGRESS_CLASS, NULL, WS_CHILD | WS_VISIBLE | PBS_SMOOTH, 15, 240, 470, 20, hLoad, (HMENU) 1, WaxEngLoadHinstance, NULL);
    
    			SetTimer (hLoad, 1, 1, NULL);
    
    			SendMessage (st, PBM_SETRANGE, 0, MAKELPARAM (0, 500)); 
    			SendMessage (st, PBM_SETSTEP, (WPARAM) 1, 0);
    			SendMessage (st, PBM_SETBARCOLOR, 0, RGB (46, 50, 146));
    			SendMessage (st, PBM_SETBKCOLOR, 0, RGB (128, 131, 226));
    		return 0;
    
    		case WM_PAINT:
    			hDC = BeginPaint (hLoad, &ps);
    				SetBkMode (hDC, TRANSPARENT);
    			EndPaint (hLoad, &ps);
    		return 0;
    
    		case WM_TIMER:
    			switch (wParam)
    			{
    				case 1:
    					if (SendMessage (st, PBM_GETPOS, 0, 0) >= 500)
    						PostQuitMessage (0);
    					else
    						SendMessage (st, PBM_STEPIT, 0, 0);
    				break;
    			}
    		return 0;
    
    		case WM_SYSCOMMAND:
    			switch (wParam)
    			{
    				case SC_SCREENSAVE:	
    				case SC_MONITORPOWER:
    				return 0;
    			}
    		return 0;
            //HIER SOLL ES GETAN WERDEN
    		case WM_LBUTTONDOWN:
    			ReleaseCapture (); 
    			SendMessage (hLoad, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0); 
    		return 0;
    
    		case WM_DESTROY:
    			PostQuitMessage (0);
    		return 0;
    	}
    
    	return DefWindowProc (hLoad, message, wParam, lParam);
    }
    

    das ist die Prozedur vom Fenster...

    Mfg Ominion

    EDIT:habe den Fehler gefunden. WM_SYSCOMMAND hatte ich ja überschrieben bzw. selbstdefiniert. Danke an alle, klappt jetzt endlich wie gewünscht

    EDIT: jetzt klappt es auch mit WalterZ's Lösung, danke an euch beide, das hat mir sehr geholfen! 👍 👍


Anmelden zum Antworten