psilogic: (Default)
[personal profile] psilogic
Хе-хе... долго ковырялся, как сделать частично прозрачное окно типа "Ассистента" у Microsoft Word или скругленных уголков у окна WinAmp. Ковыряния увенчались успехом, так что, если кому надо, делюсь фишкой.

0. Создаем окно WS_POPUP (только этот стиль, больше ничего)
1. Создаем пустой HRGN - CreateRectRgn(0, 0, 0, 0)
2. Добавляем туда (через CombineRgn) все области, которые НЕ должны быть прозрачными. В моем случае это все child-окна, но не само parent-окно.
3. Вызываем SetWindowRgn для этого окна и суммарного HRGN (важно: суммарный HRGN после этого не удаляем)
4. Только после этого делаем окно видимым - через ShowWindow(...SW_SHOWNOACTIVATE)

Роботаед *hop* *hop* :)

Date: 2009-08-02 10:50 pm (UTC)
From: [identity profile] http://technorati.com/people/technorati/ketmar (from livejournal.com)
SetWindowLayeredAttributes rtfm. можно делать альфу, можно спрайты с color key. удобно, приятно, вкусно, для deskmates самое то. регионы устарели.

Date: 2009-08-02 11:06 pm (UTC)
From: [identity profile] psilogic.livejournal.com
только наоборот - SetLayeredWindowAttributes :) немножко не то, прозрачность задается цветом. но тоже надо поиграццо...

Date: 2009-08-02 11:08 pm (UTC)
From: [identity profile] http://technorati.com/people/technorati/ketmar (from livejournal.com)
да писал же по памяти же. %-)
а так — точно то. у тебя 0xffffff цветов, йоба — тебе жалко один на прозрачность отдать? заодно и альфу можно указывать, это гломурно. а если окно постоянно меняет форму (Miner Willy марширует, ага), то с регионами задолбаешься.

а пробовать там нечего — там сесть и написать. %-) у меня где-то на Delphi (ненене, без VCL, WinAPI %-) ещё валяются несколько самопальных скринмэйтов с этой фигнёй.

Date: 2009-08-02 11:19 pm (UTC)
From: [identity profile] psilogic.livejournal.com
Мине не жалко цвет, просто не хочется заливать этим цветом, когда форма задана геометрически, а не прорисована.

а вот неопреденной формы спрайты - да, с теми так проще.

С альфой я в другом месте игралси...

Date: 2009-08-02 11:10 pm (UTC)
From: [identity profile] http://technorati.com/people/technorati/ketmar (from livejournal.com)
учти только, что на такое окно не рекомендуется класть обычные контролы — оно хитрожопо должно перерисовываться полностью в WM_PAINT, иначе невозбранно отловишь удовольствия.

Date: 2009-08-02 11:20 pm (UTC)
From: [identity profile] psilogic.livejournal.com
щас ради прикола попробую окно с навороченными контролами :)

Date: 2009-08-02 11:23 pm (UTC)
From: [identity profile] http://technorati.com/people/technorati/ketmar (from livejournal.com)
может и получиться. а может и нет. всё зависит от фазы луны и количества муравьёв в ближайших муравениках. в целом — не рекомендуют, потому что работает как хочет и когда хочет. и с чем хочет. потому что на самом деле это кривучий хак от m$, за который надо отрывать ноги по самые уши.

Date: 2009-08-02 11:35 pm (UTC)
From: [identity profile] psilogic.livejournal.com
гы... забава...
рисуется без проблем и глюков. причем, я использовал сразу и LWA_ALPHA, и LWA_COLORKEY. окно довольно навороченное - там и owner-draw контролы, и стандартные и с суперклассингом. непрозрачным получается только меню (тоже ownerdraw) - остальное все как надо.

зато глючит мыша: при установке цвета прозрачности можно "кликать" на все объекты, которые "просвечивают" насквозь. в то же время отловить наведение мыши на такие объекты - дело проблематичное...

ну типа там наведение мыши на кнопку - кнопка анимируется. а теперь кнопка под прозрачным окном - и не анимируется, т.к. окну невдомёк что на него навели :) то есть WM_MOUSELEFTDOWN пробивает насквозь, а WM_MOUSEMOVE - нет.

Date: 2009-08-02 11:45 pm (UTC)
From: [identity profile] http://technorati.com/people/technorati/ketmar (from livejournal.com)
вообще-то должно, вроде как. впрочем, давно всё это было, ох, давно. %-)

сделай окно WS_EX_TRANSPARENT, тогда, по-моему, вообще все события будут «насквозь» идти. не то, что надо, но тоже забавно.

Date: 2009-08-02 11:44 pm (UTC)
From: [identity profile] psilogic.livejournal.com
хех... подумалось, может, у меня потому сразу и заработало, что у меня нет ни одного совсем стандартного контрола - все либо полностью свое, либо через суперклассинг. если вспомнишь, что там за проблемы были, кинь сцылочку. с мышкой - это не проблемы, достаточно запретить клики "насквозь"

Date: 2009-08-02 11:46 pm (UTC)
From: [identity profile] http://technorati.com/people/technorati/ketmar (from livejournal.com)
неа, не вспомню, рой сам. ты чо, 5 лет уж примерно прошло, я не титан — столько лет всякую фигню помнить. %-)

Date: 2009-08-03 06:45 am (UTC)
From: [identity profile] psilogic.livejournal.com
не титькан :P

Date: 2009-08-03 06:48 am (UTC)
From: [identity profile] http://technorati.com/people/technorati/ketmar (from livejournal.com)
и это тоже. %-)

Date: 2009-08-02 11:13 pm (UTC)
From: [identity profile] psilogic.livejournal.com
хмм... тоже прикольно, даже не знаю что симпотишнее выблядит :)

Date: 2009-08-02 11:18 pm (UTC)
From: [identity profile] http://technorati.com/people/technorati/ketmar (from livejournal.com)
зависит от задачи. если нужны на окне стандартные (да и вообще любые с HWND) контролы — то делать регионы. если спрайтики/морда самопальная и рисуется вся на одном битмапе — SLWA. ну, а для окон-спрайтов кагбэ кроме SLWA нормальных вариантов и нет.
Page generated Aug. 18th, 2025 09:37 am
Powered by Dreamwidth Studios