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 SubVoilà, je ne pense pas pouvoir être plus complet.
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
Partager