Не только. На топе может быть не только наша форма. Манипуляции с другой формой (обозначенные ранее как "таскание чего ни то перед мордой") вызывают поток рисовательных событий и на нашей. Которые мы (по всем правилам) обязаны правильно отработать, не взирая на состояние нашего таймера.
Но даже не в этом дело.
Есть правило в винде: ты обязан быть готов в любую секунду нарисовать то, чего там должно быть на самом деле.
Костыльное оно или нет, а ничего тут уж не поделаешь.
Если мы научим пользователя следовать этому правилу, то остальная ответственность за качество рисования - уже за виндой.
Если научим нарушать - это будет не очень правильно.
Независимо от того, хотят пользователи, чтобы об них заботились, или не хотят, а заботиться - следует (некоторым и так не дует).
Есть вещи, которых я не знаю. К таковым относятся, например, OpenGL. Остается ли после flip-а "в запасном буфере" то, чего было ранее, или его надо творить заново - не знаю.
Но то, что знаю - знаю надежно.
Правильно (это то, что я знаю надежно) - по таймеру (или по другим интерфейсным событиям) менять рисунок OpenGL-модели в буфере, и делать invalidate (не важно в каком порядке, естественно). А по WM_PAINT (который является следствием не только нашего invalidate) кидать содержимое буфера "на показ".
И с WM_ERASEBKGND наша обязанность разобраться, если хотим рисовать на форме, а не на панели (у класса BUTTON в default-е оно ничего не делает)
Хоть костыль, хоть нет, а деваться некуда. Можно всю винду назвать одним большим костылем, если уж очень сильно призадуматься.
Скажем, то "баловство" Кладова с onMouseEnter/Leave
Не тот он человек, чтобы без причин лишние коды ставить. Следовательно, причины были. И достаточно серьезные, даже если мы о них и не знаем - "на всякий случай" он ничего не делает.
Я в деталях очень-то не разбирался, но оценил возможность доказать ему, что он дурак -- как совершенно бесперспективную. Потому-что он не дурак, и "правила рисования" не хуже нашего знает.
Да, были, когда-то, подмигивания при MainForm.Picture<>0. Этот вопрос (в отличие от OpenGL) я знаю, и поэтому этой проблемы просто нет. Давно уже.
Ответов: 9906
Рейтинг: 351
|
|||
карма: 9 |
|