Получение пустого прямоугольника обновления в OnPaint после вызова InvalidateRect для многослойного окна - PullRequest
0 голосов
/ 04 июня 2010

Я пытаюсь выяснить, почему я получаю пустой прямоугольник обновления, когда я вызываю 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. Однако, если окно наслоено, оно, похоже, не работает правильно.

1 Ответ

0 голосов
/ 10 июня 2010

Я думаю, я понял это - это сочетание ограничения Windows + какой-то странный код во внутренней структуре, которую я использую. Я должен игнорировать пустой прямоугольник и использовать вместо него весь прямоугольник экрана - кажется, он работает нормально.

Извините, если я не был достаточно ясен с моим первоначальным вопросом - я постараюсь быть более точным в следующий раз.

...