tja, sollte, klappt aba net



  • LRESULT CALLBACK WinProc (HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
    {
    	HDC hdc;
    	PAINTSTRUCT ps;
    	HPEN hPen;
    	int x=50,y=50;
    	HFONT hFont;
    
    	switch (msg)
    	{
    	case WM_KEYDOWN:
    		switch (wParam)
    		{
    		case VK_ESCAPE:
    			SendMessage(hWnd,WM_DESTROY,0,0);
    			break;
    
    		case VK_LEFT:
    			x=x-10;
    			SendMessage(hWnd,WM_PAINT,0,0);
    			break;
    		case VK_RIGHT:
    			x=x+10;
    			SendMessage(hWnd,WM_PAINT,0,0);
    			break;
    		case VK_DOWN:
    			y=y+10;
    			SendMessage(hWnd,WM_PAINT,0,0);
    			break;
    		case VK_UP:
    			y=y-10;
    			SendMessage(hWnd,WM_PAINT,0,0);
    			break;
    		}
    
    		return 0;
    	case WM_PAINT:
    		hdc = BeginPaint(hWnd,&ps);
    		SelectObject(hdc, GetStockObject(GRAY_BRUSH));
    		hPen = CreatePen(PS_SOLID,10,RGB(255,0,0));
    		SelectObject(hdc,hPen);
    		MoveToEx(hdc,x,y,NULL);      //bloß, damit n punkt mit dem 
    		LineTo(hdc,x,y);		 //hPen-eigenschaften kommt
    
    		EndPaint(hWnd,&ps);
    		return 0;
    	case WM_CREATE:
    		return 0;
    	case WM_DESTROY:
    		DeleteObject(hPen);
    		PostQuitMessage(0);
    		return 0;
    	}
    return DefWindowProc(hWnd,msg,wParam,lParam);
    }
    

    Das is nu der CallBack-handler meiner WinApi.
    nu sollte sich der Punkt bewegen, wenn ich ne pfeiltaste drücke, machter aber net
    kann da jemand abhilfe schaffen?



  • Mir ist das mal aufgefallen:

    int x=50,y=50;
    

    Das heißt, wenn jedes mal die Funktion aufgerufen wird, wird x und y auf 50 gesetzt. Außerdem wird die Variable wieder gelöscht, falls die Funktion verlassen wird.

    Stattdessen muss das stehen

    static int x = 50, y = 50;
    


  • Unglückliche Lösung:

    LRESULT CALLBACK WinProc (HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) 
    { 
        HDC hdc; 
        PAINTSTRUCT ps; 
        HPEN hPen; 
        int x=50,y=50; 
        HFONT hFont; 
    
        switch (msg) 
        { 
        case WM_KEYDOWN: 
            switch (wParam) 
            { 
            case VK_ESCAPE: 
                SendMessage(hWnd,WM_DESTROY,0,0); 
                break; 
    
            case VK_LEFT: 
                x=x-10; 
                hdc = BeginPaint(hWnd,&ps); 
                SelectObject(hdc, GetStockObject(GRAY_BRUSH)); 
                hPen = CreatePen(PS_SOLID,10,RGB(255,0,0)); 
                SelectObject(hdc,hPen); 
                MoveToEx(hdc,x,y,NULL);      //bloß, damit n punkt mit dem  
                LineTo(hdc,x,y);         //hPen-eigenschaften kommt         
                EndPaint(hWnd,&ps); 
                break; 
            case VK_RIGHT: 
                x=x+10; 
                hdc = BeginPaint(hWnd,&ps); 
                SelectObject(hdc, GetStockObject(GRAY_BRUSH)); 
                hPen = CreatePen(PS_SOLID,10,RGB(255,0,0)); 
                SelectObject(hdc,hPen); 
                MoveToEx(hdc,x,y,NULL);      //bloß, damit n punkt mit dem  
                LineTo(hdc,x,y);         //hPen-eigenschaften kommt         
                EndPaint(hWnd,&ps); 
                break; 
            case VK_DOWN: 
                y=y+10; 
                hdc = BeginPaint(hWnd,&ps); 
                SelectObject(hdc, GetStockObject(GRAY_BRUSH)); 
                hPen = CreatePen(PS_SOLID,10,RGB(255,0,0)); 
                SelectObject(hdc,hPen); 
                MoveToEx(hdc,x,y,NULL);      //bloß, damit n punkt mit dem  
                LineTo(hdc,x,y);         //hPen-eigenschaften kommt         
                EndPaint(hWnd,&ps); 
                break; 
            case VK_UP: 
                y=y-10; 
                hdc = BeginPaint(hWnd,&ps); 
                SelectObject(hdc, GetStockObject(GRAY_BRUSH)); 
                hPen = CreatePen(PS_SOLID,10,RGB(255,0,0)); 
                SelectObject(hdc,hPen); 
                MoveToEx(hdc,x,y,NULL);      //bloß, damit n punkt mit dem  
                LineTo(hdc,x,y);         //hPen-eigenschaften kommt         
                EndPaint(hWnd,&ps); 
                break; 
            } 
    
            return 0; 
        case WM_PAINT: 
            hdc = BeginPaint(hWnd,&ps); 
            SelectObject(hdc, GetStockObject(GRAY_BRUSH)); 
            hPen = CreatePen(PS_SOLID,10,RGB(255,0,0)); 
            SelectObject(hdc,hPen); 
            MoveToEx(hdc,x,y,NULL);      //bloß, damit n punkt mit dem  
            LineTo(hdc,x,y);         //hPen-eigenschaften kommt         
            EndPaint(hWnd,&ps); 
            return 0; 
        case WM_CREATE: 
            return 0; 
        case WM_DESTROY: 
            DeleteObject(hPen); 
            PostQuitMessage(0); 
            return 0; 
        } 
    return DefWindowProc(hWnd,msg,wParam,lParam); 
    }
    

    Besser:

    LRESULT CALLBACK WinProc (HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) 
    { 
        HDC hdc; 
        PAINTSTRUCT ps; 
        HPEN hPen; 
        static int x=50,y=50; 
        HFONT hFont; 
    
        switch (msg) 
        { 
        case WM_KEYDOWN: 
            switch (wParam) 
            { 
            case VK_ESCAPE: 
                SendMessage(hWnd,WM_DESTROY,0,0); 
                break; 
    
            case VK_LEFT: 
                x=x-10; 
                InvalidateRect(hWnd, NULL, TRUE);
                break; 
            case VK_RIGHT: 
                x=x+10; 
                InvalidateRect(hWnd, NULL, TRUE);
                break; 
            case VK_DOWN: 
                y=y+10; 
                InvalidateRect(hWnd, NULL, TRUE);
                break; 
            case VK_UP: 
                y=y-10; 
                InvalidateRect(hWnd, NULL, TRUE);
                break; 
            } 
    
            return 0; 
        case WM_PAINT: 
            hdc = BeginPaint(hWnd,&ps); 
            SelectObject(hdc, GetStockObject(GRAY_BRUSH)); 
            hPen = CreatePen(PS_SOLID,10,RGB(255,0,0)); 
            SelectObject(hdc,hPen); 
            MoveToEx(hdc,x,y,NULL);      //bloß, damit n punkt mit dem  
            LineTo(hdc,x,y);         //hPen-eigenschaften kommt 
    
            EndPaint(hWnd,&ps); 
            return 0; 
        case WM_CREATE: 
            return 0; 
        case WM_DESTROY: 
            DeleteObject(hPen); 
            PostQuitMessage(0); 
            return 0; 
        } 
    return DefWindowProc(hWnd,msg,wParam,lParam); 
    }
    

    Wichtig ist:
    x und y müssen STATIC sein...

    WM_PAINT wird von Windows gesendet, niemals von einer Anwendung!



  • MoveToEx(hdc,x,y,NULL);      //bloß, damit n punkt mit dem   
    LineTo(hdc,x,y);         //hPen-eigenschaften kommt
    

    Denkt nochmal genau drüber nach...

    Ach ja, und statt des InvalidateRect() würde ich mir den alten Punkt merken und einfach wegmachen. Oder InvalidateRect() mit dem Rect aufrufen, das weggemacht werden soll.


Anmelden zum Antworten