Я пытаюсь выяснить, почему я получаю пустой прямоугольник обновления, когда я вызываю InvalidateRect в прозрачном окне. Идея состоит в том, что я нарисовал что-то в окне (оно временно переключается на альфа 1/255 для чертежа), а затем я переключаю его в полностью прозрачный режим (т.е. альфа 0), чтобы взаимодействовать рабочий стол и возможность перемещения рисунка по экрану поверх рабочего стола.
Когда я пытаюсь переместить чертеж, я получаю его ограничивающий прямоугольник и использую его для вызова InvalidateRect, например:
InvalidateRect (m_hTarget, & winRect, FALSE);
Я подтвердил, что winRect действительно правильный, и что m_hTarget - правильное окно, и что его прямоугольник полностью охватывает winRect.
Я попадаю в обработчик OnPaint в классе, соответствующем m_hTarget, который является производным от CWnd. Там я создаю CPaintDC, но когда я пытаюсь получить доступ к прямоугольнику обновления (dcPaint.m_ps.rcPaint), он всегда пуст. Этот прямоугольник передается функции, которая определяет, нужно ли нам обновлять экран (используя UpdateLayeredWindow в случае прозрачного окна).
Если я жестко закодирую здесь непустой прямоугольник, оставшийся код работает правильно, и я могу перемещать рисунок по экрану.
Я попытался изменить параметр 'FALSE' на 'TRUE' в InvalidateRect, но безрезультатно. Я также попытался использовать стандартный CDC, а затем с помощью метода BeginPaint / EndPaint в моем обработчике OnPaint, просто чтобы убедиться, что CPaintDC не делал ничего странного ... но я получил те же результаты.
Код, который я использую, изначально был разработан для непрозрачных окон. Если m_hTarget соответствует непрозрачному окну, тот же набор вызовов функций приводит к правильному (то есть непустому) прямоугольнику, передаваемому в OnPaint. Однако, если окно наслоено, оно, похоже, не работает правильно.