Вопрос

Глядя на окна tooltips окно подсказки класса, я вижу, что оно рисует свою падающую тень снаружи окно подсказки представляет собой фактический прямоугольник.

Используя Шпионский секс - я могу получить прямоугольник окна всплывающей подсказки и стили классов:

Rectangle:     (440, 229)-(544, 249), 104x20
Restored Rect: (440, 229)-(544, 249), 104x20
Client Rect:   (0, 0)-(104, 20), 104x20

Вы заметите, что падающая тень, которую вы видите, физически снаружи окно, которое рисуется.Как я могу нарисовать тень снаружи вокруг моего окна, будучи снаружи мое окно?

Примечание: Тень не рисуется с использованием стандартного CS_DROPSHADOW классный стиль. я подтвердил это экспериментально, а также могу увидеть стиль класса для окна в Шпионский секс;он не использует CS_DROPSHADOW:

Windows Styles:     94000001

    WS_POPUP        80000000
    WS_VISIBLE      10000000
    WS_CLIPSIBLINGS  4000000
    TTS_ALWAYSTIP          1

Extended Styles:    00080088

    WS_EX_LAYERED      80000
    WS_EX_TOOLWIN         80
    WS_EX_TOPMOST          8

Итак, как я могу рисовать за своим окном?

Примечание: Попытка рисовать на рабочем столе DC не удалась.От Грега Шехтера Перенаправление приложений GDI, DirectX и WPF:

Рисование на экране и чтение с него -- Баааад!

Наконец, поскольку мы затронули тему перенаправления одна из особенно опасных практика заключается в записи на экран, либо с помощью GetDC(NULL) и пишу к этому или пытаюсь сделать линии XOR с резинкой и т.д.Есть две серьезные причины, по которым запись на экран плохой:

Это дорого...запись на экран сама по себе не дорогая, но она почти всегда сопровождается чтением с экрана, потому что один обычно выполняет чтение-изменение-запись операции, подобные XOR, при записи на экран.Чтение видео поверхность памяти стоит очень дорого, требует синхронизации с МДВ, в палатках и весь ГПУ трубы, как также применение МДВ трубы.
Это непредсказуемо...если вам каким-то образом удастся добраться до фактического основного и записать на него, не может быть никакой предсказуемости относительно того, как долго то, что вы записали на основной, будет оставаться на экране .Поскольку UCE не знает об этом, оно может быть удалено при обновлении следующего кадра или может сохраняться в течение очень долгого времени, в зависимости от что еще необходимо обновить на экране .(Мы действительно не разрешаем прямую запись на основной во всяком случае, по именно по этой причине...если вы попытаетесь получить доступ к основному DirectDraw, например , DWM отключится до тех пор, пока приложение, осуществляющее доступ, не завершит работу)

Это было полезно?

Решение

Вы не можете рисовать за своим окном так, как вы описываете.

Щелкнув правой кнопкой мыши на рабочем столе, перейдите в раздел " Свойства" / "Внешний вид" / "Эффекты" и снимите флажок "Показывать тени в меню" ...у вас больше не будет тени.

Суть в том, что это продукт оконного менеджера, а не вашей программы.

Другие советы

Q:Как вы рисуете за пределами одного окна?A:Нарисуйте внутри другой окно!

Первое, что следует отметить, это то, что класс tooltip на самом деле делает используйте CS_DROPSHADOW стиль - но обратите внимание, что это класс стиль, а не окно стиль, так что вы должны смотреть на Класс перейдите на вкладку в диалоговом окне свойств Spy ++, чтобы найти его.Вы увидите, что tooltips_class32 в Windows действительно есть это - и несколько других.

Но это просто приводит к следующему вопросу - как это работать?Что ж, похоже, что Windows реализует это, создавая вспомогательный HWND для отрисовки тени - предположительно, он создает другое всплывающее окно того же размера и формы, что и то, которое он затеняет, заливает его серым, помещает прямо под главным окном и устанавливает его как WS_EX_LAYERED окно, чтобы тень могла быть прозрачной и исчезать по краям с помощью альфа-растушевки.И ничто не мешает вам самостоятельно использовать те же или похожие методы, если вы хотите добавить другой тип эффекта тени к одному из ваших собственных окон.

Итак, короткая история: если вы хотите рисовать за пределами своего собственного окна, создайте вспомогательное прозрачное окно в общей области, в которой вы хотите рисовать, и рисуйте вместо этого в этом вспомогательном окне.

--

Теперь, если вы попытаетесь найти одно из этих вспомогательных теневых окон в Spy ++, вы мало что найдете.В отличие от tooltip_class32 окна, которые долговечны и просто скрываются / проявляются по мере необходимости, эти теневые окна - более неуловимое создание:они создаются только до тех пор, пока это необходимо, поэтому вам придется обновлять Spy ++, пока есть всплывающая подсказка, всплывающее меню или другое окно, использующее присутствующую тень, - а это сложно, поскольку большинство всплывающих подсказок и меню исчезнут, как только вы наведете курсор мыши, чтобы переключиться на Spy ++.Но оказывается, что всплывающие подсказки на собственной панели инструментов Spy ++ останутся неизменными:итак, запустите Spy ++, наведите курсор на элемент на панели инструментов и нажмите F5 чтобы обновить дерево HWND, пока присутствуют всплывающая подсказка и тень.Теперь прокрутите вниз, и вы должны увидеть, что третий и четвертый видимые HWND в дереве - это сама всплывающая подсказка, а сразу после этого SysShadow окно.К сожалению, поскольку всплывающая подсказка и тень к настоящему времени исчезли, если вы попытаетесь вызвать диалоговое окно свойств для этого HWND, вы получите пустое диалоговое окно свойств с сообщением "Недопустимое окно".Если вы действительно хотите покопаться и посмотреть, как работает эта системная тень, какие стили она сама использует и так Далее, вы могли бы создать целевое приложение с долговечным всплывающим окном, которое использует CS_DROPSHADOW который затем вы можете изучить в Spy ++ на досуге.

(Наконец, обратите внимание, что эти тени совершенно отличаются от теней, которые вы видите, когда одно окно приложения находится поверх другого над другим, начиная с Vista:этот тип тени является частью режима Aero Glass и обрабатывается тем же Менеджер композиции рабочего стола это добавляет эффект стеклянной панели заголовка, и в нем не используются вспомогательные окна для реализации теней.)

Я бы не удивился, если бы эта тень была тесно связана с самим оконным менеджером;в конце концов, именно оконный менеджер принимает решение что окно начинает раскрашиваться который части самого себя и когда он может это сделать.Я не вижу ничего сверхъестественного в том, чтобы нарисовать эту тень, если будет получен контроль над всем этим, которым обладает оконный менеджер.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top