Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [VB2010 WinForms] aggiungere evento KeyPress a PictureBox

    buon giorno a tutti,

    qualcuno mi sa spiegare come aggiungere l'evento KeyPress al controllo PictureBox.. mi serve perchè ho un elenco di picturebox contenute nel FlowLayoutPanell, quando una di queste diventa focused (tramite codice) devo poter utilizzare i tasti direzzione per spostarmi da un'immagine all'altra...per questo mi serve l'evento KeyPress o KeyDown o KeyUp (vanno bene tutti)... hon provato a gestirli dal form ma non comunica nulla..

    nella guida di Microsoft dice che l'evento KeyPress è supportato per la picturebox
    http://msdn.microsoft.com/en-us/library/z89a4506.aspx
    ma non c'è di default, non esiste!! ho trovato solo l'evento PreviewKeyDown ma non risponde, non viene mai eseguito nonostante la picturebox abbia il focus!!

    Grazie
    Michele

  2. #2
    Il problema è che il controllo PictureBox non riceve il focus (se non da codice con il metodo PictureBox1.Focus). Di conseguenza, gli eventi relativi alla gestione tastiera e focus, implementati nella classe base Control, sono stati quasi tutti nascosti in quanto considerati non necessari per l'utilizzo del controllo.
    Le strade per risolvere il problema sono due:
    1. imposti la proprietà del form KeyPreview = True e rilevi i pulsanti premuti attraverso gli eventi KeyDown, KeyPress e KeyUp del form stesso
    2. utilizzi un tuo UserControl al posto della PictureBox
    Chi non cerca trova.

  3. #3
    Scusate l'intrusione..
    Sono interessato alla seconda proposta di michelecali. Cioè quella di utilizzare un proprio user Control.
    Vorrei infatti progettarne alcuni ma non so da dove partire. Mi potresti aiutare in tal senso?
    Grazie.

  4. #4
    Originariamente inviato da tas
    Il problema è che il controllo PictureBox non riceve il focus (se non da codice con il metodo PictureBox1.Focus). Di conseguenza, gli eventi relativi alla gestione tastiera e focus, implementati nella classe base Control, sono stati quasi tutti nascosti in quanto considerati non necessari per l'utilizzo del controllo.
    Le strade per risolvere il problema sono due:
    1. imposti la proprietà del form KeyPreview = True e rilevi i pulsanti premuti attraverso gli eventi KeyDown, KeyPress e KeyUp del form stesso
    2. utilizzi un tuo UserControl al posto della PictureBox
    My good adesso funziona l'evento "PreviewKeyDown" delle PictureBox .. sarà che aveva bisogno di una ricompialata del progetto per farlo andare sta di fatto che adesso và bene quello

    ps Tas: per il punto 1 avevevo provato ma stranamente non funzionava , ora si anche questo!

    il focus lo effettuo tramite codice e tramite l'evento MouseDown della pictureBox

    questa è solo parte del codice che viene eseguita dopo l'evento MouseDown ,si nota il fucus in fondo
    codice:
    ......codice
    
            Dim Contenitore As FlowLayoutPanel=sender.parent,
                  Picture as PictureBox=sender
            Contenitore.SuspendLayout()
    
    ' applica lo stile di selezionato alla pictureBox cliccata
            For Each PicBox As PictureBox In Contenitore.Controls
                With PicBox
                    If PicBox Is Picture Then
                        P = PicBox
                        .BorderStyle = BorderStyle.Fixed3D
                        .Size = .MaximumSize
                        Trovato = True
                    ElseIf Not Multiselect Or Picture Is Nothing Then
    
    ' non è stata selezionata quindi riporta allo style default
                        .BorderStyle = IIf(Multiselect And Not New TipoStrings(PicBox.Image.Tag).IsFile, BorderStyle.FixedSingle, BorderStyle.None)
                        .Size = .MinimumSize
                    End If
                End With
            Next
            Contenitore.ResumeLayout(True)
    
    ' se è stata trovata allora scrolla il contenitore alla picturebox e rende attivo il focus della pictureBox
            If P IsNot Nothing Then
                Contenitore.ScrollControlIntoView(P)
                P.Focus()
            End If
    
    .....codice
    adesso sono apposto ... comunque grazie Tas per la pronta risposta
    Michele

  5. #5
    OK questo l'evento che gestisce i tasti delle picturebox contenute nel contenitore di FlowLayoutPanel (con tutti i controlli possibili annessi) funziona a meraviglia è spettacolare l'effetto grafico che ne viene fuori :

    codice:
        Private Sub PictureBox_PreviewKeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs) Handles ImagesFlowLayoutPanel.PreviewKeyDown, MyBase.PreviewKeyDown
            If e.KeyValue = Keys.Escape Then Me.DialogResult = DialogResult.Cancel : Exit Sub
    
            Dim Contenitore As FlowLayoutPanel = sender.parent,
                PictureBoxFocused As PictureBox = GetFocusedControls(Contenitore)
            If PictureBoxFocused Is Nothing Then Exit Sub
    
            Select Case e.KeyValue
    
                Case Keys.Right, Keys.Left ' tasti destra e sinistra
    
                    With Contenitore ' FlowLayoutPanel
                        Dim Index As Integer = .Controls.IndexOf(PictureBoxFocused),
                            Direction As Integer = IIf(e.KeyValue = Keys.Left, -1, 1)
                        Index += Direction
    
                        If Index < .Controls.Count And Index >= 0 Then Seleziona(Contenitore, .Controls(Index))
    
                    End With
    
                Case Keys.Up, Keys.Down ' tasti Up e Down
    
                    With Contenitore ' FlowLayoutPanel
                        .SuspendLayout()
                        Dim Direction As Integer = IIf(e.KeyValue = Keys.Up, -1, 1)
                        .AutoScrollPosition = Point.Subtract(New Point(0, (PictureBoxFocused.Height / 2) * Direction), .AutoScrollPosition)
                        Dim AdiacentPicture As PictureBox = .GetChildAtPoint(New Point(PictureBoxFocused.Left + 10, IIf(Direction < 0, PictureBoxFocused.Top, PictureBoxFocused.Bottom) + 10 * Direction))
    
                        If AdiacentPicture IsNot Nothing Then Seleziona(Contenitore, AdiacentPicture)
                        .ResumeLayout(True)
                    End With
    
                Case Keys.Return ' Tasto Invio
                    If Not Multiselect Then PictureBoxDoubleClick(PictureBoxFocused, Nothing) Else Beep()
    
                Case Keys.Cancel, Keys.Back ' tasti Canc e BackSpace
                    RimuoviLink_LinkClicked(RimuoviLink, Nothing)
    
            End Select
     
        End Sub
    unico Neo, non so del perchè il tasto Canc (in rosso) non fa scattare questo evento, di fatti ho dovuto intercettare il Tasto BackSpace per l'eliminazione dell'immagine...sarebbe stato perfetto

    [COLOR=red]
    Michele

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.