Как я могу получить окно, чтобы сохранить окрашенные объекты при изменении размера стека переполнения

Моя программа создает случайные прямоугольники на экране. При каждом нажатии левой кнопки мыши в окно добавляется новый прямоугольник произвольного размера и цвета. Однако, когда я изменяю размер окна, все прямоугольники удаляются — я не хочу, чтобы это произошло. Я не понимаю, что делает программа при изменении ее размера, вызывает ли она случай WM_PAINT? Если это так, что мне нужно включить, чтобы гарантировать, что текущее состояние окна остается при изменении размера.

0

Решение

Смотрите мой ответ на подобный вопрос о рисовании с использованием GDI.

https://stackoverflow.com/a/12764607/682404

Как правило, когда размер ваших окон изменяется, вы должны получить WM_PAINT сообщение из Windows. В вашем обработчике сообщений вам нужно перекрасить форму. Ответ, на который я ссылаюсь, содержит некоторые подробности о процессе рисования. Ваш код рисования будет выглядеть примерно так:

PAINTSTRUCT stPaintStruct;
HDC hPaintDC = BeginPaint(hWnd, &stPaintStruct);

if (hPaintDC != HANDLE_NULL)
{
// establish clipping rect using stPaintStruct.rcPaint

if (!m_bRendering)
{
m_bRendering = TRUE;

// Render() knows the how to create the output.
Render ();

m_bRendering = FALSE;
}

EndPaint (hWnd, &stPaintStruct);
return (TRUE);
}

Каждый раз, когда вам нужно покрасить окно, вам всегда нужно рисовать с нуля, поэтому вам нужно где-то хранить координаты ваших прямоугольников.

0

Другие решения

Вам нужно сохранить состояние и перерисовать всякий раз, когда вы получаете WM_PAINT. Это просто протокол, по которому Microsoft решила. Поэтому убедитесь, что вы храните состояние своего окна в памяти.

В случае изменения размера вы также получаете несколько сообщений о размере, сначала серию событий WM_SIZING, когда размер изменяется, и затем WM_SIZE, когда размер, наконец, установлен. Вы получите сообщения WM_PAINT между ними, и вы можете перекрасить приложение на любом или на всех этих событиях.

1