MoveToEx, LineTo - линия ломается на 2 части
От: ak_miass Россия  
Дата: 04.02.11 15:24
Оценка:
Добрый вечер!
Никак не могу отловить баг. Проявляется у меня и ещё у одного товарища на Windows 7 x64. Причем если заходить по RDP — баг не проявляется . Ещё пробовали на виртуалке (в VirtualBox) на XP и на 7-ке — тоже не проявляется. Есть окно, на котором есть ещё дочернее окно. Кода много и чтобы локализовать проблему, я выкосил весь лишний. Вот что осталось от обработчика WM_PAINT:
PAINTSTRUCT ps;
HDC hdc = ::BeginPaint(Handle, &ps);
MoveToEx(hdc, 0, 0, NULL);
LineTo(hdc, 150, 300);
EndPaint(Handle, &ps);
return 0;

Вот как выглядит баг:

Т.е. прямая линия рвется на 2 куска. Дочернее окошко можно двигать мышкой и если его подвинуть немного ниже — прямая прорисуется нормально. Рвется она когда дочернее окно хоть на пиксел попадает в прямоугольник [0,0,150,300]. Ещё замечено что баг проявляется не при всех углах наклона линии.
Пробовал гуглить, но нашел только пару ссылок с похожей проблемой на других форумах, и там никто не смог ничего вразумительного ответить
Может кто нибудь подскажет в чем тут может быть проблема?
Спасибо!
Re: MoveToEx, LineTo - линия ломается на 2 части
От: Аноним  
Дата: 04.02.11 15:29
Оценка:
Только что заметил, что баг НЕ проявляется, если отключить темы Aero.
Re: MoveToEx, LineTo - линия ломается на 2 части
От: c-smile Канада http://terrainformatica.com
Дата: 04.02.11 16:50
Оценка:
Здравствуйте, ak_miass, Вы писали:

Проверь версию драйвера дисплея на обоих машинах. Если совпадает то очень вероятно что это бага именно драйвера.
Наблюдал нечто похожее с Direct2D некоторое время назад.
Re: MoveToEx, LineTo - линия ломается на 2 части
От: CEMb  
Дата: 04.02.11 17:02
Оценка:
Здравствуйте, ak_miass, Вы писали:

_>Добрый вечер!


А если попробовать GetDC/ReleaseDC?
Это только с линиями так или с любым рисунком? Если поверх этого места нарисовать элипс, его тоже "порежет" после отрисовки линии? До?
Дублирующий буфер если (не)использовать? А Win7-рочный дублирующий буфер?
Re: MoveToEx, LineTo - линия ломается на 2 части
От: ononim  
Дата: 04.02.11 18:36
Оценка: +1
_>дочернее окно. Кода много и чтобы локализовать проблему, я выкосил весь лишний. Вот что осталось от обработчика WM_PAINT:
_>
_>PAINTSTRUCT ps;
_>HDC hdc = ::BeginPaint(Handle, &ps);
_>....
_>return 0;
_>



1) Это WindowProc или DialogProc?
2) Где проверка на ошибку BeginPaint?
Как много веселых ребят, и все делают велосипед...
Re[2]: MoveToEx, LineTo - линия ломается на 2 части
От: ak_miass Россия  
Дата: 05.02.11 16:36
Оценка:
Здравствуйте, ononim, Вы писали:
O>1) Это WindowProc или DialogProc?
это который lpfnWndProc у WNDCLASS.
O>2) Где проверка на ошибку BeginPaint?
Это на скорую руку набрано чтобы воспроизвести баг. В реальном коде этот HDC как-то хитро где-то в недрах одного мутного класса получается. Но этот баг там тоже есть, я просто выкосил все лишнее.
Re[3]: MoveToEx, LineTo - линия ломается на 2 части
От: c-smile Канада http://terrainformatica.com
Дата: 05.02.11 16:56
Оценка:
Здравствуйте, ak_miass, Вы писали:

O>>2) Где проверка на ошибку BeginPaint?

_>Это на скорую руку набрано чтобы воспроизвести баг. В реальном коде этот HDC как-то хитро где-то в недрах одного мутного класса получается. Но этот баг там тоже есть, я просто выкосил все лишнее.

Поставь assert(hdc).

Вполне может быть что рисуется на NULL dc что есть поверхность экрана.
Или этот DC 32-bit truncated, короче невалидный.
Re[4]: MoveToEx, LineTo - линия ломается на 2 части
От: ak_miass Россия  
Дата: 05.02.11 20:19
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Или этот DC 32-bit truncated, короче невалидный.

Про NULL понятно, а как проверить 32-bit truncated? Кстати сама прога 32-битная.
Re[4]: MoveToEx, LineTo - линия ломается на 2 части
От: ak_miass Россия  
Дата: 07.02.11 11:26
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Вполне может быть что рисуется на NULL dc что есть поверхность экрана.

Поставил этот assert — все нормально. Так же поглядел в отладчике. BeginPaint возвращает hdc наподобии такого 0C0118A0. GetDC(NULL) возвращает другое значение.
CS>Или этот DC 32-bit truncated, короче невалидный.
32-bit truncated это насколько я пониамю актуально в 64-битном приложении? У меня 32 бит.
Как можно ещё проверить валидность HDC?
Re: MoveToEx, LineTo - линия ломается на 2 части
От: ak_miass Россия  
Дата: 07.02.11 13:01
Оценка:
Вот здесь у человека очень похожий баг:
http://social.technet.microsoft.com/Forums/en-US/w7itprogeneral/thread/c7f0d132-4580-429b-a935-d9cf08c05e55
Я скомпилировал его пример. Очень похоже что корни проблемы те же. Правда у меня cliping явно не используется, но зато есть дочерние окошки. И в моем и в его случае проблему решает включение "Отключить композицию рабочего стола" в свойствах .exe.
Там по ссылке человека послали в форум MSDN. Может все таки кто нибудь знает как это победить по нормальному?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.