Я пытаюсь создать круговое окно, используя API Win32 и Direct2d в C ++. Из того, что я понимаю, единственный способ достичь этого - создать окно ws_popup и обработать все рисунки вручную. Моя цель состоит в том, чтобы окно включало в себя индивидуальную тень вокруг него. Эта тень должна быть окрашена с прозрачностью, чтобы за ним оставались настольные окна или другие окна. Кроме того, он должен быть прозрачным для мышиных событий, позволяя пользователям взаимодействовать с другими приложениями через затененную область. /code> позволяет обнаружить события мыши только в областях, окрашенных Direct2D, эффективно включает в себя круговое окно. Тем не менее, покраска с прозрачностью (альфа -значения), кажется, не работает, как и ожидалось, чем смешиваясь с фоном за окном, она смешивается с твердым черным фоном. Тем не менее, я смог сделать окно прозрачным для событий мыши, добавив результат ws_ex_transparent . p>
Другой подход, который я рассматривал, - это избегание ws_ex_layered и вместо этого используя dwmextendframeintoclientarea () . Этот метод допускает правильное смешивание прозрачности, но ws_ex_transparent больше не работает, а это означает, что события мыши не игнорируются в прозрачных областях. Кроме того, я заметил некоторое мерцание при перемещении окна извне экрана обратно, что делает этот подход менее идеальным. Я не нашел способ, чтобы события мыши проходили через:
< /p>
Вот эффект мерцания, который я обнаружил, и мне не нравится: < /p>
Вот мой полный код, переменная isdwm используется для переключения с одного подхода на другой: < /p>
Я пытаюсь создать круговое окно, используя API Win32 и Direct2d в C ++. Из того, что я понимаю, единственный способ достичь этого - создать окно ws_popup и обработать все рисунки вручную. Моя цель состоит в том, чтобы окно включало в себя индивидуальную тень вокруг него. Эта тень должна быть окрашена с прозрачностью, чтобы за ним оставались настольные окна или другие окна. Кроме того, он должен быть прозрачным для мышиных событий, позволяя пользователям взаимодействовать с другими приложениями через затененную область. /code> позволяет обнаружить события мыши только в областях, окрашенных Direct2D, эффективно включает в себя круговое окно. Тем не менее, покраска с прозрачностью (альфа -значения), кажется, не работает, как и ожидалось, чем смешиваясь с фоном за окном, она смешивается с твердым черным фоном. Тем не менее, я смог сделать окно прозрачным для событий мыши, добавив результат ws_ex_transparent . p> Другой подход, который я рассматривал, - это избегание ws_ex_layered и вместо этого используя dwmextendframeintoclientarea () . Этот метод допускает правильное смешивание прозрачности, но ws_ex_transparent больше не работает, а это означает, что события мыши не игнорируются в прозрачных областях. Кроме того, я заметил некоторое мерцание при перемещении окна извне экрана обратно, что делает этот подход менее идеальным. Я не нашел способ, чтобы события мыши проходили через: < /p> Вот эффект мерцания, который я обнаружил, и мне не нравится: < /p>
Вот мой полный код, переменная isdwm используется для переключения с одного подхода на другой: < /p> [code]#include #include #include #include