Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
178 / 68 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
1

Как анимировать нажатие кнопки?

29.08.2016, 21:03. Показов 2107. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем здравствуйте.
Есть изображение, соответствующее нажатому состоянию и изображение, соответствующее отпущенному состоянию кнопки.
Когда-то в VB-6 я вставлял в коде в события MouseUp и MouseDown элемента управления Image команды загрузки соответствующих изображений. Получалась довольно наглядная анимация процесса нажатия кнопки. В VB.Net на эту тему есть что-либо более продвинутое?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.08.2016, 21:03
Ответы с готовыми решениями:

Как отловить нажатие кнопки в приложении?
Подскажите, как отловить нажатие кнопки в ВБ.нет?

Как реализовать выполнение работы на нажатие кнопки Enter
Приветствую всех, подскажите как реализовать выполнение работы на нажатие кнопки Enter я ввожу...

Как отследить нажатие на системные кнопки в заголовке окна?
Как отследить нажатие на системные кнопки в заголовке окна?

Как сымитировать нажатие кнопки при запуске программы
Как сделать чтобы после запуска программы кнопка была нажата. Выбираю Focus() не работает....

12
Модератор
Эксперт .NET
4205 / 3288 / 498
Регистрация: 27.01.2014
Сообщений: 6,041
30.08.2016, 07:13 2
Лучший ответ Сообщение было отмечено jkrnd как решение

Решение

jkrnd, в vb.net все тоже самое, но добавилось MouseEnter и MouseLeave.

Из более продвинутого наверное только - СКИНЫ, которые перерисовывают стандартный контрол кнопки... Но это уже не средства NET... А стороннее решение
2
178 / 68 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
30.08.2016, 07:40  [ТС] 3
Yury Komar, а какой элемент управления лучше для этого использовать. Image в VB.Net я не нашёл. Неужели для подобной задачи следует использовать PictureBox? Я попробовал грузить картинки в кнопку - грузится только одна.
VB.NET
1
Button1.Image = imgList.Images(0)
0
Модератор
Эксперт .NET
4205 / 3288 / 498
Регистрация: 27.01.2014
Сообщений: 6,041
30.08.2016, 08:44 4
Лучший ответ Сообщение было отмечено Yury Komar как решение

Решение

jkrnd, могу предложить таку штуку, писал для одного из своих проектов:
модуль
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Module ButtonStyles
 
'Использование:  SetButtonStyles(Me, My.Resources.LINKV1A, My.Resources.LINKV1B, My.Resources.LINKV1C, ImageLayout.Zoom)
'Эта штука в Runtime изменияет все кнопки формы в трех положениях на необходимые картинки (скины)
 
 
    Private _Original As Image = Nothing
    Private _Enter As Image = Nothing
    Private _Down As Image = Nothing
 
    Public Sub SetButtonStyles(ByVal Form As Form, ByVal ImageORIGINAL As Image, ByVal ImageENTER As Image, ByVal ImageDOWM As Image, ByVal ImageLayout As ImageLayout)
        _Original = ImageORIGINAL
        _Enter = ImageENTER
        _Down = ImageDOWM
        If _Original IsNot Nothing Then
            For Each ctrl As Button In Form.Controls.OfType(Of Button)()
                AddHandler ctrl.MouseEnter, AddressOf MEnter
                AddHandler ctrl.MouseDown, AddressOf MDown
                AddHandler ctrl.MouseUp, AddressOf MUp
                AddHandler ctrl.MouseLeave, AddressOf MLeave
                ctrl.BackColor = Color.Transparent
                ctrl.FlatStyle = FlatStyle.Flat
                ctrl.FlatAppearance.BorderSize = 0
                ctrl.FlatAppearance.MouseDownBackColor = Color.Transparent
                ctrl.FlatAppearance.MouseOverBackColor = Color.Transparent
                ctrl.BackgroundImageLayout = ImageLayout
                ctrl.BackgroundImage = _Original
            Next
        End If
    End Sub
 
    Private Sub MEnter(ByVal sender As Object, ByVal e As System.EventArgs)
        sender.BackgroundImage = _Enter
    End Sub
    Private Sub MDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        If e.Button = MouseButtons.Left Then
            sender.BackgroundImage = _Down
        End If
    End Sub
    Private Sub MUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        sender.BackgroundImage = _Enter
    End Sub
    Private Sub MLeave(ByVal sender As Object, ByVal e As System.EventArgs)
        sender.BackgroundImage = _Original
    End Sub
End Module


в ресурсы проекта добавить три изображения кнопки, на каждое из состояний (без фокуса\при наведении\нажатая) и указать их при вызове метода SetButtonStyles
6
Модератор
Эксперт .NET
4205 / 3288 / 498
Регистрация: 27.01.2014
Сообщений: 6,041
30.08.2016, 08:52 5
демонстрация коды, предложеного выше
Изображения
 
3
Модератор
Эксперт .NET
4205 / 3288 / 498
Регистрация: 27.01.2014
Сообщений: 6,041
30.08.2016, 08:57 6
Цитата Сообщение от jkrnd Посмотреть сообщение
Неужели для подобной задачи следует использовать PictureBox?
нет, используйте все тот же Button, только картинку для нее грузите в BackgroundImage... таким образом все свойства кнопки у вас остаются и можно ими пользоваться как и раньше.... Думаю мой коды(выше) вам в этом очень поможет.
1
178 / 68 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
30.08.2016, 12:32  [ТС] 7
Цитата Сообщение от Yury Komar Посмотреть сообщение
Module ButtonStyles
а нельзя поделиться картинками, как на демонстрационном примере или файлом ресурсов?
0
Модератор
Эксперт .NET
4205 / 3288 / 498
Регистрация: 27.01.2014
Сообщений: 6,041
30.08.2016, 18:06 8
Лучший ответ Сообщение было отмечено jkrnd как решение

Решение

jkrnd, скину вам ссылку. а вообще, если у вас установлена программа MS FrontPage, вот в ресурсах у нее этих картинок ВАЛОМ.

...
Кстати, есть и еще один вариант, но с самими изображениями придется чуток повозиться.
Суть в том, что файл скина кнопки будет всего один и содержать картинки всех трех состояний кнопки вряд, принцып тот же самый, только при наведении метод будет извлекать часть изображения для нужного состояния кнопки и грузить ее как фон... Удобен тем, что всего один файл( как скин кнопки) содержит... Плюс, "чёрнобеливание" картинки, когда кгопка в покое, в некоторых ПО такой вариант отображения тоже неплохо смотрится.
Сегодня уже не смогу скинуть, завтра вечером.
1
Модератор
Эксперт .NET
4205 / 3288 / 498
Регистрация: 27.01.2014
Сообщений: 6,041
31.08.2016, 17:20 9
jkrnd, как и обещал...

вот для такого изображения Название: 1.png
Просмотров: 89

Размер: 643 байт
скин кнопки в одном файле
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
Public Class Form1
 
#Region "    Скин кнопки 1"
    Private Sub Button1_MouseLeave(sender As Object, e As System.EventArgs) Handles Button1.MouseLeave, MyBase.Load
        Button1.BackgroundImage = GetButtonSkin(Image.FromFile("1.png"), 1, True)
    End Sub
    Private Sub Button1_MouseEnter(sender As Object, e As System.EventArgs) Handles Button1.MouseEnter, Button1.MouseUp
        sender.backgroundimage = GetButtonSkin(Image.FromFile("1.png"), 1)
    End Sub
    Private Sub Button1_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseDown
        sender.backgroundimage = GetButtonSkin(Image.FromFile("1.png"), 3)
    End Sub
#End Region
 
    Public Function GetButtonSkin(SourceImage As Image, Optional Return_Skin As Integer = Nothing, Optional ToGray As Boolean = False) As Image
        Dim NewButtonImage As New Bitmap(CInt(SourceImage.Width / 3), SourceImage.Height)
        Dim myGraphics As Graphics = Graphics.FromImage(NewButtonImage)
        Dim ButtonSize As New Rectangle(0, 0, SourceImage.Width / 3, SourceImage.Height)
        Dim getState As Rectangle
 
        If Return_Skin = 1 Then ' Normal State
            getState = New Rectangle(0, 0, SourceImage.Width / 3, SourceImage.Height)
        ElseIf Return_Skin = 2 Then ' Hover State
            getState = New Rectangle(SourceImage.Width / 3, 0, SourceImage.Width / 3, SourceImage.Height)
        ElseIf Return_Skin = 3 Then ' Dowm State
            getState = New Rectangle(SourceImage.Width / 3 * 2, 0, SourceImage.Width / 3, SourceImage.Height)
        Else ' If not Indicated - return Normal State
            getState = New Rectangle(0, 0, SourceImage.Width / 3, SourceImage.Height)
        End If
 
        myGraphics.DrawImage(SourceImage, ButtonSize, getState, GraphicsUnit.Pixel)
 
        Dim PixelColor As Color : Dim PaintToGray As Byte
        If ToGray Then
            For x As Integer = 0 To NewButtonImage.Width - 1
                For y As Integer = 0 To NewButtonImage.Height - 1
                    PixelColor = NewButtonImage.GetPixel(x, y)
                    'Если пиксель непрозрачный, то перекрашиваем его в серый цвет
                    If PixelColor <> Color.FromArgb(0) Then
                        PaintToGray = 0.3 * PixelColor.R + 0.59 * PixelColor.G + 0.11 * PixelColor.B
                        PixelColor = Color.FromArgb(PaintToGray, PaintToGray, PaintToGray)
                        NewButtonImage.SetPixel(x, y, PixelColor)
                    End If
                Next
            Next
        End If
 
        Return NewButtonImage
    End Function
End Class
Вложения
Тип файла: zip КНОПКИ.zip (6.55 Мб, 24 просмотров)
4
178 / 68 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
31.08.2016, 18:11  [ТС] 10
Цитата Сообщение от Yury Komar Посмотреть сообщение
"1.png"
нельзя ли скинуть сам файл "1.png"
Цитата Сообщение от Yury Komar Посмотреть сообщение
вот для такого изображения
0
Модератор
Эксперт .NET
4205 / 3288 / 498
Регистрация: 27.01.2014
Сообщений: 6,041
31.08.2016, 18:19 11
jkrnd, суть в том, что картинка в ширину делится на равные три части, и каждая из них отвечает за свое состояние кнопки...
Вложения
Тип файла: zip 1.zip (775 байт, 19 просмотров)
2
4407 / 3531 / 843
Регистрация: 02.02.2013
Сообщений: 3,417
Записей в блоге: 2
31.08.2016, 21:43 12
Аналогичный прием использовался в Delphi кнопках.
Изображения
 
2
Модератор
Эксперт .NET
4205 / 3288 / 498
Регистрация: 27.01.2014
Сообщений: 6,041
01.09.2016, 07:05 13
ovva, во. именно он. только у меня три состояния.
1
01.09.2016, 07:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.09.2016, 07:05
Помогаю со студенческими работами здесь

Как запустить готовую функцию (нажатие кнопки) из другой функции?
Доброго времени. Осваиваю VBnet, dопрос глупый, но ответ найти не могу. Есть программа/форма. По...

Как при нажатие кнопки поменять текст в Label1 другой формы
Всем привет! Как можно менять текст Label при нажатие на кнопку ? Form1 Есть Label и кнопка с...

Как остледить нажатие кнопки "Отмена" в InputBox'е
Dim IB As String = InputBox(&quot;Для входа в программу введите свое имя и пароль через пробел.&quot;, &quot;Вход...

Нажатие кнопки в WebBrowser
Как сделать что бы в Webbrowser1 в котором есть одна форма и кнопка как заполнить форме я нашёл а...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru