Fenster ohne Titlebar bewegen ?



  • Hallo,

    wie beweg ich einen Win32 Dialog der keine Titelleiste hat, sondern nur ein Fenster.
    Ich halte die Maus drauf und fenster soll sich bewegen

    WM_LBUTTONDOWN irgendwie, weiss jemand mehr ??

    danke



  • SendMessage(hWnd,WM_NCLBUTTONDOWN,HTCAPTION,lParam);
    


  • funktioniert aber nicht so ganz;
    eigentlich gar nicht;

    case WM_LBUTTONDOWN:
    					SendMessage(hwnd,WM_NCLBUTTONDOWN,HTCAPTION,lParam);
    				break;
    

    Kann mir jemand helfen ?

    danke



  • case WM_NCHITTEST:
        if( DefWindowProc( hWnd, msg, wParam, lParam) == HTCLIENT)
          return HTCAPTION;
    


  • Funtkioniert aber immer noch nicht ...
    Was mach ich falsh

    Hier mein kleiner Win32 code:

    #include <windows.h>
    
    #include "resource.h" 
    
    HBRUSH g_hbrBackground = NULL;
    
    BOOL CALLBACK DlgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
    {
    	switch(Message)
    	{
    		case WM_INITDIALOG:
    			g_hbrBackground = CreateSolidBrush(RGB(198, 195, 198));
    
    			SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon(NULL, 
    				MAKEINTRESOURCE(IDI_APPLICATION)));
    			SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)LoadIcon(NULL, 
    				MAKEINTRESOURCE(IDI_APPLICATION)));
    
    		break;
    		case WM_CLOSE:
    			EndDialog(hwnd, 0);
    		break;
    		case WM_CTLCOLORDLG:	
    			return (LONG)g_hbrBackground;
    		case WM_CTLCOLORSTATIC:
    		{
    			HDC hdcStatic = (HDC)wParam;
    			SetTextColor(hdcStatic, RGB(255, 255, 255));
    			SetBkMode(hdcStatic, TRANSPARENT);
    			return (LONG)g_hbrBackground;
    		}
    		break;
    		case WM_COMMAND:
    			switch(LOWORD(wParam))
    			{
    				case IDOK:
    					EndDialog(hwnd, 0);
    				break;
    
    				case WM_NCHITTEST: 
    					 if( DefWindowProc(hwnd, Message, wParam, lParam) == HTCLIENT) 
    				return HTCAPTION;
    
    			}
    		break;
    		case WM_DESTROY:
    			DeleteObject(g_hbrBackground);
    		break;
    		default:
    			return FALSE;
    	}
    	return TRUE;
    }
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    	LPSTR lpCmdLine, int nCmdShow)
    {
    	return DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, DlgProc);
    }
    

    Wo liegt der Fehler ?



  • WM_NCHITTEST gehört nicht in die WM_COMMAND switch.
    Bei Fenstern kann man den HT*-Wert via return zurückgeben - bei Dialogen muss man mit SetWindowLong arbeiten. Du bekommst aber dann keine Nachrichten mehr wie z.B. WM_LBUTTONDOWN.
    Habe ein bisschen probiert und es nun so hinbekommen:

    switch(Message)
        {        
    	case WM_NCHITTEST:
    		{
    			UINT ht = DefWindowProc(hwnd,Message,wParam,lParam);
    			if(ht == HTCLIENT)
    				ht = HTCAPTION;
    			SetWindowLong(hwnd,DWL_MSGRESULT,ht);
    			return true;
    		}
        }
    


  • mit

    case WM_NCHITTEST:  
                         if( DefWindowProc(hwnd, Message, wParam, lParam) == HTCLIENT)  
                    return HTCAPTION;
    

    kannst du nicht eigenen kursor setzen und noch auf mehrere sachen verzichten.
    so funktioniert besser

    [cpp]static POINTS m;
    switch (message)
    {
    case WM_LBUTTONDOWN:
    SetCapture(hwnd);
    m=MAKEPOINTS(lParam);
    return 0;

    case WM_LBUTTONUP:
    ReleaseCapture();
    return 0;

    case WM_MOUSEMOVE:
    if(wParam==MK_LBUTTON)
    {
    POINTS p=MAKEPOINTS(lParam);
    RECT rect;
    GetWindowRect(hwnd, &rect);

    rect.left += p.x - m.x;
    rect.top += p.y - m.y;

    SetWindowPos(hwnd,NULL,rect.left,rect.top,0,0,
    SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOZORDER);
    }
    return 0;
    [/code]



  • alex schrieb:

    kannst du nicht eigenen kursor setzen und noch auf mehrere sachen verzichten.

    Das ist richtig. Die LEDs auf dem keyboard kann man damit auch nicht blinken lassen! Aber was war nochmal die Frage?



  • 😃



  • @-King-: Es ging _alex_ imho eben darum, dass durch die anderen Varianten manches andere (z.B. setzten eines eigenen Cursors?) nicht mehr möglich ist - dies hatte er versucht zu beheben 🙄



  • Hey alle miteinander. Ich das gleiche Problem. Eine Form ohne Titelleiste und ich kann die Form nicht mehr verschieben. Jetzt schau ich mir hier euren Code an und versteh NUR Bahnhof....

    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
        LPSTR lpCmdLine, int nCmdShow)
    

    wann wird das denn aufgerufen und wie funktioniert denn das hier-->

    return DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, DlgProc);
    

    ???


Anmelden zum Antworten