IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

PictureBox : Largeur trop grande pendant le load d'une winform.


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut PictureBox : Largeur trop grande pendant le load d'une winform.
    Hello,

    J'essaie de comprendre ce qu'il se passe exactement lors de "l'ouverture" d'une winform.

    Voici le contexte de mon problème.

    Dans une winform, j'affiche dans un DataGridView une liste d'étage. Lorsqu'un étage est sélectionné, j'affiche le plan dans un PictureBox. Sur ce plan, j'affiche des zones (boutons) qui sont créés par l'utilisateur pendant le runtime et sauvegardés (enfin juste la position, le nom et le texte) dans une DB.

    Tout se passe bien sauf lors du load où la largeur de la PictureBox est plus grande pour une raison que j'ignore ce qui fait que les zones sont décalées vers la droite.

    En pièce jointe se trouvent 2 screenshots :

    • load.png montre la position des boutons lors de l'affichage de la winform
    • selection.png montre la position des boutons lors de la sélection via le DGV après l'affichage (il faut bien sûr changer d'étage pour pouvoir revenir le premier).

    Le code est bien sûr le même dans les deux cas. Je cherche donc ce qui cause le fait que la picture box ait une taille plus grand lors du chargement.


    Voici le code de l'appel de la winform, du load, du RowEnter du DGV et la procédure de création et positionnement des boutons :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Private Sub llblArea_LinkClicked(sender As System.Object, e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles llblArea.LinkClicked
            Dim frm As frmArea = frmArea.Instance
            frm.MdiParent = Me.MdiParent
            frm.Text = store.DTO.Code & " - " & areas
            frm.Dock = DockStyle.Fill
            frm.Show()
            frm.Focus()
        End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
        Private Sub frmArea_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            InitControls()
            LoadData()
        End Sub
     
     
        Private Sub InitControls()
            InitDGV()
            Me.tsbCancel.Text = tools.cancel
            Me.tsbDel.Text = tools.del
            Me.tsbEdit.Text = tools.edit
            Me.tsbNew.Text = tools._new
            Me.tsbSave.Text = tools.save
            'Me.chMap.Text = tools.maps
            Me.ltbName.LblText = tools.name
            Me.lblTip.Text = tools.areaTip
            EnableControls(tsbCancel)
        End Sub
     
     
        Private Sub InitDGV()
            Dim index As Integer
            index = dgvMap.Columns.Add("dgvcName", tools.maps)
            dgvMap.Columns(index).DataPropertyName = "Name"
            index = dgvMap.Columns.Add("dgvcId", "Id")
            dgvMap.Columns(index).DataPropertyName = "Id"
            dgvMap.Columns(index).Visible = False
        End Sub
     
        Private Sub LoadData()
            maps = ANTI_MALI_BLL.Floors.FetchFloorsByStore(frmStart.store.DTO.Id)
            dgvMap.DataSource = maps.DTO
        End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
        Private Sub dgvMap_RowEnter(sender As System.Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvMap.RowEnter
            pbMap.Controls.Clear()
            map = maps.GetFloorById(CByte(dgvMap.Rows(e.RowIndex).Cells("dgvcId").Value))
            pbMap.BackgroundImage = Image.FromFile(map.DTO.Map)
            pbMap.BackgroundImageLayout = ImageLayout.Zoom
            If map.DTO.Active Then
                pbMap.BackColor = Color.LightGreen
            Else
                pbMap.BackColor = Color.Red
            End If
            areas = ANTI_MALI_BLL.Areas.FetchAreasByFloor(map.DTO.Id)
            For Each area As ANTI_MALI_DTO.Area In areas.DTO
                CreateButton(area, True)
            Next
        End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
        Private Sub CreateButton(area As ANTI_MALI_DTO.Area, enableDragMove As Boolean)
            Dim btn As New Button
            btn.Text = area.Name
            btn.Name = area.Name
            btn.Parent = pbMap
            Dim diffx, diffy As Integer
            Dim imgsize As Size = GetImageSize(pbMap)
            diffx = pbMap.ClientSize.Width - imgsize.Width
            diffy = pbMap.ClientSize.Height - imgsize.Height
            btn.Left = CInt(Math.Floor(imgsize.Width * area.X)) + diffx \ 2
            btn.Top = CInt(Math.Floor(imgsize.Height * area.Y)) + diffy \ 2
            btn.BackColor = Color.FromKnownColor(KnownColor.Control)
            btn.Width = CreateGraphics.MeasureString(area.Name, New Font("verdana", 14, FontStyle.Regular, GraphicsUnit.Pixel)).ToSize.Width + 7
            btn.Padding = New Padding(0)
            btn.BringToFront()
            btn.EnableDragMove(enableDragMove)
        End Sub
     
     
        Public Function GetImageSize(pb As PictureBox) As Size
            Dim imgAspectRatio As Double = pbMap.BackgroundImage.Height / pbMap.BackgroundImage.Width
            Dim pbAspectRatio As Double = pb.ClientSize.Height / pb.ClientSize.Width
            If imgAspectRatio > pbAspectRatio Then 'image shape is taller than pb
                Return New Size(CInt(pb.ClientSize.Height / imgAspectRatio), pb.ClientSize.Height)
            Else 'image shape is wider than pb
                Return New Size(pb.ClientSize.Width, CInt(pb.ClientSize.Width * imgAspectRatio))
            End If
        End Function
    Voilà, je ne pense pas pouvoir être plus complet.
    Images attachées Images attachées   

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Taille d'archive trop grande
    Par mick84m dans le forum Shell et commandes GNU
    Réponses: 14
    Dernier message: 12/05/2005, 16h39
  2. tableau trop grand ?
    Par Praxe dans le forum C++
    Réponses: 17
    Dernier message: 17/03/2005, 14h14
  3. modélisation d'une base : table trop grande
    Par Shabata dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 22/11/2004, 11h44
  4. Surface trop grande
    Par Black_Daimond dans le forum DirectX
    Réponses: 1
    Dernier message: 18/01/2003, 03h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo