Полупрозрачные окна ? Это просто !
От: Koumandin Россия  
Дата: 30.03.03 08:17
Оценка: 30 (4)
Привет, люди !
Возникла у меня хотца, чтобы сделать модное ныне полупрозрачное окно ( речь идет только о 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*/ );

HMODULE user32 = LoadLibrary( "User32.dll" );
if ( user32 )
{
MYPROC ProcAdd = (MYPROC)GetProcAddress( user32, "SetLayeredWindowAttributes" );
if ( ProcAdd )
(ProcAdd)(hWnd, RGB(0x80, 0x80, 0x80), ab, 2/*LWA_ALPHA*/);

FreeLibrary( user32 );
}
}
[\ccode]

Чтобы сделать прозрачным все приложение — вызываем эту функцию из InitInstance() приложения и передаем ей хандлер главной рамки

setLayeredWindow( m_pMainWnd->m_hWnd, 200 );

Для диалоговых окон — соответственно из OnInitDialog() и m_hWnd диалога.

setLayeredWindow( m_hWnd );

Все вроде просто и без проблем. Самое грустное во всем этом то, что я так и не смог найти оправданное применение полупрозрачным окнам в своем проекте.

Надеюсь, что кому — нибудь помог.
Сергей





31.03.03 14:37: Перенесено из 'WIN API'
Re: Полупрозрачные окна ? Это просто !
От: SergH Россия  
Дата: 30.03.03 11:47
Оценка: 8 (1)
Здравствуйте, Koumandin, Вы писали:

K>
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>


Правильно так:

typedef VOID (__stdcall *MYPROC)(HWND hwnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags);


Возможно, у тебя стоит __stdcall по умолчанию, но расчитывать, что так у всех неправльно. У меня без этого падало.

K>Все вроде просто и без проблем. Самое грустное во всем этом то, что я так и не смог найти оправданное применение полупрозрачным окнам в своем проекте.


Это да. Разве что поиграться ..

K>Надеюсь, что кому — нибудь помог.

Ну не то чтобы помог, но теперь я хоть знаю, насколько это просто. Если вдруг понадобится, буду использовать. Спасибо.
Делай что должно, и будь что будет
Re[2]: Полупрозрачные окна ? Это просто !
От: Slicer [Wirkwood] Россия https://ru.linkedin.com/in/maksim-gumerov-039a701b
Дата: 30.03.03 11:56
Оценка:
Для совместимости сырца с последующими версиями лучше, имхо, все же так:

typedef VOID (WINAPI *MYPROC)(HWND hwnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags);


Но это уже мелочи...

Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Re: Полупрозрачные окна ? Это просто !
От: Egel Россия  
Дата: 31.03.03 10:03
Оценка: 26 (3)
Здравствуйте, Koumandin, Вы писали:

K> Все вроде просто и без проблем. Самое грустное во всем этом то, что я так и не смог найти оправданное применение полупрозрачным окнам в своем проекте.



можно сделать красивый fade-эффект (плавно исчезающее окошко) — я этим уже полгода пользуюсь
Re[2]: Полупрозрачные окна ? Это просто !
От: sasha Грузия  
Дата: 31.03.03 10:13
Оценка: 64 (6)
Здравствуйте, Egel, Вы писали:

E>Здравствуйте, Koumandin, Вы писали:


E>

E> можно сделать красивый fade-эффект (плавно исчезающее окошко)

fade-эффект можно сделать намного легче
AnimateWindow(1000, AW_HIDE | AW_BLEND);
Re[2]: Полупрозрачные окна ? Это просто !
От: Frostbitten Россия  
Дата: 31.03.03 11:34
Оценка:
Здравствуйте, Egel, Вы писали:

E> можно сделать красивый fade-эффект (плавно исчезающее окошко) — я этим уже полгода пользуюсь


На кврточках, не поддерживающих аппаратного ускорения хотя бы 2D, весь этот fade не просто тормозит, он неприлично тормозит: fade среднего окошка за 1.5 секунды(!) — в порядке вещей. Поэтому идея прямо скажем не совсем удачная.
Re[3]: Полупрозрачные окна ? Это просто !
От: SergH Россия  
Дата: 31.03.03 11:37
Оценка:
Здравствуйте, Frostbitten, Вы писали:

F>... Поэтому идея прямо скажем не совсем удачная.


Зато единственная
Делай что должно, и будь что будет
Re[2]: Полупрозрачные окна ? Это просто !
От: FireShock Россия  
Дата: 31.03.03 12:21
Оценка:
Здравствуйте, Egel, Вы писали:

E> можно сделать красивый fade-эффект (плавно исчезающее окошко) — я этим уже полгода пользуюсь


Тогда два вопросика.
В каком обработчике событий лучше изменять прозрачность?
И почему MDI-окна не хотят быть прозрачными ? Диалоговые окна "без базара" устанавливают прозрачность . А MDI — нет . А диалоговые — да .

... Эрудиция. Пыль, вытряхнутая из книги в пустой череп. — А. Бирс
...
Instagram
Re: Полупрозрачные окна ? Это просто !
От: Hacker_Delphi Россия  
Дата: 31.03.03 12:35
Оценка:
Здравствуйте, Koumandin, Вы писали:

K> Все вроде просто и без проблем. Самое грустное во всем этом то, что я так и не смог найти оправданное применение полупрозрачным окнам в своем проекте.


ну, я делал таким образом Log ошибок... он делается как Stay On Top и прозрачный на 60 процентов + автоматом выскакивает..
при работе клавой — не мешает...
+ делал закрывалку рабочего стола пошутил
... << RSDN@Home 1.0 beta 6a >>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re: Полупрозрачные окна ? Это просто !
От: IPv6 Россия http://www.lumarnia.com/
Дата: 04.04.03 10:46
Оценка: 5 (1)
Здравствуйте, 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 с белым фоном можно набивать текст прям поверх других окон ну вообще применений куча (правда развлекательного характера)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.