Q:

Использование memoryDC WINAPI, обновление окна только при изменении размера

Я новачок в WINAPI и пытаюсь зделать мини игру, мне надо чтобы изображение выводилось на екран целиком, а не каждый блок по очереди, смог найти только то что сначало нужно всё записовать в memoryDC, а потом выводить его, только как это реализовать доконца не понял.
Также окно почему-то перерисовуется только при изменении размера окна, как это исправить?
Мои попытки что-то сделать:
#ifndef UNICODE
#define UNICODE
#endif 

#include <windows.h>

HBITMAP hBmp_red = (HBITMAP)LoadImage(NULL, L"C:\\Red.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
HDC bmpdc = NULL;
HDC memdc = NULL;
HBITMAP membmp = NULL;
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow)
{
    // Register the window class.
    const wchar_t CLASS_NAME[] = L"Sample Window Class";

    WNDCLASS wc = { };

    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = CLASS_NAME;

    RegisterClass(&wc);

    // Create the window.

    HWND hwnd = CreateWindowEx(
        0,                              // Optional window styles.
        CLASS_NAME,                     // Window class
        L"Learn to Program Windows",    // Window text
        WS_EX_APPWINDOW,            // Window style

        // Size and position
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,

        NULL,       // Parent window    
        NULL,       // Menu
        hInstance,  // Instance handle
        NULL        // Additional application data
    );

    if (hwnd == NULL)
    {
        return 0;
    }

    ShowWindow(hwnd, nCmdShow);

    // Run the message loop.

    MSG msg = { };
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;

    case WM_PAINT:
    {
        PAINTSTRUCT ps;

        HDC hdc = BeginPaint(hwnd, &ps);
        SelectObject(bmpdc, hBmp_red);
        StretchBlt(memdc, 0, 0, 100, 100, bmpdc, 0, 0, 10, 10, SRCCOPY);
        membmp = CreateCompatibleBitmap(hdc, 100, 100);
        SelectObject(memdc, membmp);
        BitBlt(hdc, 0, 0, 100, 100, memdc, 100, 100, SRCCOPY);

        EndPaint(hwnd, &ps);
    }
    return 0;

    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

A:

Пример из MSDN
HDC memDC = CreateCompatibleDC ( hDC );
HBITMAP memBM = CreateCompatibleBitmap ( hDC, nWidth, nHeight );
SelectObject ( memDC, memBM );

А рисовать нужно в обработчике сообщения WM_PAINT внутри Begin/EndPaint
В общем, логика такая:
Создан memDC, в нём выбран битмап.
В функции, предназначенной для рисования (или даже в нескольких функциях) рисуем на этот memDC кучу объектов  - например, заполнили фон, нарисовали сто прямоугольников, десять эллипсов и надписей.
Когда картинка подготовлена, вызываем InvalidateRect для окна программы. Это приводит к вызову WM_PAINT.
Внутри обработчика WM_PAINT в BeginPaint получаем текущий контекст окна и шлёпаем на него memDC. Всё, в WM_PAINT больше ничего не делаем. 

