PaintDesktop presents...
От: kero Россия  
Дата: 14.12.06 08:09
Оценка:
В аттаче — кандидат в кунсткамеру WIN API.

Это просто-напросто диалог с кнопками. Можно включать/выключать WS_EX_COMPOSITED, WS_EX_LAYERED + SetLayeredWindowAttributes,
можно вызывать диалогу PrintWindow и можно переназначать реакцию на WM_PAINT: или nop, или FillRect, или PaintDesktop.

Итак, после запуска — выбираем PaintDesktop, и теперь все внимание на верхнюю левую часть экрана
(которую для пущей наглядности стоит накрыть, например, блокнотом, а фон экрану взять к.н. неоднородный):
наблюдаем, что происходит при манипулировании кнопками PrintWindow / WS_EX_COMPOSITED / WS_EX_LAYERED,
а также при ресайзе диалога, когда отмечены WS_EX_COMPOSITED и/или WS_EX_LAYERED.

Интересует: получите ли у себя тот же эффект "слежения", али же у меня глюки позорные ?

P.S. Конечно — XP.
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re: PaintDesktop presents...
От: kero Россия  
Дата: 15.12.06 05:18
Оценка:
Здравствуйте, kero, Вы писали:
[...]

Ни гу-гу... А если с картинками ?




По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re: PaintDesktop presents...
От: Аноним  
Дата: 15.12.06 21:01
Оценка:
Ну да багофича в винде. WS_EX_LAYERED окна реально рисуются в отдельный участок видеопамяти карты, который специально для них и заводится, и в котором они находяться в коордиатах 0,0 и потом "накладываются" на общее изображение видеокартой аппаратно. Как все это корректно работает — проблемы MS... Это лирическое отступление. Далее — порнография
        GreGetDCOrgEx(hdc, &pt, &rcOrg);
        CopyRect(&rcT, &rcOrg);
        OffsetRect(&rcT, -rcT.left, -rcT.top);
        GreSetDCOrg(hdc, rcT.left, rcT.top, (PRECTL)&rcT);

        fRet = xxxEnumDisplayMonitors(
                hdc,
                NULL,
                (MONITORENUMPROC) xxxDesktopPaintCallback,
                (LPARAM)pwnd,
                TRUE);


Теперь берем приложение win32 — сгенеренный студией "hello woeld" и добавляем куда нить в оконную процедуру:
[code]
HDC hdc = GetDC(hWnd);
POINT pt={0};
GetDCOrgEx(hdc,&pt);
char cap[64];sprintf(cap,"%u:%u",pt.x,pt.y);
::SetWindowText(hWnd, cap);
ReleaseDC(hWnd,hdc);
[code]

Так вот для WS_EX_LAYERED окон GetDCOrgEx всегда возвращает 4:42
Re[2]: PaintDesktop presents...
От: Аноним  
Дата: 15.12.06 21:09
Оценка:
K>Ни гу-гу...
Дык потому что асм. Да еще на макросах. Я лично вашу прогу в windbg изучал, — и то понятнее. Да вобщем то если бы не пиво — не изучал бы даже

Вдогонку к предыдущей мессаге — если вместо GetDC заюзать GetWindowDC — GetDCOrgEx вернет ровнехонько 0:0
Re[3]: PaintDesktop presents...
От: kero Россия  
Дата: 20.12.06 08:52
Оценка:
Привет вам, Аноним 59 !

K>>Ни гу-гу...

A>Дык потому что асм. Да еще на макросах. Я лично вашу прогу в windbg изучал, — и то понятнее. Да вобщем то если бы не пиво — не изучал бы даже

Да ладно вам — пиво В вас говорит ярко выраженная поэтическая натура, со свойственными ей чудовищными хужожественными преувеличениями
Особенно понравилась шутка про windbg: тривиальный состав "моей проги" полностью изложен в первом же абзаце ("это просто-напросто диалог с кнопками", итд).

Просто-напросто — сам казус достаточно любопытный, тем более что ну очень наглядный.

Теперь несколько вопросов/замечаний по существу вашего отклика.

A>WS_EX_LAYERED окна реально рисуются в отдельный участок видеопамяти карты, который специально для них и заводится


Не укажете ли источник инфы об упомянутом специальном участке видеокарты ?

A>Как все это корректно работает — проблемы MS... Это лирическое отступление.


Почему — отступление ?? По-моему — в этом как раз суть...

A>Так вот для WS_EX_LAYERED окон GetDCOrgEx всегда возвращает 4:42


А вот здесь пошли неточности.

Во-первых — не для WS_EX_LAYERED, а для WS_EX_LAYERED+SetLayeredWindowAttributes окон.
Попробуйте WS_EX_LAYERED+UpdateLayeredWindow, и убедитесь сами, что для таких окон результат GetDCOrgEx зависит от положения окна на экране, как и для обычных не-WS_EX_LAYERED окон.

Во-вторых — конечно, не всегда 4:42.
А всегда — TopLeft клиентской области в оконных координатах относительно TopLeft окна.
В качестве иллюстрации — снапшот утилитки, из которой и выдран (ради предельного упрощения) фигурирующий в этой ветке PaintDesktoper:



Видите — тут 4,23. "DcOrg:" добавлено в утилитку именно по вашей наводке, но обратите внимание на [4,23,-4,-4], т.е. разность окно/клиентская область.

A>Вдогонку к предыдущей мессаге — если вместо GetDC заюзать GetWindowDC — GetDCOrgEx вернет ровнехонько 0:0


Ну, здесь-то удивляться нечему, это-то в порядке вещей, см. выше.

Однако к чему зацикливаться на layered окнах ?

Наоборот, изначально целью было показать, как сходно глючит в трех разных механизмах (использующих, если не вру, off-screen bitmap):
WS_EX_LAYERED+SetLayeredWindowAttributes, WS_EX_COMPOSITED и PrintWindow.

А PaintDesktop подвернулась как подходящая пузырьковая камера
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[4]: PaintDesktop presents...
От: Аноним  
Дата: 20.12.06 12:05
Оценка:
A>>WS_EX_LAYERED окна реально рисуются в отдельный участок видеопамяти карты, который специально для них и заводится
K>Не укажете ли источник инфы об упомянутом специальном участке видеокарты ?
Собственные логические размышления. WS_EX_LAYERED окно с как вы правильно заметили атрибутом прозрачности/блендинга при перетаскивании не вызываем перерисовки лежащих под ним окон. Именно поэтому они кстати и рекомендуются мсдном для окон произвольной формы (помимо блендинга).
Поскольку DC обычного окна на самом деле транслируется в DC всего экрана, а потом видеодрайвером — в первичный фреймбуфер, логично что такие окна рисуются в какой то свой фреймбуфер и потом накладываются на основной. Примерно так же как делается видеовывод изображения в overlay режиме медиаплеером.



A>>Так вот для WS_EX_LAYERED окон GetDCOrgEx всегда возвращает 4:42


K>А вот здесь пошли неточности.

K>Во-первых — не для WS_EX_LAYERED, а для WS_EX_LAYERED+SetLayeredWindowAttributes окон.
K>Попробуйте WS_EX_LAYERED+UpdateLayeredWindow, и убедитесь сами, что для таких окон результат GetDCOrgEx зависит от положения окна на экране, как и для обычных не-WS_EX_LAYERED окон.
Нуууу. Не надо плз придираться к словам. Я реально тогда с пивом сидел


K>Во-вторых — конечно, не всегда 4:42.

K>А всегда — TopLeft клиентской области в оконных координатах относительно TopLeft окна.
K>В качестве иллюстрации — снапшот утилитки, из которой и выдран (ради предельного упрощения) фигурирующий в этой ветке PaintDesktoper:
4:42 это просто такие размеры non-client области окна на момей системе были

K>


K>Видите — тут 4,23. "DcOrg:" добавлено в утилитку именно по вашей наводке, но обратите внимание на [4,23,-4,-4], т.е. разность окно/клиентская область.


A>>Вдогонку к предыдущей мессаге — если вместо GetDC заюзать GetWindowDC — GetDCOrgEx вернет ровнехонько 0:0

K>Ну, здесь-то удивляться нечему, это-то в порядке вещей, см. выше.
Это я писал именно для пояснени 4:42. Те посчитал что вы догадаетесь про NON_CLIENT area и поймете что я на это вам так намекнул
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.