Привет, люди !
Возникла у меня хотца, чтобы сделать модное ныне полупрозрачное окно ( речь идет только о Win2000 и XP ). Пошарил я в поиске по сайту, однако полностью готового решения не нашел. Поэтому я позволил себе объединить всю найденную инфу и предлагаю всем функцию для сабжа. Не требуется никакого платформ SDK и компилится все в VC6. В параметрах передается хэндлер окна, которое сделается п/прозрачным и уровень полупрозрачности.
[ccode]
#define _WIN32_WINNT 0x0501
#pragma comment (lib, "user32.lib")
typedef VOID (*MYPROC)(HWND hwnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags);
void setLayeredWindow( HWND hWnd, BYTE ab = 200 )
{
LONG st = ::GetWindowLong( hWnd, GWL_EXSTYLE );
::SetWindowLong( hWnd, GWL_EXSTYLE, st | 0x00080000 /*WS_EX_LAYERED*/ );
K>#define _WIN32_WINNT 0x0501
K>#pragma comment (lib, "user32.lib")
K>...
K>[\ccode]
А зачем эти строчки? На первый взгляд не нужны. Без них работает. Тем более, что 0x0501 это XP, а Win2000 тоже катит.
K>[ccode]
K>typedef VOID (*MYPROC)(HWND hwnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags);
K>
Возможно, у тебя стоит __stdcall по умолчанию, но расчитывать, что так у всех неправльно. У меня без этого падало.
K>Все вроде просто и без проблем. Самое грустное во всем этом то, что я так и не смог найти оправданное применение полупрозрачным окнам в своем проекте.
Это да. Разве что поиграться ..
K>Надеюсь, что кому — нибудь помог.
Ну не то чтобы помог, но теперь я хоть знаю, насколько это просто. Если вдруг понадобится, буду использовать. Спасибо.
Здравствуйте, Koumandin, Вы писали:
K> Все вроде просто и без проблем. Самое грустное во всем этом то, что я так и не смог найти оправданное применение полупрозрачным окнам в своем проекте.
можно сделать красивый fade-эффект (плавно исчезающее окошко) — я этим уже полгода пользуюсь
Здравствуйте, Egel, Вы писали:
E> можно сделать красивый fade-эффект (плавно исчезающее окошко) — я этим уже полгода пользуюсь
На кврточках, не поддерживающих аппаратного ускорения хотя бы 2D, весь этот fade не просто тормозит, он неприлично тормозит: fade среднего окошка за 1.5 секунды(!) — в порядке вещей. Поэтому идея прямо скажем не совсем удачная.
Здравствуйте, Egel, Вы писали:
E> можно сделать красивый fade-эффект (плавно исчезающее окошко) — я этим уже полгода пользуюсь
Тогда два вопросика.
В каком обработчике событий лучше изменять прозрачность?
И почему MDI-окна не хотят быть прозрачными ? Диалоговые окна "без базара" устанавливают прозрачность . А MDI — нет . А диалоговые — да .
... Эрудиция. Пыль, вытряхнутая из книги в пустой череп. — А. Бирс ...
Здравствуйте, Koumandin, Вы писали:
K> Все вроде просто и без проблем. Самое грустное во всем этом то, что я так и не смог найти оправданное применение полупрозрачным окнам в своем проекте.
ну, я делал таким образом Log ошибок... он делается как Stay On Top и прозрачный на 60 процентов + автоматом выскакивает..
при работе клавой — не мешает...
+ делал закрывалку рабочего стола пошутил
... << RSDN@Home 1.0 beta 6a >>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Здравствуйте, Koumandin, Вы писали:
K> Привет, люди ! K>Возникла у меня хотца, чтобы сделать модное ныне полупрозрачное окно ( речь идет только о Win2000 и XP ). Пошарил я в поиске по сайту, однако
*** K>void setLayeredWindow( HWND hWnd, BYTE ab = 200 )
K> MYPROC ProcAdd = (MYPROC)GetProcAddress( user32, "SetLayeredWindowAttributes" ); K> if ( ProcAdd ) K> (ProcAdd)(hWnd, RGB(0x80, 0x80, 0x80), ab, 2/*LWA_ALPHA*/);
***
Намного интереснее передавать не двойку а 1. Тогда можно сказать окну, что "такой-то вот цвет во всем что на тебя рисуется считать за прозрачный". и потом рисовать! эффект потрясающий — например если сделать прозрачным белый и положить editbox с белым фоном можно набивать текст прям поверх других окон ну вообще применений куча (правда развлекательного характера)