Форум — Ответы     (  К темам )
 ?  dr.phoenix: Народ!! Так как все-таки в NT, Xp и т.п. изменить степень прозрачности (03-01-2003 15:15:36)
Народ!! Так как все-таки в NT, Xp и т.п. изменить степень прозрачности окна?
 Devnvd (07-01-2003 13:47:21)
Прозрачность окна можно изменить только в системах Win2000 и выше, и только не для Child-окон, к тому же у окна должен быть стиль WS_EX_LAYERED. В Builder 6 у формы добавлено свойство AlphaBlend и AlphaBlendValue. Для ранних Builder'ов устанавливать прозрачность окну придётся самим используя этот пример:

void __fastcall TForm1::Button3Click(TObject *Sender)
{
#define WS_EX_LAYERED 0x00080000
#define LWA_ALPHA 0x00000002

SetWindowLong(this->Handle,GWL_EXSTYLE,GetWindowLong(this->Handle,GWL_EXSTYLE) | WS_EX_LAYERED);
HINSTANCE dllInst = NULL;
dllInst = LoadLibrary("user32.dll");
typedef bool (__stdcall *Ptr)(HWND hwnd,COLORREF crKey,BYTE bAlpha,DWORD dwFlags);
Ptr FunctPtr;
if(dllInst)
{
FunctPtr = (Ptr)GetProcAddress(dllInst, "SetLayeredWindowAttributes");
int res = 0;
if(FunctPtr)
res = FunctPtr(this->Handle,RGB(0,0,0),150,LWA_ALPHA);
else
ShowMessage("Error getting function address!");
}
else
ShowMessage("Can not load "user32.dll"!");
FunctPtr = NULL;
FreeLibrary(dllInst);
}
Учтите что при этом системе придётся производить дополнительные расчёты перед отображением формы на экране. Это занимает много времени и ресурсов, поэтому система станет несколько медленнее работать. Именно поэтому прозрачность и не была реализована ранее, когда были слабые машины и именно поэтому требуется многозадачность, которой в Win9x нет, иначе система блокировала бы другие процессы, когда занималась бы вырисовыванием прозрачности.

Альтернативой на других системах, может быть псевдопрозрачность, это когда вы сами производите операции сложения картинки под окном с картинкой окна. Для этого лучше предварительно преобразовать RGB в HLS или HSV, произвести операцию сложения пикселов в разных пропорциях, затем преобразовать обратно в RGB и вывести на экран.