Страница: 1 |
Страница: 1 |
Вопрос: Украшения для проги
Добавлено: 16.08.09 09:55
Автор вопроса:
Ciaocacao
Пишу программу, в которой много внимания уделяю дизайну и внешнему виду проги (не главное, чтобы работало, главное чтобы красиво было :)), столкнулся с трудностями, нужна помощь товарищей по Basic'у.
1. Сделать прозрачной или полупрозрачной форму довольно легко. Подскажите, можно ли сделать прозрачным\полупрозрачным Picture1 на непрозрачной форме? И если можно, то как?
2. Имеется картинка Picture1 и Slider1 (или любой другой ползунок). Как сделать, чтобы при изменении значения ползунка картинка меняла цвет, но изображение (за исключением смены цвета) оставалось прежним? (В некоторых программах это называется цветовой схемой, находится в настройках там же, где и выбор скина (если имеется), лучше всего, на мой взгляд, реализовано в Zoom Player).
3. Подскажите, pls, можно ли сделать, чтобы при срабатывании кода "Picture1.Visible = False", картинка исчезала поспенно?
Ответы
Всего ответов: 12
Номер ответа: 1
Автор ответа: VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #1
Добавлено: 16.08.09 11:23
1. Для прозрачности юзай просто вместо PictureBox функцию AlphaBlend (погугли как там с ней общаться)
2. Для цветовой схемы можешь юзать готовые библиотеки (опять же погугли) или вручную проходить картинку попиксельно.
Номер ответа: 2
Автор ответа: Starkiller
ICQ: 123123
Вопросов: 3
Ответов: 14
Web-сайт:
Профиль | | #2
Добавлено: 16.08.09 13:12
3. Лучше свою функцию напиши (см пункт одЫн)
Номер ответа: 3
Автор ответа: VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #3
Добавлено: 16.08.09 14:47
Своя функция будет работать в сто раз медленнее.
Номер ответа: 4
Автор ответа: Ciaocacao
Вопросов: 3
Ответов: 5
Профиль | | #4
Добавлено: 16.08.09 15:41
Попробую, хотя раньше с этим не сталкивался, но, думаю, найду справку по ней.
А вообще, есть примеры использования AlphaBlend?
2. Для цветовой схемы можешь юзать готовые библиотеки (опять же погугли) или вручную проходить картинку попиксельно.
Готовые библиотеки использовать не хочется... а вручную по пикселям изменять картинку - это сильно заморочено? И опять же есть исходники?
Я сделал еще лучше Пошел длинным путем... каждую картинку представил в виде отдельной формы, расположенной поверх главной формы в виде картинки. Но это приносит еще кучу заморочек.
А писать отдельную функцию пока что не хватает опыта.
Номер ответа: 5
Автор ответа: UnDeAdZak
Вопросов: 80
Ответов: 476
Профиль | | #5
Добавлено: 16.08.09 20:39
Сорри за тупость, но как можно форму зделать полупрозрачной)
Номер ответа: 6
Автор ответа: VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #6
Добавлено: 16.08.09 21:02
Нужные АПИ и константы сам выципишь.
Номер ответа: 7
Автор ответа: Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #7
Добавлено: 17.08.09 16:56
vbd, мб perc as byte лучше? чтоб проверок лишних не делать
Номер ответа: 8
Автор ответа: VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #8
Добавлено: 17.08.09 18:25
SetLayeredWindowAttributes принимает Integer. Зачем лишние извращения? Да и On Error Resume Next подстрахует если чо.
Номер ответа: 9
Автор ответа: Илья
Вопросов: 1
Ответов: 48
Профиль | | #9
Добавлено: 18.08.09 19:24
Вот, скорость вроде нормальная: http://visualprog.ucoz.ru/Hide.rar
Номер ответа: 10
Автор ответа: Ciaocacao
Вопросов: 3
Ответов: 5
Профиль | | #10
Добавлено: 19.08.09 09:25
Илья, спасибо!
Картинка не столько даже медленно исчезает, но меняет цвет пописксельно, как мне и нужно было со 2-м вопросом.
Но есть и минусы: пример подвисает, и скорость исчезновения ну совсем уж медленная. Но, думаю, это уже решу сам.
В код формы нужно вбить вот это:
Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
Private Declare Function UpdateLayeredWindow Lib "user32" (ByVal hwnd As Long, ByVal hdcDst As Long, pptDst As Any, psize As Any, ByVal hDCSrc As Long, pptSrc As Any, crKey As Long, ByVal pblend As Long, ByVal dwFlags As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Const GWL_EXSTYLE = (-20)
Private Const LWA_COLORKEY = &H1
Private Const LWA_ALPHA = &H2
Private Const ULW_COLORKEY = &H1
Private Const ULW_ALPHA = &H2
Private Const ULW_OPAQUE = &H4
Private Const WS_EX_LAYERED = &H80000
Public Function isTransparent(ByVal hwnd As Long) As Boolean
On Error Resume Next
 im Msg As Long
Msg = GetWindowLong(hwnd, GWL_EXSTYLE)
If (Msg And WS_EX_LAYERED) = WS_EX_LAYERED Then
isTransparent = True
Else
isTransparent = False
End If
If Err Then
isTransparent = False
End If
End Function
Public Function MakeTransparent(ByVal hwnd As Long, Perc As Integer) As Long
Dim Msg As Long
On Error Resume Next
If Perc < 0 Or Perc > 255 Then
MakeTransparent = 1
Else
Msg = GetWindowLong(hwnd, GWL_EXSTYLE)
Msg = Msg Or WS_EX_LAYERED
SetWindowLong hwnd, GWL_EXSTYLE, Msg
SetLayeredWindowAttributes hwnd, 0, Perc, LWA_ALPHA
MakeTransparent = 0
End If
If Err Then
MakeTransparent = 2
End If
End Function
Public Function MakeOpaque(ByVal hwnd As Long) As Long
 im Msg As Long
On Error Resume Next
Msg = GetWindowLong(hwnd, GWL_EXSTYLE)
Msg = Msg And Not WS_EX_LAYERED
SetWindowLong hwnd, GWL_EXSTYLE, Msg
SetLayeredWindowAttributes hwnd, 0, 0, LWA_ALPHA
MakeOpaque = 0
If Err Then
MakeOpaque = 2
End If
End Function
Private Sub Form_Load()
MakeTransparent Me.hwnd, 150 '(ну, или подставь нужное значение от 0 до 255)
End Sub
Номер ответа: 11
Автор ответа: Илья
Вопросов: 1
Ответов: 48
Профиль | | #11
Добавлено: 19.08.09 13:44
Ну ты даёшь! Измени скорость исчезновения поменяв значение переменной vFrame
Номер ответа: 12
Автор ответа: Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #12
Добавлено: 20.08.09 15:55
Ciaocacao, isTransparent - достаточно так написать)