Форум — Ответы ( К темам )
? | 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 и вывести на экран. |