Как бы не было удивительно, но программа в свернутом состоянии действительно захлебывается сообщениями
WM_PAINT. Судя по всему в свернутом состоянии в программу прилетает сильно больше сообщений на перерисовку чем в несвернутом (мое предположение которое я даже проверять не хочу). Я попытался запретить перерисовку окна вызывая в
case WM_SIZE: { if (wParam == SIZE_MINIMIZED) ... if (wParam == SIZE_RESTORED) ... } функции
SendMessage(hWnd, WM_SETREDRAW, (WPARAM)false, NULL) и
LockWindowUpdate(hWnd), но первая дала весьма странный результат (при отправке сообщения пропала иконка на панели задач и не только), вторая вообще никакого результата не дала. В результате глобально объявил переменную
bool lock_draw = false и выставил ее в
case WM_SIZE. Программа оперлась на костыль и пошла. Код стал выглядеть примерно так:
bool lock_draw = false;
bool Core::on_message(UINT message, WPARAM wParam, LPARAM lParam)
{
if (lock_draw && message == WM_PAINT) return false;
...
switch(message) {
...
case WM_SIZE:
if (wParam == SIZE_MINIMIZED) lock_draw = true;
if (wParam == SIZE_RESTORED) lock_draw = false;
...
}
}
p.s. Задавая вопрос отсекать сообщения отрисовки я пытался функцией
IsIconic(hWnd), которая судя по профайдеру занимает процессорного времени не меньше чем функция отрисовки о_О.