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:
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.
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)
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:
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.
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
- 'Passt die Steuerelemente der Bildschirmauflösung an
- Public Sub ResizeControls(ByVal Fenster As System.Windows.Forms.Form, ByVal DefaultX As Integer, ByVal DefaultY As Integer)
- 'Zuerst prüfen ob das Fenster nicht schon "resized" wurde:
- Dim SchonResized As Boolean = False
- For i As Integer = 1 To 100
- If FensterTag(i) = Fenster.Tag Then
- SchonResized = True
- Exit For
- End If
- Next i
- If SchonResized = True Then Exit Sub
- Dim ScaleX As Double
- Dim ScaleY As Double
- Dim ContrLeft As Double
- Dim ContrTop As Double
- Dim ContrWidth As Double
- Dim ContrHeight As Double
- ScaleX = Fenster.Width / DefaultX
- ScaleY = Fenster.Height / DefaultY
- 'Die global definierten Hilfsvariablen "Global_Width" und "Global_Height" enthalten die tatsächliche Bildschirmauflösung
- If Global_Width <> 0 Then ScaleX = Global_Width / DefaultX
- If Global_Height <> 0 Then ScaleY = Global_Height / DefaultY
- 'Hier wird jedes Control und jedes Child-Control durchlaufen
- For Each oControl As Control In Fenster.Controls
- If oControl.Tag <> "-" Then
- ContrLeft = oControl.Left
- ContrTop = oControl.Top
- ContrWidth = oControl.Width
- ContrHeight = oControl.Height
- oControl.Left = CInt(ContrLeft * ScaleX)
- oControl.Top = CInt(ContrTop * ScaleY)
- oControl.Width = CInt(ContrWidth * ScaleX)
- oControl.Height = CInt(ContrHeight * ScaleY)
- 'Eventuell kann man bei diversen Controls andere Einstellungen treffen wie z.B. Schriftgrößen verändern oder anderes
- If TypeOf oControl Is TextBox Then
- ElseIf TypeOf oControl Is Button Then
- ElseIf TypeOf oControl Is PictureBox Then
- ElseIf TypeOf oControl Is Label Then
- ElseIf TypeOf oControl Is Panel Then
- 'hier alle Controls im Panel ebenfalls durchlaufen
- For Each pControl As Control In oControl.Controls
- If pControl.Tag <> "-" Then
- ContrLeft = pControl.Left
- ContrTop = pControl.Top
- ContrWidth = pControl.Width
- ContrHeight = pControl.Height
- pControl.Left = CInt(ContrLeft * ScaleX)
- pControl.Top = CInt(ContrTop * ScaleY)
- pControl.Width = CInt(ContrWidth * ScaleX)
- pControl.Height = CInt(ContrHeight * ScaleY)
- End If
- Next
- End If
- End If
- Next
- '"Fensterhandle" (eigentlich Form.Tag) in die Liste der bereits modifizierten Fenster eintragen
- For i As Integer = 1 To 100
- If FensterTag(i) = "" Then
- FensterTag(i) = Fenster.Tag
- Exit For
- End If
- Next i
- End Sub
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
Roland Berghöfer
Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at