2008-11-18 4 views
5

Ich entwickle eine .NET CF-basierte Grafik-Anwendung, mein Projekt beinhaltet viele Zeichnungsbilder, Wir haben uns entschieden, die Anwendung auf unterschiedliche Handy-Auflösung zu portieren X 240, 480 X 640) usw.Umgang mit verschiedenen Auflösungen in Visual Studio 2008 für .NET CF

Wie würde ich dies in einer einzelnen Lösung/Projekt erreichen?

Gibt es eine Notwendigkeit, verschiedene Projekte basierend auf Auflösungen zu erstellen? Wie würde ich mit gemeinsamen Dateien umgehen? und ich brauche die Änderungen in einer der allgemeinen Klassen über alle Geräte auftreten.

Danke, Cronos

Antwort

6

Hören Sie nicht auf diesen Idioten MusiGenesis. Eine bessere Möglichkeit, unterschiedliche Bildschirmauflösungen für Windows Mobile-Geräte zu handhaben, ist die Verwendung der Formularvererbung, die mit minimalem Aufwand auf eine vorhandene CF-Anwendung angeheftet werden kann.

Grundsätzlich entwerfen Sie jedes Formular für einen Standardbildschirm 240 x 320. Wenn Sie ein Formular für eine neue Auflösung neu ordnen müssen (sich 240x240 sagen), können Sie ein neues Formular zu Ihrem Projekt hinzufügen und haben Sie es von Ihrer ursprünglichen 240x320 Form erbt:

public partial class frmDialog240x240: frmDialog 

statt nur Form:

public partial class frmDialog240x240: Form 

wie üblich. Auf Ihrem ursprünglichen Formular müssen Sie die Modifiers-Eigenschaft jedes Steuerelements auf Protected (statt der Standard Privat) festlegen. Im Designer für Ihr neues Formular sehen Sie alle Steuerelemente des Formulars, von dem Sie übernommen haben, und Sie können sie verschieben und deren Größe ändern, um den neuen Bildschirmdimensionen gerecht zu werden (dies wirkt sich nicht auf das ursprüngliche Formular aus) Layout).

Wenn Ihr Programm läuft, ist es einfach, die Bildschirmauflösung des Geräts, auf dem es läuft, zu überprüfen und das entsprechende Formular zu erstellen (eine Factory-Methode ist dafür geeignet). Ihr neues Formular erbt alles vom alten Formular, verwendet jedoch Ihr neues benutzerdefiniertes Layout.

Dieser Ansatz ermöglicht es Ihnen, Code-Duplizierung zu vermeiden, weil es keine gibt.

+0

Ich versuchte den Vererbungsansatz und kam nicht sehr weit, hauptsächlich wegen Problemen mit dem Designer. Ich griff zum Andocken und bekam ordentliche Ergebnisse. – cdonner

+0

@cdonner: haben Sie die Modifiers-Eigenschaft jedes Steuerelements im übergeordneten Formular auf Geschützt (statt Privat) festgelegt? Das ist der Schlüssel, damit der Designer richtig funktioniert. – MusiGenesis

2

Dieser Code für mich gearbeitet hat bei der Bestimmung der Auflösung des Bildschirms dynamisch: Ich erinnere mich nicht es aus der Spitze von meinem Kopf

[DllImport("coredll.dll", EntryPoint = ("GetSystemMetrics"))] 
public static extern int GetSystemMetrics(int nIndex); 

private const int SM_CXSCREEN = 0; 
private const int SM_CYSCREEN = 1; 

private int width = GetSystemMetrics(SM_CXSCREEN); 
private int height = GetSystemMetrics(SM_CYSCREEN); 

, aber Es gibt auch eine Möglichkeit, die Bildschirmausrichtung zu erhalten. Dies würde helfen, Code in einer einzelnen Klasse zusammenzuführen.

Ich würde dringend empfehlen, eine einzige Lösung für alle Auflösungen zu erstellen. Sie können unter diesen Lösungen beliebig viele Projekte erstellen. Diese Projekte können Windows Forms-Anwendungen, DLL-Bibliotheksprojekte oder Projekte einrichten sein.

Ich möchte ein einzelnes Windows Forms Application Project erstellen. Ich würde die obige Technik verwenden und die statischen Bilder aus dem Dateisystem lesen. Wenn dies für Sie nicht funktioniert und/oder Sie Ihre Bilder lieber als Ressourcen lesen möchten, erstellen Sie ein DLL-Projekt namens "engine", das den gesamten Code enthält, der allen Auflösungen gemeinsam ist. Fügen Sie dann die Ausgabe dieses Projekts als Referenz zu so vielen Windows Forms Applications-Projekten hinzu, wie Sie benötigen.

5

Verankern und Andocken ist der gebräuchlichste Mechanismus für die Handhabung unterschiedlicher Auflösungen (denken Sie auch daran, dass viele Geräte den Bildschirm drehen können, so dass Sie Änderungen auch auf einem einzelnen Gerät verarbeiten müssen). Erste Bildschirmgröße, wenn danach noch nötig, ist so einfach wie die Abfrage des Bildobjekts:

int screenWidth = Screen.PrimaryScreen.Bounds.Width; 
int workingHeight = Screen.PrimaryScreen.WorkingArea.Height; 
2

Es gibt keine einfache Antwort auf diese Frage. Das Gestalten von Formularen für unterschiedliche Bildschirmauflösungen ist in Windows problemlos möglich, wo selbst die kleinste Bildschirmgröße 600 x 800 beträgt. In der CF-Welt kann der Bildschirm so klein wie 240 x 240 (oder kleiner für Smartphones) oder so groß wie sein 640 x 480 (oder größer). Verankern und Andocken neigen dazu, über diese Größenbereiche hinweg sehr schlecht zu arbeiten.

Eine Option besteht darin, einen Ansatz des kleinsten gemeinsamen Nenners zu verwenden und alles so zu entwerfen, dass es auf den kleinstmöglichen Bildschirm passt. Dies funktioniert garantiert auf jedem Gerät, verschwendet aber auf großen Bildschirmen natürlich nutzbaren Platz.

Eine andere Option besteht darin, jedes Formular so zu entwerfen, dass es auflösungsabhängig ist. Wenn Sie beispielsweise über ein Formular verfügen, das Daten in einem Raster anzeigt, und darüber eine Filter-Combobox, können Sie Code in das Resize-Ereignis des Formulars schreiben, das die Abmessungen des Rasters an den verfügbaren Platz anpasst.

Eine alternative Option für auflösungssensitiven Code ist das Erstellen eines separaten Formulars für jede Auflösung für eine bestimmte UI-Funktion. Das ist mehr Arbeit und führt natürlich zu Code-Duplizierung, aber für einige bestimmte Funktionen ist dies nur etwas, was Sie tun müssen. Solange Sie die allgemeine Logik abstrahieren, wird es Ihnen gut gehen.

Sie haben die richtige Idee, dies in einem einzigen Projekt zu erreichen.Unterschiedliche Bildschirmauflösungen können normalerweise mit ein wenig Arbeit und Gedanken bewältigt werden und sind definitiv kein Grund, Ihr Produkt in verschiedene Projekte aufzuteilen.

+0

Bitte sehen Sie meine neue Antwort.Ich grabe ein wenig in dieses Problem und fand einen viel besseren Weg, mit Bildschirmauflösungen umzugehen. – MusiGenesis

0

Ich habe den Designer für alle, aber die grundlegendsten kompakten Anwendungen aufgegeben. Ich versuche, jede Kontrolle mathematisch mit den Bildschirmmaßen zu platzieren. Es hört sich schmerzhaft an, aber wenn man erst einmal anfängt, wird es zur zweiten Natur.

Für jedes Formular erstelle ich eine "Regenerieren" -Methode, die jedes Mal ausgelöst wird, wenn das Formular angezeigt oder in der Größe geändert wird. Bei dieser Methode setze ich im Allgemeinen Position, Größe und ggf. Schriftgröße für jedes Steuerelement im Formular fest. Beim Platzieren der Steuerung ist mein Denkprozess:

  1. OK für normales Porträtgerät?
  2. OK für normales Landschaftsgerät?
  3. OK für quadratisches Gerät?
  4. OK für VGA (640x480) (High DPI) Gerät?

Für Schriftgrößen und mit hohem DPI (Dots Per Inch) VGA-Geräte zu tun, verwende ich die Eigenschaft -:

CurrentAutoScaleDimensions.Height/96

... eine Schriftart-Skalierung zu erzeugen Faktor. (Normale Geräte sind 96 DPI)

Als letzte Möglichkeit können Sie bedingte (if) Anweisungen in Ihrem Regenerationscode verwenden, um verschiedene Bildschirmgrößen/Formen zu testen.

Es ist immer noch möglich, den Designer für das grundlegende Layout zu verwenden, aber Sie müssen die Formulare auf verschiedenen Emulatoren/Geräten ausführen und versuchen, Hoch/Querformat zu wechseln, um die 'Regenerieren'-Methoden vollständig zu testen.