Моя программа создает случайные прямоугольники на экране. При каждом нажатии левой кнопки мыши в окно добавляется новый прямоугольник произвольного размера и цвета. Однако, когда я изменяю размер окна, все прямоугольники удаляются — я не хочу, чтобы это произошло. Я не понимаю, что делает программа при изменении ее размера, вызывает ли она случай WM_PAINT
? Если это так, что мне нужно включить, чтобы гарантировать, что текущее состояние окна остается при изменении размера.
Смотрите мой ответ на подобный вопрос о рисовании с использованием 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);
}
Каждый раз, когда вам нужно покрасить окно, вам всегда нужно рисовать с нуля, поэтому вам нужно где-то хранить координаты ваших прямоугольников.
Вам нужно сохранить состояние и перерисовать всякий раз, когда вы получаете WM_PAINT. Это просто протокол, по которому Microsoft решила. Поэтому убедитесь, что вы храните состояние своего окна в памяти.
В случае изменения размера вы также получаете несколько сообщений о размере, сначала серию событий WM_SIZING, когда размер изменяется, и затем WM_SIZE, когда размер, наконец, установлен. Вы получите сообщения WM_PAINT между ними, и вы можете перекрасить приложение на любом или на всех этих событиях.