c + + - Sådan genindskydes vindue, når jeg ændrer koordinater af form?

Indlæg af Hanne Mølgaard Plasc

Problem



Koden



Jeg har dette problem, jeg forsøger at oprette et simpelt rektangel, der bevæger sig med piletasterne (bare for at teste evnerne i Graphics Device Interface).


/** NOT IMPORTANT **/
// -------------------------------------------------- //
/* Globals (hey, its just a test program!) */
static int x = 0;
static int y = 0;

/** MAINLOOP **/

// All classes are just simple wrapper
// code in /* comments */ shows what the class methods internally do.

Graphics g;      // HDC Wrapper
g.GetGraphics( winmodel.GetHandle() ); /* ::GetDC( hwnd ); */

HWND hwnd = winmodel.GetHandle();

// IMPORTANT PART //
//-------------------------------------------//
while(TRUE)
{
    // PROBLEM HERE!!!
    ::InvalidateRect( hwnd, NULL, 0 ); // NOT WORKING??
    ::UpdateWindow( hwnd ); // NOT WORKING??

    if( msg.Peek(NULL,0,0,PM\_REMOVE) ) /* PeekMessage() */
    {
        msg.Translate(); /* ::TranslateMessage() */
        msg.Dispatch(); /* ::DispatchMessage() */
    }

    g.Rectangle( x, y, x + 100, y + 100); /* GDI's ::Rectangle() Function */
    fpsHandler.Tick(); /* while( ( GetTickCount() - start\_time ) < 33 ); */
}

g.Release(); /* ::ReleaseDC( hwnd ); */


// NOT IMPORTANT //
// --------------------------------------------------------//
/** IN WNDPROC **/

// in WM\_KEYDOWN
 case VK\_LEFT:
       x--;
       break;
 case VK\_RIGHT:
       x++;
       break;
 case VK\_UP:
       y--;
       break;
 case VK\_DOWN:
       y++;
       break;


Problemet



Nu er mit problem, at når rektanglet forlader et sted, forbliver det sted sort (måske er det ikke redrawn?), Som det kan ses:


Ikke omformulering?


Men den sorte del forsvinder, når jeg minimerer vinduet og indlæser det igen, og dermed åbenbart et gentagelsesproblem. Men hvorfor er det ikke, når jeg brugte InvalidateRect og UpdateWindow? Jeg prøvede endda ::SendMessage( hwnd, WM\_PAINT, NULL, NULL ); til ingen nytte. Hvad er problemet?

Bedste reference


Det ser ud som om du forsøger at kode hovedprogrammet i din app i hovedlinjen.


Dette er et design, der hovedsagelig anvendes i fuldskærmsspil. En mere almindelig tilgang er:



  • En generisk begivenhedsløkke (standardbehandling for hver begivenhed)

  • En wndproc til dit vindue

  • I denne wndproc håndterer du begivenheder, herunder malerhændelsen. Glem ikke at male hele vinduet.


Andre referencer 1


Du skal slette det gamle rektangel (fx tegne det fyldt med baggrundsfarven), før du tegner den nye.