Позвольте мне сначала описать симптомы проблемы. Затем я приведу дополнительные факты и объясню свой вопрос.
Симптомы
Я написал собственный элемент управления Windows. Элемент управления рисует себя в ответ на сообщение WM_PAINT
. Он также использует подсказки отслеживания (то есть функцию отслеживания TOOLTIPS_CLASS
общего элемента управления).
Когда я перетаскиваю мышь по элементу управления, всплывающая подсказка хорошо следует за мышью. Проблема в том, что он оставляет после себя серую полосу. Эта полоса требует заметного количества времени для перерисовки — как вы можете видеть из прикрепленного изображения, я смог нажать PRNTSCRN и сделать снимок экрана до того, как элемент управления успел перерисовать себя.
(Что еще более странно, так это то, что обработчик WM_PAINT
, похоже, не запускался ни разу. Но обратите внимание, что код, который вызывает отслеживание всплывающей подсказки, находится в WM_MOUSEMOVE
, и он, очевидно, отлично реагирует.) эм>
Факты
- Предположим, что ванильный C использует библиотеки Win32.
- The
WM_PAINT
handler is actually very fast. The control has a number of features that require repainting the entire client area, and this is imperceptible to the user.- Indeed, some features run animations that repaint the whole client area at 15-24fps.
- Он также довольно эффективен и не перерисовывает намного больше, чем прямоугольник обновления при любой перерисовке.
- The
WM_ERASEBKGND
handler does nothing and simply returns 1.- I never erase the background, I simply paint over it.
- The window has the following style bits set:
- ws:
WS_CHILD | WS_VISIBLE
- ex:
WS_EX_COMPOSITED
- cs:
CS_DBLCLKS
- ws:
- The parent window is a top-level window with the following style bits set:
- ws:
WS_TILEDWINDOW | WS_CLIPSIBLINGS | WS_VISIBLE
- ex:
WS_EX_WINDOWEDGE
- cs:
CS_REDRAW | CS_DBLCLKS
- ws:
- Фоновая кисть класса окна элемента управления —
GetStockObject(NULL_BRUSH)
. - Единственный другой способ, который я нашел для создания такого же «следа», - это перетаскивание другого окна верхнего уровня поверх моего элемента управления. Та область, которая временно закрыта перетаскиваемым окном верхнего уровня, оставляет тот же след.
- Предоставление классу окна элемента управления стиля
CS_SAVEBITS
, похоже, не имеет никакого значения. Я все еще получаю тот же заметный след медленных перекрасок.
Вопросы
- Почему я вообще получаю серый цвет, особенно если я установил
CS_SAVEBITS
? - What can I do to make the grey go away?
- Should I call
UpdateWindow()
each time I move the tooltip?- But this doesn't solve the issue of other top-level windows being dragged over top of my control.
- Помощь!
- Should I call
WM_ERASEBKGND
родительскому окну верхнего уровня, не отправляя соответствующее сообщениеWM_PAINT
дочернему окну управления. Если я нанесу вред обработчикуWM_ERASEBKGND
(возвращая 1 без каких-либо действий), проблема с отставанием отрисовки исчезнет, но фон окна также не будет отрисовываться! Как я могу заставить Windows сказать дочернему элементу управления рисовать!? - person 0xbe5077ed   schedule 12.06.2013