1: я бы порекомендовал вам лениво загрузить свой закадровый холст как можно позже.Если вам это нужно в WM_PAINT и вы еще не создали его, создайте его тогда.Если вам это нужно в тот момент, когда кто-то начинает рисовать, создайте его тогда.Если он существует тогда, когда вам это нужно, используйте его.
2: PatBlt заполняет область растрового изображения, используя текущую кисть контекста устройства.Кисти определяют шаблоны, поэтому они называются PatBlt.BitBlt копирует данные из исходного растрового изображения в конечное растровое изображение.Вы должны использовать BitBlt, когда хотите переместить изображение из неэкранного растрового изображения в буфер кадров.
3: параметр lpRect в GetClientRect является выходным параметром.Это означает, что вы должны предоставить память.В этом случае GetClientRect пытается записать прямоугольник в нулевой указатель и вызывает сбой.
RECT clientRect;
GetClientRect(hwnd, &clientRect);
width = clientRect.right - clientRect.left;
height = clientRect.bottom - clientRect.top;