Как изменить изображение в пользовательской форме при нажатии - PullRequest
0 голосов
/ 01 марта 2020

Я пытаюсь изменить изображение в пользовательской форме на «активный формат», когда на него нажимают, а затем, когда на другое изображение нажимают, изображение, на которое ранее щелкнули, возвращается в «неактивный формат», и новое изображение, которое имеет нажал теперь "активный формат". Это показывает пользователю, в каком меню он находится в данный момент.

Я пытался использовать следующий код, чтобы сделать это, но я не могу заставить изображения вернуться в «неактивный формат», когда другой картинка нажата. Код также очень длинный, поэтому, если есть предложения о том, как уменьшить длину, было бы полезно, поскольку у меня есть 8 меню в пользовательской форме.

    '----------------------------------------------------------Menu 0 Button
Private Sub Home_Bttn_Click()

 Home.MultiPage1.Value = 0

 If Home.MultiPage1.Value = 0 Then

    Home_Bttn.SpecialEffect = fmSpecialEffectRaised

    '----------------------------------------------------------Changing button to active and setting others to Dormant
    'Activated
    Home_Bttn.Picture = LoadPicture(ThisWorkbook.Path & "\UI\General Buttons\Activated\Home_Bttn_Activated.jpg")
    'Dormant
    Create_Protocol_Bttn.Picture = LoadPicture(ThisWorkbook.Path & "\UI\General Buttons\Dormant\Create_Summary_Report_Bttn_Dormant.jpg")
    Create_Summary_Report_Bttn.Picture = LoadPicture(ThisWorkbook.Path & "\UI\General Buttons\Dormant\Create_Summary_Report_Bttn_Dormant.jpg")
    Review_Summary_Report_Bttn.Picture = LoadPicture(ThisWorkbook.Path & "\UI\General Buttons\Dormant\Review_Summary_Report_Bttn_Dormant.jpg")
    Add_Report_Template_Bttn.Picture = LoadPicture(ThisWorkbook.Path & "\UI\General Buttons\Dormant\Add_Report_Template_Bttn_Dormant.jpg")
    Add_Calbration_Certificates_Bttn.Picture = LoadPicture(ThisWorkbook.Path & "\UI\General Buttons\Dormant\Add_Calbration_Certificates_Bttn_Dormant.jpg")
    Add_to_Database_Bttn.Picture = LoadPicture(ThisWorkbook.Path & "\UI\General Buttons\Dormant\Add_to_Database_Bttn_Dormant.jpg")
    User_Agreement_Bttn.Picture = LoadPicture(ThisWorkbook.Path & "\UI\General Buttons\Dormant\User_Agreement_Bttn_Dormant.jpg")
    Email_Bttn.Picture = LoadPicture(ThisWorkbook.Path & "\UI\General Buttons\Dormant\Email_Bttn_Dormant.jpg")
    Mobile_Bttn.Picture = LoadPicture(ThisWorkbook.Path & "\UI\General Buttons\Dormant\Mobile_Bttn_Dormant.jpg")
    'Title
    Menu_Title.Caption = "Home"    
 End If    
End Sub

'----------------------------------------------------------Menu 1 Button
Private Sub Create_Protocol_Bttn_Click()

 Home.MultiPage1.Value = 1

 If Home.MultiPage1.Value = 1 Then

     Create_Protocol_Bttn.SpecialEffect = fmSpecialEffectRaised

     '----------------------------------------------------------Changing button to active and setting others to Dormant
     'Activated
     Create_Protocol_Bttn.Picture = LoadPicture(ThisWorkbook.Path & "\UI\General Buttons\Activated\Create_Protocol_Bttn_Activated.jpg")
     'Dormant
     Home_Bttn.Picture = LoadPicture(ThisWorkbook.Path & "\UI\General Buttons\Dormant\Home_Bttn_Dormant.jpg")
     Create_Summary_Report_Bttn.Picture = LoadPicture(ThisWorkbook.Path & "\UI\General Buttons\Dormant\Create_Summary_Report_Bttn_Dormant.jpg")
     Review_Summary_Report_Bttn.Picture = LoadPicture(ThisWorkbook.Path & "\UI\General Buttons\Dormant\Review_Summary_Report_Bttn_Dormant.jpg")
     Add_Report_Template_Bttn.Picture = LoadPicture(ThisWorkbook.Path & "\UI\General Buttons\Dormant\Add_Report_Template_Bttn_Dormant.jpg")
     Add_Calbration_Certificates_Bttn.Picture = LoadPicture(ThisWorkbook.Path & "\UI\General Buttons\Dormant\Add_Calbration_Certificates_Bttn_Dormant.jpg")
     Add_to_Database_Bttn.Picture = LoadPicture(ThisWorkbook.Path & "\UI\General Buttons\Dormant\Add_to_Database_Bttn_Dormant.jpg")
     User_Agreement_Bttn.Picture = LoadPicture(ThisWorkbook.Path & "\UI\General Buttons\Dormant\User_Agreement_Bttn_Dormant.jpg")
     Email_Bttn.Picture = LoadPicture(ThisWorkbook.Path & "\UI\General Buttons\Dormant\Email_Bttn_Dormant.jpg")
     Mobile_Bttn.Picture = LoadPicture(ThisWorkbook.Path & "\UI\General Buttons\Dormant\Mobile_Bttn_Dormant.jpg")
     'Title
     Menu_Title.Caption = "Create Protocol"    
 End If    
End Sub

Измененный код:

Option Explicit

Private buttArrN As Variant, pictArr As Variant, dormArr As Variant

Private Sub Userform_Initialize()
'User form start up focus on multipage 1 and then focus on username field
Me.MultiPage1.Value = 0
Me.Login_Error_Message.Visible = False
Me.Username_fld.SetFocus

buttArrN = Array(Me.Home_Bttn.Name, Me.Mobile_Bttn.Name, Me.Email_Bttn.Name)
'Me.Create_Protocol_Bttn.Name, Me.Create_Summary_Report_Bttn.Name, Me.Review_Summary_Report_Bttn.Name, Me.Add_Report_Template_Bttn.Name, Me.Add_Calbration_Certificates_Bttn.Name, Me.Add_to_Database_Bttn.Name, Me.User_Agreement_Bttn.Name)

pictArr = Array(ThisWorkbook.Path & "\UI\General Buttons\Dormant\Home_Bttn_Dormant.jpg", _
        ThisWorkbook.Path & "\UI\General Buttons\Dormant\Mobile_Bttn_Dormant.jpg", _
        ThisWorkbook.Path & "\UI\General Buttons\Dormant\Email_Bttn_Dormant.jpg")

'        ThisWorkbook.Path & "\UI\General Buttons\Dormant\Create_Protocol_Bttn_Dormant.jpg", _
'        ThisWorkbook.Path & "\UI\General Buttons\Dormant\Create_Summary_Report_Bttn_Dormant.jpg", _
'        ThisWorkbook.Path & "\UI\General Buttons\Dormant\Review_Summary_Report_Bttn_Dormant.jpg", _
'        ThisWorkbook.Path & "\UI\General Buttons\Dormant\Add_Report_Template_Bttn_Dormant.jpg", _
'        ThisWorkbook.Path & "\UI\General Buttons\Dormant\Add_Calbration_Certificates_Bttn_Dormant.jpg", _
'        ThisWorkbook.Path & "\UI\General Buttons\Dormant\Add_to_Database_Bttn_Dormant.jpg", _
'        ThisWorkbook.Path & "\UI\General Buttons\Dormant\User_Agreement_Bttn_Dormant.jpg")


dormArr = Array("F:\Automation\Report Creation Wizard\UI\General Buttons\Activated\Home_Bttn_Activated.jpg", _
        ThisWorkbook.Path & "\UI\General Buttons\Activated\Mobile_Bttn_Activated.jpg", _
        ThisWorkbook.Path & "\UI\General Buttons\Activated\Email_Bttn_Activated.jpg")
'        ThisWorkbook.Path & "\UI\General Buttons\Activated\Create_Protocol_Bttn_Activated.jpg", _
'        ThisWorkbook.Path & "\UI\General Buttons\Activated\Create_Summary_Report_Bttn_Activated.jpg", _
'        ThisWorkbook.Path & "\UI\General Buttons\Activated\Review_Summary_Report_Bttn_Activated.jpg", _
'        ThisWorkbook.Path & "\UI\General Buttons\Activated\Add_Report_Template_Bttn_Activated.jpg", _
'        ThisWorkbook.Path & "\UI\General Buttons\Activated\Add_Calbration_Certificates_Bttn_Activated.jpg", _
'        ThisWorkbook.Path & "\UI\General Buttons\Activated\Add_to_Database_Bttn_Activated.jpg", _
'        ThisWorkbook.Path & "\UI\General Buttons\Activated\User_Agreement_Bttn_Activated.jpg")

End Sub

Private Sub Login_Bttn_Click()
'Execute login in module code
CheckUser

End Sub

Private Sub Home_Bttn_Click()
   testChangePicture Me.Home_Bttn
   Menu_Title.Caption = "User Login"
End Sub

Private Sub Mobile_Bttn_Click()
    testChangePicture Me.Mobile_Bttn
    Menu_Title.Caption = "Mobile Contact Menu"
End Sub

Private Sub Email_Bttn_Click()
    testChangePicture Me.Email_Bttn
    Menu_Title.Caption = "Email Contact Menu"
End Sub

'Private Sub Create_Protocol_Bttn_Click()
'    testChangePicture Me.Create_Protocol_Bttn
'    Menu_Title.Caption = "Create a Protocol"
'End Sub
'
'Private Sub Create_Summary_Report_Bttn_Click()
'    testChangePicture Me.Create_Summary_Report_Bttn
'    Menu_Title.Caption = "Create a Summary Report"
'End Sub
'
'Private Sub Review_Summary_Report_Bttn_Click()
'    testChangePicture Me.Review_Summary_Report_Bttn
'    Menu_Title.Caption = "Review Summary Report"
'End Sub
'
'Private Sub Add_Report_Template_Bttn_Click()
'    testChangePicture Me.Add_Report_Template_Bttn
'    Menu_Title.Caption = "Add a Report Template"
'End Sub
'
'Private Sub Add_Calbration_Certificates_Bttn_Click()
'    testChangePicture Me.Add_Calbration_Certificates_Bttn
'    Menu_Title.Caption = "Add Calibration Certificates"
'End Sub
'
'Private Sub Add_to_Database_Bttn_Click()
'    testChangePicture Me.Add_to_Database_Bttn
'    Menu_Title.Caption = "Add to Wizard Database"
'End Sub
'
'Private Sub User_Agreement_Bttn_Click()
'    testChangePicture Me.User_Agreement_Bttn
'    Menu_Title.Caption = "User Agreement"
'End Sub

Private Sub testChangePicture(but As Control)
 Dim c As Variant, pos As Long, i As Long

 pos = Application.Match(but.Name, buttArrN, False)
 Me.Controls(buttArrN(pos - 1)).Picture = LoadPicture(pictArr(pos))
 For Each c In buttArrN
    If c <> buttArrN(pos - 1) Then
       Me.Controls(c).Picture = LoadPicture(dormArr(i))
    End If
    i = i + 1
 Next
End Sub

Ответы [ 3 ]

2 голосов
/ 01 марта 2020

Попробуйте следующий код, пожалуйста:

Я подготовил его только для трех кнопок, но я думаю, что код можно легко расширить на все элементы управления, существующие в вашем проекте.

Во-первых, создайте следующие переменные уровня модуля (поверх него, в части объявлений):

Option Explicit

Private buttArrN As Variant, pictArr As Variant, dormArr As Variant

Затем поместите этот код в событие Form_Initialize. Вы должны расширить массивы в соответствии с вашим номером кнопки:

  buttArrN = Array(Me.Home_Bttn.Name, Me.Create_Protocol_Bttn.Name, Me.Add_Report_Template_Bttn.Name)

  pictArr = Array(ThisWorkbook.path & "\UI\General Buttons\Activated\Home_Bttn_Activated.jpg", _
        ThisWorkbook.path & "\UI\General Buttons\Activated\Create_Protocol_Bttn_Activated.jpg", _
        ThisWorkbook.path & "\UI\General Buttons\Activated\Add_Report_Template_Bttn_Activated.jpg")

  dormArr = Array(ThisWorkbook.path & "\UI\General Buttons\Dormant\Home_Bttn_Dormant.jpg", _
        ThisWorkbook.path & "\UI\General Buttons\Dormant\Create_Summary_Report_Bttn_Dormant.jpg", _
            ThisWorkbook.path & "\UI\General Buttons\Dormant\Add_Report_Template_Bttn_Dormant.jpg")

Каждая из ваших кнопок, чтобы изменить свое изображение * Событие 1012 * будет вызывать одну подпрограмму, как показано ниже:

Private Sub Home_Bttn_Click()
   testChangePicture Me.Home_Bttn
   Me.Repaint
End Sub

Private Sub Create_Protocol_Bttn_Click()
    testChangePicture Me.Create_Protocol_Bttn
    Me.Repaint
End Sub

Private Sub Add_Report_Template_Bttn_Click()
    testChangePicture Me.Add_Report_Template_Bttn
    Me.Repaint
End Sub

И вызываемая подпрограмма будет выглядеть так:

Private Sub testChangePicture(but As Control)
 Dim c As Variant, pos As Long, i As Long

 pos = Application.Match(but.Name, buttArrN, False)
 If pos = 0 Then MsgBox but.Name & " button is missing from ""buttArrN"" array!": Exit Sub

 If Not FileExists(pictArr(pos - 1)) Then _
        MsgBox "The path to the active picture """ & pictArr(pos - 1) & """ is wrong!": Exit Sub

 Me.Controls(buttArrN(pos - 1)).Picture = LoadPicture(pictArr(pos - 1))

 For Each c In buttArrN
    If c <> buttArrN(pos - 1) Then
       If Not FileExists(dormArr(i)) Then _
            MsgBox "The path to the dormant picture """ & dormArr(i) & """ is wrong!": Exit Sub
            Me.Controls(c).Picture = LoadPicture(dormArr(i))
    End If
    i = i + 1
 Next
End Sub

Private Function FileExists(ByVal fName As String) As Boolean
    On Error Resume Next
      FileExists = ((GetAttr(fName) And vbDirectory) <> vbDirectory)
    On Error GoTo 0: Err.Clear
End Function

Мне было лень строить пути для реальных изображений, поэтому код не тестировался в реальной среде. Я только что проверил тот факт, что testChangePicture sub может идентифицировать кнопку вызова.

Отредактировано: я добавил новую функцию (FileExists), которая проверяет правильность пути к изображениям. Если нет, он останавливает код и отправляет сообщение elocvent. Я также добавил новую строку Me.Repaint во всех событиях нажатия кнопок. В моем случае код работает без него, а в вашем - нет. Проще было перерисовать форму, затем найти причину ...

Важно понять, как работает код, и позаботиться о том, чтобы правильно заполнить три массива. Они должны быть заполнены в том же порядке для каждого задействованного элемента управления !

1 голос
/ 01 марта 2020

Я бы порекомендовал немного другой подход

Плюсы :

  1. Вам не нужно зависеть от жестко закодированного пути для изображений
  2. Вы можете распространять свою рабочую книгу, не беспокоясь об изображениях
  3. Ваш код drasssssssssticaly уменьшается!

В действии

enter image description here

Logi c

Поместите соответствующее количество элементов управления изображениями в пользовательскую форму и установите для их свойства visible значение False , Загрузите все изображения с пути ...\UI\General Buttons\... и сохраните их в этих элементах управления изображениями.

Теперь все, что вам нужно сделать, - это использовать один вкладыш для загрузки соответствующего изображения. Нет необходимости LoadPicture больше. Например,

Image1.Picture = Image3.Picture

В приведенном выше примере я создал пользовательскую форму и поместил 3 элемента управления изображениями и кнопку переключения, как показано ниже

enter image description here

И код, который я использовал,

Option Explicit

Private Sub UserForm_Initialize()
    Image1.Picture = Image2.Picture
End Sub

Private Sub ToggleButton1_Click()
    If ToggleButton1.Value = True Then
        Image1.Picture = Image3.Picture
    Else
        Image1.Picture = Image2.Picture
    End If
End Sub
1 голос
/ 01 марта 2020

Так как у меня не было ваших изображений, я только что сделал пример с кучей разных.

В моем примере на форме 3 кнопки (Btn1, Btn2, Btn3) и используются 6 изображений (* 1004) *)

Код в UserForm_Initialize Предварительная загрузка изображений и активация Btn1

Кнопки активируются путем передачи имени кнопки ActivateButton

Private MenuControl As Object

Private Sub Btn1_Click()
ActivateButton "Btn1"
End Sub

Private Sub Btn2_Click()
ActivateButton Me.ActiveControl.Name
End Sub

Private Sub Btn3_Click()
ActivateButton "Btn3"
End Sub

Private Sub UserForm_Initialize()

If MenuControl Is Nothing Then Set MenuControl = CreateObject("Scripting.Dictionary")

' MenuControl.Add <Button>.Name, Array(<Button>, <Button State 1>, <Button State 2>, <Button Group>)
MenuControl.Add Btn1.Name, Array(UserForm1.Btn1, LoadPicture(ThisWorkbook.Path & "\red_on.bmp"), LoadPicture(ThisWorkbook.Path & "\red_off.bmp"), "Main")
MenuControl.Add Btn2.Name, Array(UserForm1.Btn2, LoadPicture(ThisWorkbook.Path & "\blue_on.bmp"), LoadPicture(ThisWorkbook.Path & "\blue_off.bmp"), "Main")
MenuControl.Add Btn3.Name, Array(UserForm1.Btn3, LoadPicture(ThisWorkbook.Path & "\green_on.bmp"), LoadPicture(ThisWorkbook.Path & "\green_off.bmp"), "Main")

ActivateButton TargetName:="Btn1"

End Sub


Private Sub ActivateButton(TargetName As String)
Dim Key As Variant
Dim Group As String: Group = MenuControl.Item(TargetName)(3)

For Each Key In MenuControl.Keys
    If MenuControl.Item(Key)(3) = Group Then
        If Key = TargetName Then
            MenuControl.Item(Key)(0).Picture = MenuControl.Item(Key)(1)
        Else
            MenuControl.Item(Key)(0).Picture = MenuControl.Item(Key)(2)
        End If
    End If
Next Key

End Sub

Приведенный выше код аналогичен приведенному ниже примеру, но имеет возможность создавать группы кнопок.

Пример рабочей книги

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...