+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 5 su 5

[VB.NET 2008] Scroll Button

  1. #1
    L'avatar di Gandalfrank
    Gandalfrank non è in linea Scribacchino
    Recentemente, per un applicazione che sto sviluppando, ho avuto bisogno di riunire in un unico pulsante più funzionalità, ma non ho trovato alcun controllo, nell' IDE di VB.Net, che potesse fare al caso mio. Ho pensato quindi di realizzare un piccolo controllo utente che mi permettesse di risolvere questo problema.
    Per fare ciò ho creato un pulsante di 32x32 pixel, sul quale potere caricare più immagini/icone che rappresentano le varie funzioni da implementare, e attraverso l'uso della rotellina del mouse, fare ruotare verso l'alto o il basso tutte le immagini, permettendo all'utente di scegliere quelle che desidera usare. Ovviamente un semplice click del mouse attiva la corretta funzionalità legata all'icona rappresentata.
    Considerato che esistono ancora dei mouse privi della MouseWheel, ho fatto in modo che l'utente possa fare scorrere le immagini con il normale uso del puntatore se questo si trova nella zona destra del pulsante stesso e viene premuto il tasto sinistro.

    Di seguito allego i file del codice sorgente e dell'eseguibile.
    File allegati File allegati
    ℹ️ Leggi di più su Gandalfrank ...

  2. #2
    L'avatar di Gandalfrank
    Gandalfrank non è in linea Scribacchino
    Nel controllo utente ho inserito un Button, un Timer e un ToolTip, assegnando loro queste caratteristiche:

    Controllo utente:
    Size: 32;32
    Margin:0;0;0;0
    MaximumSize:32;32
    MinumSize:32;32

    Button:
    Name:btnIcona
    Size: 32x32
    Text:

    Timer:
    Name: Timer1
    Enabled:True
    Interval:10

    ToolTip:
    Name Tooltip1

    Nelle risorse del progetto ho inserito due icone 16x16 pixel che rappresentano una freccia rivolta verso l'alto e una freccia rivolta verso il basso da utilizzare come puntatore quando il mouse si trova sopra la zona destra dello ScrollButton.
    I loro nomi sono CursoreSu.cur e CursoreGiu.cur

    Codice:
    Public Class ScrollButton32x32
        'Definizione dell'indice dell'immagine Nuova, quella che appare dopo avere premuto i tasti SU/GIU' o usato la rotellina
        Private intImmagineNuova As Integer = 0
    
        'Definizione delle due immagini: quella Vecchia che scompare e quella Nuova che appare
        Private immagineVecchia, immagineNuova As Bitmap
    
        'Definizione delle coordinate Y delle due immagini
        Private yVecchia, yNuova As Integer
    
        'Impostazione dei flag per determinare se viene fatta scorrere la lista verso l'alto o verso il basso
        Private scorreSu, scorreGiu As Boolean
    
        'Impostazione del testo da visualizzare come descrizione
        Private testo As String = Nothing
    
        'Impostazione del flag per determinare se sono state caricate (TRUE) o meno (FALSE) delle immagini nel pulsante
        Private chkListaInserita As Boolean = False
    
        'Lista che contiene l'elenco delle immagini
        Private _listaImmagini As New ImageList
    
        'Lista che contiene l'elenco delle descrizioni
        Private _descrizione As New List(Of String)
    
        'Percorso che individua il pulsante SU
        Private pathBtnUp As New Drawing2D.GraphicsPath
    
        'Matrice di punti che definiscono il pulsante SU
        Private ptUp(0 To 3) As Point
    
        'Percorso che individua il pulsante GIU
        Private pathBtnDown As New Drawing2D.GraphicsPath
    
        'Matrice di punti che definiscono il pulsante GIU
        Private ptDown(0 To 3) As Point
    
        'Definizione dei tipi di cursore
        Private cursoreSu, cursoreGiu As Cursor
    
        'Definizione dell'evento relativo al click del mouse sullo ScrollButton
        Public Event Icona_MouseClick(ByVal nIcona As Integer)
    
        Public Sub New()
    
            InitializeComponent()
            _listaImmagini.ImageSize = New Size(24, 24)
            yVecchia = -34
            yNuova = 4
    
        End Sub
    
        Private Sub ScrollButton_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    
            ptUp(0) = New Point(22, 0)
            ptUp(1) = New Point(32, 0)
            ptUp(2) = New Point(32, 16)
            ptUp(3) = New Point(22, 16)
    
            ptDown(0) = New Point(22, 17)
            ptDown(1) = New Point(32, 17)
            ptDown(2) = New Point(32, 32)
            ptDown(3) = New Point(22, 32)
    
            pathBtnUp.StartFigure()
            pathBtnUp.AddPolygon(ptUp)
            pathBtnUp.CloseFigure()
    
            pathBtnDown.StartFigure()
            pathBtnDown.AddPolygon(ptDown)
            pathBtnDown.CloseFigure()
    
            Dim ms1 As New System.IO.MemoryStream(My.Resources.CursoreGIU)
            cursoreGiu = New Cursor(ms1)
            ms1.Close()
    
            Dim ms2 As New System.IO.MemoryStream(My.Resources.CursoreSU)
            cursoreSu = New Cursor(ms2)
            ms2.Close()
    
        End Sub
    
        ''' <summary>
        ''' Metodo per inserire le immagini da caricare e il relativo testo
        ''' </summary>
        ''' <param name="img">immagine da caricare</param>
        ''' <param name="descr">descrizione allegata</param>
        ''' <remarks></remarks>
        Public Sub InserisciImmagini(ByVal img As Bitmap, ByVal descr As String)
    
            _listaImmagini.Images.Add(img)
            _descrizione.Add(descr)
            immagineNuova = _listaImmagini.Images.Item(0)
            immagineVecchia = immagineNuova
            chkListaInserita = True
    
        End Sub
    
        ''' <summary>
        ''' Metodo per inserire un'icona da caricare e il relativo testo
        ''' </summary>
        ''' <param name="icona">icona da caricare</param>
        ''' <param name="descr">descrizione allegata</param>
        ''' <remarks></remarks>
        Public Sub InserisciImmagini(ByVal icona As Icon, ByVal descr As String)
    
            _listaImmagini.Images.Add(icona)
            _descrizione.Add(descr)
            immagineNuova = _listaImmagini.Images.Item(0)
            immagineVecchia = immagineNuova
            chkListaInserita = True
    
        End Sub
    
        ''' <summary>
        ''' Metodo per inserire le immagini da caricare da file e il relativo testo
        ''' </summary>
        ''' <param name="img">immagine da caricare</param>
        ''' <param name="descr">descrizione allegata</param>
        ''' <remarks></remarks>
        Public Sub InserisciImmagini(ByVal img As String, ByVal descr As String)
    
            _listaImmagini.Images.Add(Image.FromFile(img))
            _descrizione.Add(descr)
            immagineNuova = _listaImmagini.Images.Item(0)
            immagineVecchia = immagineNuova
            chkListaInserita = True
    
        End Sub
    
        'Esposizione e consumo dell'evento Icona_MouseClick
        Private Sub btnIcona_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles btnIcona.MouseClick
    
            If _listaImmagini.Images.Empty = True Then Exit Sub
    
            Dim indice As Integer = intImmagineNuova Mod _listaImmagini.Images.Count
    
            Select Case btnIcona.Cursor
    
                Case Cursors.Arrow
                    If indice < 0 Then
    
                        indice = _listaImmagini.Images.Count + indice
    
                    End If
    
                    RaiseEvent Icona_MouseClick(indice)
    
                Case cursoreSu
                    immagineVecchia = immagineNuova
                    intImmagineNuova += 1
                    Visualizza()
                    yVecchia = 4
                    yNuova = 34
                    ToolTip1.SetToolTip(Me.btnIcona, testo)
                    scorreSu = True
    
                Case cursoreGiu
                    immagineVecchia = immagineNuova
                    intImmagineNuova -= 1
                    Visualizza()
                    yVecchia = 4
                    yNuova = -26
                    ToolTip1.SetToolTip(Me.btnIcona, testo)
                    scorreGiu = True
    
            End Select
    
    
        End Sub
    
        'Evento per ottenere il focus sul pulsante quando il mouse vi staziona sopra
        Private Sub btnIcona_MouseHover(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnIcona.MouseHover
    
            Me.btnIcona.Focus()
    
            If pathBtnUp.IsVisible(btnIcona.PointToClient(MousePosition)) Then
                btnIcona.Cursor = cursoreSu
            ElseIf pathBtnDown.IsVisible(btnIcona.PointToClient(MousePosition)) Then
                btnIcona.Cursor = cursoreGiu
            Else
                btnIcona.Cursor = Cursors.Default
            End If
    
            ToolTip1.SetToolTip(Me.btnIcona, testo)
    
        End Sub
    
        Private Sub btnIcona_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnIcona.MouseLeave
    
            btnIcona.Cursor = Cursors.Default
    
        End Sub
    
        Private Sub btnIcona_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles btnIcona.MouseMove
    
            If pathBtnUp.IsVisible(btnIcona.PointToClient(MousePosition)) Then
                btnIcona.Cursor = cursoreSu
            ElseIf pathBtnDown.IsVisible(btnIcona.PointToClient(MousePosition)) Then
                btnIcona.Cursor = cursoreGiu
            Else
                btnIcona.Cursor = Cursors.Default
            End If
    
        End Sub
    
        'Sub per realizzare l'animazione della rotazione delle immagini con l'uso della rotellina
        Private Sub btnIcona_MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles btnIcona.MouseWheel
    
            Dim chk As Integer = intImmagineNuova
            immagineVecchia = immagineNuova
            intImmagineNuova += CInt(e.Delta / 120)
            Visualizza()
    
            If (intImmagineNuova - chk) > 0 Then
    
                yVecchia = 4
                yNuova = 34
                scorreSu = True
    
            Else
    
                yVecchia = 4
                yNuova = -26
                scorreGiu = True
    
            End If
    
            ToolTip1.SetToolTip(Me.btnIcona, testo)
    
        End Sub
    
        'Sub per realizzare il movimento di scorrimento verso l'alto o il basso al trascorrere del tempo
        Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    
            If scorreSu Then
    
                yVecchia -= 2
                yNuova -= 2
                If yVecchia <= -25 AndAlso yNuova = 4 Then scorreSu = False
    
            End If
    
            If scorreGiu Then
    
                yVecchia += 2
                yNuova += 2
                If yVecchia >= 34 AndAlso yNuova = 4 Then scorreGiu = False
    
            End If
    
            Me.btnIcona.Invalidate()
    
            If scorreGiu = False AndAlso scorreSu = False Then Visualizza()
    
        End Sub
    
        'Sub per visualizzare le immagini e il testo caricate all'interno del pulsante
        Private Sub Visualizza()
    
            If chkListaInserita Then
    
                Dim numeroImmagini As Integer = _listaImmagini.Images.Count
                Dim valore As Integer = intImmagineNuova Mod numeroImmagini
    
                For i As Integer = 0 To numeroImmagini - 1
    
                    If i = valore OrElse (i - numeroImmagini) = valore Then
    
                        immagineNuova = _listaImmagini.Images.Item(i)
                        testo = _descrizione.Item(i)
                        Exit For
                    End If
    
                Next
    
            End If
    
        End Sub
    
        'Sub per disegnare le immagini sul pulsante
        Private Sub btnIcona_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles btnIcona.Paint
    
            If chkListaInserita Then
    
                e.Graphics.DrawImage(immagineVecchia, 4, yVecchia, 24, 24)
                e.Graphics.DrawImage(immagineNuova, 4, yNuova, 24, 24)
    
            End If
    
        End Sub
    End Class
    
    ℹ️ Leggi di più su Gandalfrank ...

  3. #3
    L'avatar di Gandalfrank
    Gandalfrank non è in linea Scribacchino
    Se qualcuno volesse vedere un esempio di come funziona il controllo:

    Video di esempio
    ℹ️ Leggi di più su Gandalfrank ...

  4. #4
    andre91 non è in linea Novello
    fantastico! è veramente un' idea semplice e funzionale!

  5. #5
    L'avatar di Gandalfrank
    Gandalfrank non è in linea Scribacchino

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Risposte: 1
    Ultimo Post: 14-03-2018, 18:09
  2. Risposte: 2
    Ultimo Post: 28-04-2014, 11:43
  3. [MsSQL]SQL 2008 R2 e ripristino file *.bak in SQL 2008
    Da Sambu nel forum Microsoft SQL Server
    Risposte: 7
    Ultimo Post: 12-05-2011, 17:00
  4. Button non visibile in Visual Basic 2008
    Da Ange nel forum Visual Basic .Net
    Risposte: 2
    Ultimo Post: 21-03-2010, 10:52
  5. VB.net 2008 [visual studio 2008] DataGridView Database
    Da ThUnD3r_Bl4d3 nel forum Visual Basic .Net
    Risposte: 17
    Ultimo Post: 02-07-2009, 00:50