Добрый вечер!
Никак не могу отловить баг. Проявляется у меня и ещё у одного товарища на Windows 7 x64. Причем если заходить по RDP — баг не проявляется . Ещё пробовали на виртуалке (в VirtualBox) на XP и на 7-ке — тоже не проявляется. Есть окно, на котором есть ещё дочернее окно. Кода много и чтобы локализовать проблему, я выкосил весь лишний. Вот что осталось от обработчика WM_PAINT:
Вот как выглядит баг:
Т.е. прямая линия рвется на 2 куска. Дочернее окошко можно двигать мышкой и если его подвинуть немного ниже — прямая прорисуется нормально. Рвется она когда дочернее окно хоть на пиксел попадает в прямоугольник [0,0,150,300]. Ещё замечено что баг проявляется не при всех углах наклона линии.
Пробовал гуглить, но нашел только пару ссылок с похожей проблемой на других форумах, и там никто не смог ничего вразумительного ответить
Может кто нибудь подскажет в чем тут может быть проблема?
Спасибо!
Re: MoveToEx, LineTo - линия ломается на 2 части
От:
Аноним
Дата:
04.02.11 15:29
Оценка:
Только что заметил, что баг НЕ проявляется, если отключить темы Aero.
Проверь версию драйвера дисплея на обоих машинах. Если совпадает то очень вероятно что это бага именно драйвера.
Наблюдал нечто похожее с Direct2D некоторое время назад.
Здравствуйте, ak_miass, Вы писали:
_>Добрый вечер!
А если попробовать GetDC/ReleaseDC?
Это только с линиями так или с любым рисунком? Если поверх этого места нарисовать элипс, его тоже "порежет" после отрисовки линии? До?
Дублирующий буфер если (не)использовать? А Win7-рочный дублирующий буфер?
Здравствуйте, ononim, Вы писали: O>1) Это WindowProc или DialogProc?
это который lpfnWndProc у WNDCLASS. O>2) Где проверка на ошибку BeginPaint?
Это на скорую руку набрано чтобы воспроизвести баг. В реальном коде этот HDC как-то хитро где-то в недрах одного мутного класса получается. Но этот баг там тоже есть, я просто выкосил все лишнее.
Re[3]: MoveToEx, LineTo - линия ломается на 2 части
Здравствуйте, ak_miass, Вы писали:
O>>2) Где проверка на ошибку BeginPaint? _>Это на скорую руку набрано чтобы воспроизвести баг. В реальном коде этот HDC как-то хитро где-то в недрах одного мутного класса получается. Но этот баг там тоже есть, я просто выкосил все лишнее.
Поставь assert(hdc).
Вполне может быть что рисуется на NULL dc что есть поверхность экрана.
Или этот DC 32-bit truncated, короче невалидный.
Re[4]: MoveToEx, LineTo - линия ломается на 2 части
Здравствуйте, c-smile, Вы писали:
CS>Или этот DC 32-bit truncated, короче невалидный.
Про NULL понятно, а как проверить 32-bit truncated? Кстати сама прога 32-битная.
Re[4]: MoveToEx, LineTo - линия ломается на 2 части
Здравствуйте, c-smile, Вы писали:
CS>Вполне может быть что рисуется на NULL dc что есть поверхность экрана.
Поставил этот assert — все нормально. Так же поглядел в отладчике. BeginPaint возвращает hdc наподобии такого 0C0118A0. GetDC(NULL) возвращает другое значение. CS>Или этот DC 32-bit truncated, короче невалидный.
32-bit truncated это насколько я пониамю актуально в 64-битном приложении? У меня 32 бит.
Как можно ещё проверить валидность HDC?
Вот здесь у человека очень похожий баг: http://social.technet.microsoft.com/Forums/en-US/w7itprogeneral/thread/c7f0d132-4580-429b-a935-d9cf08c05e55
Я скомпилировал его пример. Очень похоже что корни проблемы те же. Правда у меня cliping явно не используется, но зато есть дочерние окошки. И в моем и в его случае проблему решает включение "Отключить композицию рабочего стола" в свойствах .exe.
Там по ссылке человека послали в форум MSDN. Может все таки кто нибудь знает как это победить по нормальному?