2008-11-18 26 views
5

Estoy desarrollando una aplicación de gráficos basada en .NET CF, mi proyecto implica una gran cantidad de imágenes de dibujo, decidimos ir a portar la aplicación en diferentes resoluciones de teléfonos. (240 X 240, 480 X 640) etc.Manejando diferentes resoluciones en Visual Studio 2008 para .NET CF

¿Cómo podría lograr esto en una única solución/proyecto?

¿Existe la necesidad de crear diferentes proyectos basados ​​en resoluciones? ¿Cómo manejaría los archivos comunes? y necesito que los cambios en una de las clases comunes ocurran en todos los dispositivos.

Gracias, Cronos

Respuesta

6

No escuches a ese idiota MusiGenesis. Una forma mucho mejor de manejar diferentes resoluciones de pantalla para dispositivos con Windows Mobile es usar , herencia de formularios, que se puede agregar a una aplicación existente de CF con un mínimo esfuerzo.

Básicamente, diseña cada formulario para una pantalla estándar de 240x320. Cuando tenga que volver a organizar un formulario para una nueva resolución (digamos 240x240), se agrega una nueva forma a su proyecto y que herede de su 240x320 forma original:

public partial class frmDialog240x240: frmDialog 

en lugar de sólo Forma:

public partial class frmDialog240x240: Form 

como de costumbre. En su formulario original, necesita establecer la propiedad Modificadores de cada control en Protegido (en lugar del valor predeterminado Privado). En el diseñador de su nuevo formulario, verá todos los controles en el formulario que está heredando, y puede moverlos y redimensionarlos como lo considere conveniente para acomodar las nuevas dimensiones de la pantalla (esto no afectará el formato original diseño).

Cuando su programa se está ejecutando, es fácil para él verificar la resolución de la pantalla del dispositivo en el que se está ejecutando y crear la forma adecuada (un método de fábrica es bueno para esto). Su nueva forma hereda todo del formulario antiguo, pero usa su nuevo diseño personalizado.

Este enfoque le permite evitar la duplicación de código, porque no hay ninguna.

+0

Probé el enfoque de herencia y no llegué muy lejos, principalmente debido a problemas con el diseñador. Recurrí al acoplamiento y obtuve resultados decentes. – cdonner

+0

@cdonner: ¿estableciste la propiedad Modificadores de cada control en el formulario principal en Protegido (en lugar de Privado)? Esa es la clave para que el diseñador funcione correctamente. – MusiGenesis

2

Este código ha trabajado para mí en la determinación de la resolución de la pantalla de forma dinámica:

[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); 

no recuerdo que fuera de la parte superior de la cabeza, pero también hay una forma de obtener la orientación de pantalla. Esto ayudaría a fusionar algunos códigos en una sola clase.

Recomiendo encarecidamente crear una solución única para todas las resoluciones. Podría tener tantos proyectos como desee bajo esta solución. Estos proyectos podrían ser aplicaciones de Windows Forms, proyectos de biblioteca Dll o proyectos de configuración.

Mi objetivo es crear un único proyecto de aplicación de Windows Forms. Usaría la técnica anterior y leería las imágenes estáticas del sistema de archivos. Si esto no funciona para usted y/o prefiere leer sus imágenes como recursos, cree un proyecto dll 'engine', que contenga todo el código común a todas las resoluciones. A continuación, agregue el resultado de este proyecto como referencia a todos los proyectos de Windows Forms Applications que necesite.

5

El anclaje y el acoplamiento es el mecanismo más común para manejar diferentes resoluciones (recuerde también que muchos dispositivos pueden rotar la pantalla, por lo que debe manejar los cambios incluso en un solo dispositivo). Obtener el tamaño de pantalla, si es necesario después de eso, es tan simple como consultar el objeto de pantalla:

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

No hay una respuesta simple a esta pregunta. Diseñar formularios para manejar diferentes resoluciones de pantalla es fácil de hacer en Windows donde incluso el tamaño de pantalla más pequeño suele ser de 600 x 800. En el mundo de CF, la pantalla puede ser tan pequeña como 240 x 240 (o más pequeña para teléfonos inteligentes) o tan grande como 640 x 480 (o más). El anclaje y el acoplamiento tienden a funcionar muy mal en estos rangos de tamaño.

Una opción es utilizar un enfoque de denominador menos común y diseñar todo para caber en la pantalla más pequeña posible. Esto está garantizado para funcionar en todos los dispositivos, pero obviamente perderá espacio útil en pantallas más grandes.

Otra opción es diseñar cada formulario para que tenga en cuenta la resolución. Por ejemplo, si tiene un formulario que muestra datos en una cuadrícula y un cuadro combinado de filtro encima, puede escribir código en el evento Resize del formulario que ajusta las dimensiones de la cuadrícula para llenar el espacio disponible.

Una opción alternativa para el código de resolución consciente es crear un formulario separado para cada resolución para una función de IU particular. Esto es más trabajo y conduce a la duplicación de código, por supuesto, pero para algunas funciones particulares, esto es algo que tienes que hacer. Mientras abstraigas la lógica común, estarás bien.

Tiene la idea correcta de querer lograr esto en un solo proyecto.Las diferentes resoluciones de pantalla generalmente se pueden manejar con un poco de trabajo y reflexión, y definitivamente no son motivo para dividir su producto en diferentes proyectos.

+0

Por favor, mira mi nueva respuesta.Exploté un poco sobre este problema y encontré una manera mucho mejor de manejar resoluciones de pantalla. – MusiGenesis

0

Dejé de lado al diseñador para todas las aplicaciones compactas, excepto las más básicas. Intento colocar cada control matemáticamente usando las dimensiones de la pantalla. Suena doloroso, pero una vez que te vas, se convierte en una segunda naturaleza.

Para cada formulario creo un método 'regenerar' que se activa cada vez que se muestra o cambia el tamaño del formulario. En ese método, generalmente establezco la ubicación, el tamaño y, si es necesario, el tamaño de fuente para cada control en el formulario. Al colocar el control, mi proceso de pensamiento es:

  1. ¿Aceptar para el dispositivo de retrato normal?
  2. ¿Está bien para el dispositivo regular?
  3. ¿Aceptar para el dispositivo cuadrado?
  4. ¿Está bien para dispositivo VGA (640x480) (alto DPI)?

Para los tamaños de fuente y tratar con alta ppp (puntos por pulgada) dispositivos VGA, que utilizan la propiedad -:

CurrentAutoScaleDimensions.Height/96

... para producir una fuente de escalado factor. (Los dispositivos normales son 96 DPI)

Como último recurso, puede usar sentencias condicionales (if) en su código regenerado para probar varios tamaños/formas de pantalla.

Todavía es posible utilizar el diseñador para el diseño básico, pero deberá ejecutar los formularios en varios emuladores/dispositivos e intentar cambiar el retrato/paisaje para probar completamente los métodos 'regenerar'.

Cuestiones relacionadas