moimael | Bonjour, Je me suis récemment mis au développement sous windows mobile (j'ai déjà de l'expérience en développement vb .net sur pc), et je me retrouve un peu embêté par la gestion de la mémoire windows mobile :s
Voila mon code :
Code :
- Imports System
- Imports System.Drawing
- Imports System.Windows.Forms
- Imports System.Threading
- Imports System.Xml
- Namespace DodgerCodeSnippets
- ''' <summary>
- ''' Description résumée de FormMain.
- ''' </summary>
- Public Class FormMain
- Inherits System.Windows.Forms.Form
- Private lst As New List(Of String)
- Private offScreenBitmap As Bitmap
- Private offScreenGraphics As Graphics
- ' Représenta la zone dans laquelle on dessine les items
- Private onScreenGraphics As Graphics
- ' Représenta la zone réellement affichée
- Private m_bSelectionDone As Boolean = False
- Private m_iScreenWidth As Integer = 480
- ' Taille de l'écran
- Private m_iScreenHeight As Integer = 588
- Private m_iItemsCount As Integer = Nothing
- ' Nombre d'Item dans la liste
- Private m_iItemheight As Integer = 80
- ' auteur d'un item
- Private m_iStripWidth As Integer = 480
- Private m_iStripHeight As Integer = 588
- ' Hauteur totale de la liste
- Private m_iStripPosY As Integer = 1
- Private m_iOldStripPosY As Integer = -10
- Private m_iMoveStep As Integer = 1
- ' Déplacement en nombre de pixels à chaque boucle
- Private m_iSens As Integer = 0
- ' 0,+1,-1
- Private m_iTouchStartY As Integer = 0
- ' Position en pixel de l'endroit où l'on a posé le doigt
- Private m_iTouchEndY As Integer = 0
- ' Position en pixel de l'endroit où l'on a relevé le doigt
- Private m_iSelectedIndexItem As Integer = -1
- ' Numéro de l'Item sélectionné
- Private m_iPixelPerScroll As Integer = 0
- ' De combien de pixel doit on scrollé après un mouvement de doigt sur l'écran
- Private m_iSleep As Integer = 3
- ' nombre de milliseconde d'attente dans la boucle
- Public Shared OddCellBackGroundColor As System.Drawing.Color = System.Drawing.Color.Transparent
- Public Shared EvenCellBackGroundColor As System.Drawing.Color = System.Drawing.Color.Transparent
- Public Shared SelectedCellBackGroundColor As System.Drawing.Color = System.Drawing.Color.Transparent
- Public Shared CellBorderColor As System.Drawing.Color = System.Drawing.Color.LightGray
- Public Sub New()
- parsexml()
- m_iItemsCount = lst.Count
- InitScreens()
- DoLoop()
- End Sub
- Private Sub InitScreens()
- Me.Visible = True
- Me.WindowState = FormWindowState.Normal
- m_iStripHeight = m_iItemsCount * m_iItemheight
- ' Creation d'un ecran virtuel plus grand que l'écran du PDA qui contient toute la liste
- offScreenBitmap = New Bitmap(m_iStripWidth, m_iStripHeight)
- offScreenGraphics = Graphics.FromImage(offScreenBitmap)
- offScreenGraphics.Clear(Color.Black)
- onScreenGraphics = Me.CreateGraphics()
- End Sub
- Private Sub DoLoop()
- ' C'est ici que l'on dessine les Items
- For iItem As Integer = 0 To m_iItemsCount - 1
- DrawItem(iItem)
- Next iItem
- onScreenGraphics.Clear(Color.Black)
- onScreenGraphics.DrawImage(offScreenBitmap, 0, 0, New Rectangle(0, 0, 480, 588), GraphicsUnit.Pixel)
- Application.DoEvents()
- Render()
- onScreenGraphics.Dispose()
- Application.DoEvents()
- MessageBox.Show("Vous avez sélectionné l'item : " + m_iSelectedIndexItem, "Info" )
- Application.[Exit]()
- End Sub
- ''' <summary>
- ''' Nettoyage des ressources utilisées.
- ''' </summary>
- Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
- MyBase.Dispose(disposing)
- End Sub
- ''' <summary>
- ''' Point d'entrée principal de l'application.
- ''' </summary>
- Public Shared Sub Main()
- Application.Run(New FormMain())
- End Sub
- ''' <summary>
- ''' Boucle principale de rendu de la liste
- ''' </summary>
- Protected Overridable Sub Render()
- ' distance parcourrue en pixel depuis le dernier mouvement de doigt
- Dim iPixelScrollCount As Integer = 0
- While Not m_bSelectionDone
- Try
- ' On bloque le scroll quand on arrive en bas
- If (m_iSens = 1) AndAlso (m_iStripPosY + m_iScreenHeight >= m_iStripHeight) Then
- m_iSens = 0
- iPixelScrollCount = 0
- End If
- ' On bloque le scroll quand on arrive en haut
- If (m_iSens = -1) AndAlso (m_iStripPosY <= 0) Then
- m_iSens = 0
- iPixelScrollCount = 0
- End If
- If m_iSens <> 0 Then
- iPixelScrollCount += 1
- m_iStripPosY += m_iMoveStep * m_iSens
- End If
- ' Si on a scrollé du nombre de pixel que l'on souhaitait
- ' On s'arrete
- If iPixelScrollCount > m_iPixelPerScroll Then
- m_iSens = 0
- iPixelScrollCount = 0
- End If
- ' Si on a pas bougé, inutile de re-dessiner
- If m_iOldStripPosY <> m_iStripPosY Then
- onScreenGraphics.DrawImage(offScreenBitmap, 0, 0, New Rectangle(0, m_iStripPosY, 480, 588), GraphicsUnit.Pixel)
- m_iOldStripPosY = m_iStripPosY
- End If
- Application.DoEvents()
- ' On laisse le temps au PDA de souffler
- ' On ralentit quelque peu le scrolling
- Thread.Sleep(m_iSleep)
- Catch exp As Exception
- MessageBox.Show("Oups il y a un problème dans Render :" + exp.ToString())
- End Try
- End While
- End Sub
- ''' <summary>
- ''' Dessine un Item ( élément ) de la liste à la position indiquée
- ''' </summary>
- ''' <param name="iIndex"></param>
- Private Sub DrawItem(ByVal iIndex As Integer)
- Dim font As Font
- Dim text As String
- Dim blackBrush As Brush = New SolidBrush(Color.Black)
- Dim brushOdd As Brush = New SolidBrush(OddCellBackGroundColor)
- Dim brushEven As Brush = New SolidBrush(EvenCellBackGroundColor)
- Dim brush As Brush = Nothing
- font = New Font(FontFamily.GenericSansSerif, 5, FontStyle.Bold)
- Dim pen As New Pen(CellBorderColor)
- ' On intervertit les couleurs pour donner un coté sympa
- If (iIndex Mod 2) = 0 Then
- brush = brushOdd
- Else
- brush = brushEven
- End If
- offScreenGraphics.FillRectangle(brush, 0, iIndex * m_iItemheight, m_iScreenWidth - 1, m_iItemheight)
- offScreenGraphics.DrawRectangle(pen, 0, iIndex * m_iItemheight, m_iScreenWidth, m_iItemheight)
- ' C'est ici que vous insérez le texte que vous souhaitez
- text = lst.Item(iIndex)
- offScreenGraphics.DrawString(text, font, blackBrush, 10, (iIndex * m_iItemheight) + 10)
- End Sub
- ''' <summary>
- ''' Dessine un Item sélectionné à la position indiquée
- ''' </summary>
- ''' <param name="iIndex"></param>
- Private Sub DrawSelectedItem(ByVal iIndex As Integer)
- Dim text As String
- Dim font As Font
- Dim pen As New Pen(CellBorderColor)
- Dim blackBrush As Brush = New SolidBrush(Color.Black)
- font = New Font(FontFamily.GenericSansSerif, 5, FontStyle.Bold)
- ' On dessine le rectangle plein
- offScreenGraphics.FillRectangle(New SolidBrush(SelectedCellBackGroundColor), 0, iIndex * m_iItemheight, m_iScreenWidth - 1, m_iItemheight)
- ' avec un petit contour gris
- offScreenGraphics.DrawRectangle(pen, 0, iIndex * m_iItemheight, m_iScreenWidth, m_iItemheight)
- text = lst.Item(iIndex)
- ' On affiche le texte
- offScreenGraphics.DrawString(text, font, blackBrush, 10, (iIndex * m_iItemheight) + 10)
- m_iOldStripPosY = -1
- ' Force à redessiner ( voir méthode Render() )
- End Sub
- ' Gestion du scroll au doigt et à l'oeuil ... heu non au stylet !
- Private Sub FormMain_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseUp
- m_iTouchEndY = e.Y
- If m_iSens = 0 Then
- If m_iTouchStartY - m_iTouchEndY > 0 Then
- m_iSens = 1
- Else
- m_iSens = -1
- End If
- Dim iDelta As Integer = Math.Abs(m_iTouchStartY - m_iTouchEndY)
- ' Plus le doigt a glissé sur une grande distance,
- ' plus on scroll loin
- If iDelta > 160 Then
- m_iPixelPerScroll = 588
- m_iSleep = 0
- ElseIf (iDelta > 100) AndAlso (iDelta < 160) Then
- m_iPixelPerScroll = 294
- m_iSleep = 2
- ElseIf (iDelta < 100) AndAlso (iDelta > 20) Then
- m_iPixelPerScroll = 147
- m_iSleep = 4
- Else
- ' On commence par effacer le précédent item sélectionné si il existe
- Dim iPreviousSelectionIndex As Integer = m_iSelectedIndexItem
- If m_iSelectedIndexItem > -1 Then
- DrawItem(iPreviousSelectionIndex)
- End If
- m_iSens = 0
- m_iSelectedIndexItem = (m_iStripPosY + m_iTouchEndY) / m_iItemheight
- DrawSelectedItem(m_iSelectedIndexItem)
- If iPreviousSelectionIndex = m_iSelectedIndexItem Then
- m_bSelectionDone = True
- End If
- End If
- m_iTouchStartY = 0
- m_iTouchEndY = 0
- Else
- ' si on touche l'écran pendant le scroll, ça l'arrete
- m_iSens = 0
- End If
- End Sub
- Private Sub FormMain_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown
- m_iTouchStartY = e.Y
- End Sub
- Private Sub InitializeComponent()
- Me.SuspendLayout()
- '
- 'FormMain
- '
- Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit
- Me.ClientSize = New System.Drawing.Size(480, 588)
- Me.Location = New System.Drawing.Point(0, 52)
- Me.Name = "FormMain"
- Me.Text = "iListBox"
- Me.ResumeLayout(False)
- End Sub
- Public Function parsexml() As String
- Dim m_xmlr As XmlTextReader
- 'Create the XML Reader
- m_xmlr = New XmlTextReader("http://yp.shoutcast.com/sbin/newxml.phtml" )
- 'Disable whitespace so that you don't have to read over whitespaces
- m_xmlr.WhitespaceHandling = WhitespaceHandling.None
- 'read the xml declaration and advance to family tag
- m_xmlr.Read()
- 'read the family tag
- m_xmlr.Read()
- 'Load the Loop
- While Not m_xmlr.EOF
- 'Go to the name tag
- m_xmlr.Read()
- 'if not start element exit while loop
- If Not m_xmlr.IsStartElement() Then
- Exit While
- End If
- 'Get the Gender Attribute Value
- Dim nameAttribute As String = m_xmlr.GetAttribute("name" )
- 'Read elements firstname and lastname
- m_xmlr.Read()
- lst.Add(nameAttribute)
- End While
- 'close the reader
- m_xmlr.Close()
- End Function
- End Class
- End Namespace
|
Ici la taille de l'item dans ma listbox est de 80px, le nombre d'item était, au moment du test, de 386, sois un écran virtuel de 30880 * 480 pixels (voir ligne en rouge dans le code). Ça semble être un peu lourd à gérer pour wm6 qui, si j'ai bien compris, ne supporte que des process de 32mo.
Ma listbox s'affiche parfaitement si je prends 10 comme taille d'item, le problème est que c'est beaucoup trop petit pour être utilisé au doigt, les items étant plus petit que ceux de la listbox d'origine
Comment réduire cette consommation de mémoire ou partager en plusieurs processus ce bout de code ?
Merci d'avance |