В аттаче —
кандидат в кунсткамеру 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, Вы писали:
[...]
Ни гу-гу... А если с картинками ?
Ну да багофича в винде. 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
K>Ни гу-гу...
Дык потому что асм. Да еще на макросах. Я лично вашу прогу в windbg изучал, — и то понятнее. Да вобщем то если бы не пиво — не изучал бы даже
Вдогонку к предыдущей мессаге — если вместо GetDC заюзать GetWindowDC — GetDCOrgEx вернет ровнехонько 0:0
Привет вам, Аноним 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 подвернулась как подходящая пузырьковая камера
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 и поймете что я на это вам так намекнул