Refresh Problem beim BMP zeichnen



  • Hallo,

    ich habe das Problem, das er nur neu zeichnet, wenn man ein Fenster über das Programm legt oder wenn man minimiert -> maximiert..

    case WM_PAINT:
    		{
    		   m_playfield.DrawField(350,20);
    		}
    		break;
    ...
    
    void PlayField::DrawField(int x, int y)
    {
    	HDC hDC, hMemDC; 
    	PAINTSTRUCT Paint; 
    
    	hDC = BeginPaint(m_hwnd,&Paint); 
    	hMemDC = CreateCompatibleDC(hDC); 
    	SelectObject(hMemDC,m_bmpfield); 
    
    	for(int i=0;i<m_rows;i++)
    	{
    		for(int j=0;j<m_columns;j++)
    		{
    			BitBlt(hDC,
    				   x+(i*m_bmpfield_width),
    				   y+(j*m_bmpfield_height),
    				   m_bmpfield_width,
    				   m_bmpfield_height,
    				   hMemDC,
    				   0,
    				   0,
    				   SRCCOPY); 
    
    		}
    	}
    
    	DeleteDC(hMemDC); 
    	EndPaint(m_hwnd,&Paint);
    }
    

    was habe ich da falsch gemacht? 😕

    Danke schonmal im voraus.



  • Wann soll es denn refresht werden?



  • Es soll die Bitmaps anzeigen, die ich auf den Fensterhintrergrund zeichne. Dies geschieht aber nur wenn ich ein anderes Fenster über das Programm schiebe oder wenn ich das Programm kurzzeitig minimiere und dann wieder maximiere.



  • keiner eine Idee? 😞



  • Na überleg doch mal. Wann wird dein Bitmap gezeichent? Genau, wenn dein Fenster ein WM_PAINT bekommt. Diesen Gedanken weiterzuführen, überlasse ich mal dir.



  • InvalidateRect ?!



  • ahja.. InvalidateRect also.

    The InvalidateRect function adds a rectangle to the specified window's update region. The update region represents the portion of the window's client area that must be redrawn.

    ich nehm also mal zum testen einfach das ganze Fenster..

    RECT r;
    GetWindowRect(hwnd,&r);

    RECT r;
    	HDC hDC, hMemDC; 
    	PAINTSTRUCT Paint; 
    
    	hDC = BeginPaint(m_hwnd,&Paint); 
    	hMemDC = CreateCompatibleDC(hDC); 
    	SelectObject(hMemDC,m_bmpfield); 
    
    	for(int i=0;i<m_rows;i++)
    	{
    		for(int j=0;j<m_columns;j++)
    		{
    			BitBlt(hDC,
    				   x+(i*m_bmpfield_width),
    				   y+(j*m_bmpfield_height),
    				   m_bmpfield_width,
    				   m_bmpfield_height,
    				   hMemDC,
    				   0,
    				   0,
    				   SRCCOPY); 
    
    		}
    	}
    
    	DeleteDC(hMemDC); 
    	EndPaint(m_hwnd,&Paint);
    
    	GetWindowRect(m_hwnd,&r);
    /*
    	r.left		= x;
    	r.top		= y;
    	r.right		= x+(m_columns*m_bmpfield_width);
    	r.bottom	= y+(m_rows*m_bmpfield_height);
    */
    
    	InvalidateRect(m_hwnd,&r,true);
    

    wäre das so richtig?? funkioniert so auch nich wirklich...
    😞



  • Du musst die Funktion natürlich dort aufrufen, wo du zum neu zeichnen veranlassen willst. So landest du doch in einer Endlosschleife 😕


Anmelden zum Antworten