Bitmaps auf Fenster in der Runtime bewegen



  • Hiho,

    habe vor als Übung ein Textadventure-Game mit einigen 2d elementen zu basteln. Habe einfach mal naiv die Kopf-Durch-Die-Wand-Methode verwendet um Bitmaps zu bewegen:

    THREAD( ){
    
     while(true){
       Sleep(20);
       DestroyWindow(hBitmap);
       x++;
       hBitmap = CreateWindow( .... x, y );
       SendMessage( hBitmap ..... ); // mein Bild in das handle legen
     }
    
    }
    

    das flackert halt ohne ende. ich weiß das man das durch backbuffer lösen kann. meine frage ist, ob man backbuffer mit meiner methode nutzen kann oder geht das nur mit WM_PAINT und HDC's. hab mal was mit wm_paint versucht.

    THREAD
      while(true){
       Sleep(100);
       x++;
       SendMessage(WM_PAINT); // zeichnet mein fenster nicht neu
       UpdateWindow(hMain);   // ebenfalls nicht
                              // obwohl in msdn steht, dass wm_paint gesendet wird,wenn function updatewindow is called
    
    WM_PAINT
      hDC = BeginPaint(hWnd, &ps);
      TextOut(hDC, x,y,"1234",4);
      EndPaint(hWnd,&ps);
    

    in dem beispiel seh ich den schriftzug erst über mein fenster laufen, wenn ich mein fenster andauernt verkleiner/vergrößer. is ja logisch, weil es dann definitiv neugezeichnet werden muss.



  • Also das zweite Beispiel konnte ich mit InvalidateRect() lösen, aber erster Frage bleibt immer noch.



  • Hey,
    konnte mein erstes Beispiel jetzt auch lösen mit den Flackern. Habs halt über Device Context und DoubleBuffering gemacht.
    folgender code ist in WM_PAINT und ein thread sendet halt immer wieder WM_PAINT damit mein fenster neu gezeichnet wird.

    RECT Client_Rect;
    	GetClientRect(hWnd,&Client_Rect);
    
    	int win_width; 
    	win_width= Client_Rect.right - Client_Rect.left;
    	int win_height;
    	win_height= Client_Rect.bottom + Client_Rect.left;
    
    	PAINTSTRUCT ps;
    	HDC Memhdc;
    	HWND test;
    	HDC hdc;
    	HBITMAP Membitmap;
    
    	hdc = BeginPaint(hWnd, &ps);
    	Memhdc = CreateCompatibleDC(hdc);
    	Membitmap = CreateCompatibleBitmap(hdc, win_width, win_height);
    	SelectObject(Memhdc, Membitmap);
    
    					// Painting
    					SetTextColor(Memhdc,RGB(255,255,255));
    					SetBkMode(Memhdc,TRANSPARENT);
    					TextOut(Memhdc, x,y,"1234",4);
    
    	BitBlt(hdc, 0, 0, win_width, win_height, Memhdc, 0, 0, SRCCOPY);
    
    	DeleteObject(Membitmap);
    	DeleteDC    (Memhdc);
    	DeleteDC    (hdc);
    	EndPaint(hWnd, &ps);
    

    jetzt kann ich zwar text mit TextOut() wärend der Laufzeit prima verschieben, aber wie funktioniert das mit Bitmaps? Bitmaps laden kann man ja mit LoadBitmap und die in HBITMAP speichern. Wie kann man aber sagen, dass die dann an einer bestimmten stelle meines device contextes ablegen möchte. in der laufzeit ändern sich ja die x und y werte, sodass das bitmap immer woaders angezeigt werden muss.

    lg obst


  • Mod

    1. Man sendet niemals WM_PAINT. Dafür gibt es RedrawWindow und UpdateWindow
    2. Lies die Doku. Du gibst bei BitBlt doch an wohingezeichnet wird und wo ist da nun das Problem?


Anmelden zum Antworten