Stos gdi, czy też lista, tablica - można to dowolnie nazwać nie znając dokładnej organizacji - jest to obszar pamieci gdzie system zapisuje koordynaty wycinków okna które wymagają odrysowania. Jeżeli przesuniesz okno A nad oknem B do system dopisze tam jedną lub dwie pozycje (zależnie czy ruch był ukośny czy nie) i będzie tak długo wysyłał WM_PAINT, póki nie wywołasz BeginPaint/EndPaint. Przypisanie zmiennej hdc nie jest ani obowiązkowe ani potrzebne, jest nawet zbyteczne bo to samo hdc jest w paintstruct.
Pole hbrBackground wypełniasz wtedy, gdy nie chcesz obsługiwać komunikatu WM_ERASEBKGND, ale przekazujesz go do DefWindowProc - wtedy ta funkcja pobiera hbrBackground i wypełnia nim cały obszar okna, co bardzo często jest niewskazane bo wszystko miga. Jeżeli zwrócisz zero, to system to zapamięta i będzie się "domagał" wymazania podczas kolejnego WM_PAINT, ustawiając paintstruct.fErase.
Możesz usunać obsługę WM_ERASEBKGND i ustawić hbrBackground na NULL, ale będziesz musiał zarejestrować dodatkową klasę okna, co opłaca się dopiero gdy używasz jednej klasy okna z wieloma różnymi WndProc (flaga GWL_WNDPROC).