Pocket PC Anwendung auf Geräten mit unterschiedlicher Auflösung - zeitsparende Methode

    • VB.NET
    • .NET (FX) 1.0–2.0

      Pocket PC Anwendung auf Geräten mit unterschiedlicher Auflösung - zeitsparende Methode

      Ich stand vor der Aufgabe eine PDA-Anwendung für ein Compact 7 Device zu schreiben. Bei Bedarf sollte es aber auch auf meinen älteren CE5.0 Geräten lauffähig sein. Also wurde .NET CF 2.0 als Plattform gewählt. Primär wurde die Software auf das neue Gerät mit 480x800 Pixel Auflösung programmiert. Es soll aber auch auf einem Gerät mit 240x320 und einem mit 240x400 (272x480) laufen.

      Ich wollte nun wirklich nicht die komplette Oberfläche X-Mal für jede Auflösung gestalten und habe mir da etwas einfallen lassen.
      Es lag nahe alle Controls einer Form durchzulaufen und entsprechend zu skalieren.
      Somit erstellte ich die Forms in der Auflösung von 240x400 und skalliere entsprechend hoch oder runter. Unten bei den Bildern seht Ihr auch schon zwei echte Screenshots auf das Device "Photogeshopt".


      Im Form_Load wird bei jeder Form folgende Funktion aufgerufen:

      VB.NET-Quellcode

      1. Public FensterBreite As Integer = 240
      2. Public FensterHoehe As Integer = 400
      3. ResizeControls(Me, FensterBreite, FensterHoehe)


      Jeder Form wird in der TAG-Eigenschaft ein eindeutiger Wert eingetragen. Im Anhang ein Screenshot einer Form in der Entwicklungsumgebung (wegen der einzelnen Parameter).

      Damit jede Form nur ein einziges Mal in der Größe geändert wird, wird ein globales Hilfsvariablen-Array angelegt wo der Inhalt der TAG-Eigenschaft eingetragen wird, sobald eine Form "geändert" wurde. So ist es ausgeschlossen, dass eine Form mehrmals größengeändert wird.

      VB.NET-Quellcode

      1. Public FensterTag(100) As String



      Da ich sehr viel mit Panels arbeite, wird in der "Resize" Funktion auch jedes Control auf einem Panel durchgearbeitet. Ich musste übrigens feststellen, dass es schneller ist Panels ein- oder auszublenden als Forms zu öffnen oder zu schließen. Meine wichtigste Form sieht also in der Entwicklungsumgebung sehr sehr breit aus. Auf den ersten Blick ist es ein hoffnungsloses Durcheinander, aber die Performance auch auf den älteren Geräten gibt mir recht, dass ich diese etwas unkonventionelle Methode gewählt habe (siehe Screenshot)


      VB.NET-Quellcode

      1. 'Passt die Steuerelemente der Bildschirmauflösung an
      2. Public Sub ResizeControls(ByVal Fenster As System.Windows.Forms.Form, ByVal DefaultX As Integer, ByVal DefaultY As Integer)
      3. 'Zuerst prüfen ob das Fenster nicht schon "resized" wurde:
      4. Dim SchonResized As Boolean = False
      5. For i As Integer = 1 To 100
      6. If FensterTag(i) = Fenster.Tag Then
      7. SchonResized = True
      8. Exit For
      9. End If
      10. Next i
      11. If SchonResized = True Then Exit Sub
      12. Dim ScaleX As Double
      13. Dim ScaleY As Double
      14. Dim ContrLeft As Double
      15. Dim ContrTop As Double
      16. Dim ContrWidth As Double
      17. Dim ContrHeight As Double
      18. ScaleX = Fenster.Width / DefaultX
      19. ScaleY = Fenster.Height / DefaultY
      20. 'Die global definierten Hilfsvariablen "Global_Width" und "Global_Height" enthalten die tatsächliche Bildschirmauflösung
      21. If Global_Width <> 0 Then ScaleX = Global_Width / DefaultX
      22. If Global_Height <> 0 Then ScaleY = Global_Height / DefaultY
      23. 'Hier wird jedes Control und jedes Child-Control durchlaufen
      24. For Each oControl As Control In Fenster.Controls
      25. If oControl.Tag <> "-" Then
      26. ContrLeft = oControl.Left
      27. ContrTop = oControl.Top
      28. ContrWidth = oControl.Width
      29. ContrHeight = oControl.Height
      30. oControl.Left = CInt(ContrLeft * ScaleX)
      31. oControl.Top = CInt(ContrTop * ScaleY)
      32. oControl.Width = CInt(ContrWidth * ScaleX)
      33. oControl.Height = CInt(ContrHeight * ScaleY)
      34. 'Eventuell kann man bei diversen Controls andere Einstellungen treffen wie z.B. Schriftgrößen verändern oder anderes
      35. If TypeOf oControl Is TextBox Then
      36. ElseIf TypeOf oControl Is Button Then
      37. ElseIf TypeOf oControl Is PictureBox Then
      38. ElseIf TypeOf oControl Is Label Then
      39. ElseIf TypeOf oControl Is Panel Then
      40. 'hier alle Controls im Panel ebenfalls durchlaufen
      41. For Each pControl As Control In oControl.Controls
      42. If pControl.Tag <> "-" Then
      43. ContrLeft = pControl.Left
      44. ContrTop = pControl.Top
      45. ContrWidth = pControl.Width
      46. ContrHeight = pControl.Height
      47. pControl.Left = CInt(ContrLeft * ScaleX)
      48. pControl.Top = CInt(ContrTop * ScaleY)
      49. pControl.Width = CInt(ContrWidth * ScaleX)
      50. pControl.Height = CInt(ContrHeight * ScaleY)
      51. End If
      52. Next
      53. End If
      54. End If
      55. Next
      56. '"Fensterhandle" (eigentlich Form.Tag) in die Liste der bereits modifizierten Fenster eintragen
      57. For i As Integer = 1 To 100
      58. If FensterTag(i) = "" Then
      59. FensterTag(i) = Fenster.Tag
      60. Exit For
      61. End If
      62. Next i
      63. End Sub
      Bilder
      • Form_Eigenschaften.jpg

        172,15 kB, 522×743, 120 mal angesehen
      • DT4000_Imagebild.gif

        88,19 kB, 580×385, 120 mal angesehen
      • Form_mit_Panels.jpg

        315,95 kB, 1.823×493, 118 mal angesehen
      Liebe Grüße
      Roland Berghöfer

      Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at