Страницы: 1
RSS
Прозрачность фомы при открытии!
 
Здравствуйте!  
На форуме проскакивал код для задания прозрачности формы через элемент на форме.  
Я для себя попытался переделать код, чтобы форма сразу становилась прозрачной при открытии, но у меня прозрачным становится сам Excel, а не форма.  
Посмотрите, как поправить?
 
Я использую такой код:  
 
Private Sub B_Transpar_Click()  
   If Me.B_Transpar.Value Then  
       Dim transpar As Integer: transpar = 155 ' для примера  
       If transpar > 30 And transpar < 256 Then SetTransparent FindWindow(vbNullString, Me.Caption), CByte(transpar)  
   Else  
       SetVisible FindWindow(vbNullString, Me.Caption), 255  
   End If  
End Sub  
 
 
Public Function SetTransparent(hWnd As Long, Layered As Byte) As Boolean    'регулирует прозрачность формы  
   On Error GoTo 1    'hWnd - манипулятор окна, Layered - степень прозрачности от 0 до 255  
   Dim Ret As Long: Ret = GetWindowLong(hWnd, GWL_EXSTYLE)    'Определяем стиль нужного окна  
   Ret = Ret Or WS_EX_LAYERED    'Задаём стиль окна как заслоённый  
   SetWindowLong hWnd, GWL_EXSTYLE, Ret  
   SetLayeredWindowAttributes hWnd, 1, Layered, LWA_ALPHA    'Задём степень прозрачности окна  
   SetTransparent = True: Exit Function  
1   beepL  
   Exit Function  
End Function  
 
Public Function SetVisible(hWnd As Long, Layered As Byte) As Boolean    'возвращает видимость форме  
   On Error GoTo 1    'hWnd - манипулятор окна, Layered - степень прозрачности от 0 до 255  
   SetWindowLong hWnd, GWL_EXSTYLE, 257    'Задаём стиль окна как незаслоённый (возвращаем прежнее значение)  
   SetLayeredWindowAttributes hWnd, 1, Layered, LWA_ALPHA    'Задём степень прозрачности окна  
   SetVisible = True: Exit Function  
1   beepL  
   Exit Function  
End Function
 
У Вас ошибка в строке    
 
' Текущее окно  
   hWnd = GetActiveWindow  
 
Таким способом Вы получаете hWnd окна Excel, а не hWnd Вашей формы.  
 
Замените эту строку на что-то вроде  hWnd = FindWindow(vbNullString, Me.Caption)  
 
А вот и пример файла:  
http://excelvba.ru/XL_Files/Sample__12-08-2009__19-24-21.zip  
 
 
И не забудьте про    
'============= Функции для поиска окна =================================  
'поиск окна  
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long  
'поиск дочернего окна  
Public Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hWndParent As Long, ByVal hwndChildAfter As Long, ByVal lpszClass As Any, ByVal lpszWindow As Any) As Long
 
Спасибо огромное, я попробовал чуть видоизменить код, чтобы разместить код в модуле листа и запускать макрос при инициализации либой формы в документе, для этого создал переменную, которой присваиваю имя запускаемой формы Per = Me.Name  
и далее использую в макросе TransEnab  
hWnd = FindWindow(vbNullString, Per.Caption)  
Но так как ламер, что-то делаю не так, посмотрите пожалуйста файл.
 
Даже смотреть не буду...  
 
Замените Per = Me.Name на Per = Me.caption  
 
и hWnd = FindWindow(vbNullString, Per.Caption)  
на hWnd = FindWindow(vbNullString, Per)
 
Сделал как Вы сказали, ошибку теперь не выдает, но и форма прозрачной не становится.  
 
Private Sub UserForm_Initialize()  
   Per = Me.Caption  
   Call TransEnab  
End Sub  
 
Const LWA_ALPHA = &H2, GWL_EXSTYLE = (-20), WS_EX_LAYERED = &H80000  
 
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _  
(ByVal hWnd As Long, ByVal nIndex As Long) As Long  
 
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _  
(ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long  
 
Public Declare Function SetLayeredWindowAttributes Lib "user32" _  
(ByVal hWnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, _  
ByVal dwFlags As Long) As Long  
 
Public Declare Function GetActiveWindow Lib "user32" () As Long  
 
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _  
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long  
 
Sub TransEnab()  
   Dim aStyle As Long  
   Dim Transparent As Byte  
   Transparent = 200  
   hWnd = FindWindow(vbNullString, Per)  
   aStyle = GetWindowLong(hWnd, GWL_EXSTYLE)  
   aStyle = aStyle Or WS_EX_LAYERED  
   Call SetWindowLong(hWnd, GWL_EXSTYLE, aStyle)  
   Call SetLayeredWindowAttributes(hWnd, 0, Transparent, LWA_ALPHA)  
End Sub
 
Прошу прощенья, забыл переменную объявить:  
Public Per As String  
 
Спасибо огромное, все работает.
 
Еще один коротенький вопрос, как в макрос задания прозрачности вставить код закрытия соответствующей формы?  
Sub TransEnab()  
Dim aStyle As Long  
Dim Transparent As Byte  
Transparent = 200  
hWnd = FindWindow(vbNullString, Per)  
aStyle = GetWindowLong(hWnd, GWL_EXSTYLE)  
aStyle = aStyle Or WS_EX_LAYERED  
Call SetWindowLong(hWnd, GWL_EXSTYLE, aStyle)  
Call SetLayeredWindowAttributes(hWnd, 0, Transparent, LWA_ALPHA)  
 
Unload .... (ни Me ни Per не подходит)  
 
End Sub
 
Здесь как раз по-моему надо при инициализации задать переменную:  
 
Per1 = Me.Name  
 
А в макросе TransEnab() в конце поставить Unload Per1  
И как-то объявить переменную Per1  
Public Per1 As ....  
 
Как ни пытался - выдает ошибку.
 
Вроде должно быть как-то просто: нужно в коде формы переменной присвоить данные этой формы (имя или что-то еще), а в коде модуля закрыть эту форму с помощью этой переменной.  
Но я не могу понять как?
 
Спасибо The Prist - как все просто.
 
Вот что в итоге получилось.  
Может этот файл в копилку примеров?  
В нем сразу несколько вариантов решений:  
1. Запрет закрытия формы по крестику;  
2. Запрет перемещения формы;  
3. Открытие формы с заданной прозрачностью;  
4. Закрытие формы с эффектом затухания;  
 
5. Еще бы добавить открытие формы с проявлением - тогда полный набор, у меня не получилось.
 
Нет, я все-таки хочу добить тему с прозрачностью и добавить эфект открытия формы с проявлением. Как добиться проявления путем нажатия кнопки на форме уже после ее отображения, я сделал. А вот как сделать, чтобы проявление было именно при открытии формы?  
За проявление отвечает макрос TransStart, если в коде формы я ставлю Call TransStart, то форма сразу появляется с конечным значением переменной х в цикле.  
Посмотрите пожалуйста (файл во вложении).
 
Класс, я как раз думал чтобы еще такого из красивостей можно было сделать и вот готовый вариант.
 
в кодах не силен  
сделал проще  
в коде формы:  
Call TransEnab ' показываем форму с уровнем прозрачности "0"  
Application.OnTime Now + TimeValue("00:00:00"), "TransStart" ' и сразу же жестко переходим на плавное изменение прозрачности от "0" до "255"  
 
PS Огроменное спасибо за код!!!
 
Спасибо, Slav, оказалось так все просто.  
Результат во вложении.
 
День добрый ! Я тут попробовал на тестовом файле использовать код от EducatedFool, для задания Форме прозрачности. Мне вообще то ПОЛУпрозрачная Форма нужна, но я верю что этот код даст мне возможность откорректировать прозрачность. Так вот, крутил я вертел, как этот код в Проект вставить, так и не сумел. Выложил всё в модуль, туда же макрос инициации кнопки с "UserForm1.Show". Форма появляется, но прозрачностью и не пахнет. Не знаю, может в процесс Инициации формы надо тоже что-то вставить ? Поможите пожалуйста "выпрямить руки".
 
Вариант.
 
Спасибо Юрий. Думаю это как раз то, что мне было нужно. Причём макрос подробно расписан. Попробую его переделать под себя.
Страницы: 1
Читают тему
Наверх