Problemas con resoluciones.

19/04/2006 - 10:45 por Diego \(DCD\) | Informe spam
Hola,

he estado desarrollando mi aplicación con el emulador de Pocket PC y
ahora me han traido una PDA para instalarla, pero cual es mi sorpresa que al
ejecutar mi aplicación todo se ha quedado mucho más pequeño, los botones y
las imágenes casi no se ven.
¿hay alguna manera de solucionar esto, o tengo que rediseñar el programa
otra vez?

Gracias y un saludo.

Preguntas similare

Leer las respuestas

#1 Lonifasiko
19/04/2006 - 12:14 | Informe spam
Es una de las cosas por las que no quiero ver el emulador ni en
pintura!

Yo norrmalmente desarrollo para la resolución 240x320. Con el CF 2.0,
si tienes establecido el AutoEscaleMode = Dpi en cada formulario (por
defecto viene así), la resolución "no debería" ser un problema y
todos los controles "deberían adaptarse" correctamente. Aún así, yo
siempre he tenido que "tocar" alguna cosilla para adaptar todo a ambas
resoluciones.

De hecho, antes del CF 2.0 recomendaban construir 'N' UIs o layouts
diferentes:

if (ClientSize.Height == 320 && ClientSize.Widht$0)
{
InitializeComponentNormal()
}
else if (ClientSize.Height == 640 && ClientSize.WidhtH0)
{
InitializeComponentVGA()
}
else
{
// Modo landscape
}

Pero como te digo, con AutoescaleMode = Dpi, las aplicaciones
desarrolladas por lo menos con CF 2.0 se autoadaptan bastante bien a
las distintas resoluciones. Si utilizas algo del Smart Device Framework
de OpenNETCF, verás que en su nueva versión 2.0 Beta1, los botones
también se adaptan correctamente. En versiones anteriores, había que
cargar imágenes diferentes para cada resolución.

Yo utilizo sólo estas dos resoluciones y me va bastante bien. Con
modos "landscape", etc.me temo que seguro que tienes que construir
layouts diferentes.

Saludox.
Respuesta Responder a este mensaje
#2 Unai Zorrilla Castro
19/04/2006 - 12:58 | Informe spam
En efecto esto es un problema, pero no estoy de acuerdo contigo cuando dices
que no quieres ver ni en pintura los emuladores, son mucho mejor opción que
el dispositivo real sobre todo cuando no sabes de antemano cual va a ser. Los
emuladores te permites especificar la resolución con la que lo quieres por lo
tanto te permite hacer pruebas en todas las resoluciones posibles.

El tema de los Dpi suele pasar mucho en los controles personalizados que no
hereden la propiedad de AutoScale en CF 2.0 aún así hay formas de realizar el
ajuste con una sencilla clase de helper para Dpi invocando a GetDeviceCaps
para obtener el dpi del dispositivo.

Saludos
Unai zorrilla Castro
Microsoft MVP Compact Framework


"Lonifasiko" escribió:

Es una de las cosas por las que no quiero ver el emulador ni en
pintura!

Yo norrmalmente desarrollo para la resolución 240x320. Con el CF 2.0,
si tienes establecido el AutoEscaleMode = Dpi en cada formulario (por
defecto viene así), la resolución "no debería" ser un problema y
todos los controles "deberían adaptarse" correctamente. Aún así, yo
siempre he tenido que "tocar" alguna cosilla para adaptar todo a ambas
resoluciones.

De hecho, antes del CF 2.0 recomendaban construir 'N' UIs o layouts
diferentes:

if (ClientSize.Height == 320 && ClientSize.Widht$0)
{
InitializeComponentNormal()
}
else if (ClientSize.Height == 640 && ClientSize.WidhtH0)
{
InitializeComponentVGA()
}
else
{
// Modo landscape
}

Pero como te digo, con AutoescaleMode = Dpi, las aplicaciones
desarrolladas por lo menos con CF 2.0 se autoadaptan bastante bien a
las distintas resoluciones. Si utilizas algo del Smart Device Framework
de OpenNETCF, verás que en su nueva versión 2.0 Beta1, los botones
también se adaptan correctamente. En versiones anteriores, había que
cargar imágenes diferentes para cada resolución.

Yo utilizo sólo estas dos resoluciones y me va bastante bien. Con
modos "landscape", etc.me temo que seguro que tienes que construir
layouts diferentes.

Saludox.


Respuesta Responder a este mensaje
#3 Diego \(DCD\)
19/04/2006 - 13:37 | Informe spam
Efectivamente, como dice Unai, me pasa principalmente con los controles
personalizados. ¿Tienes algún Link donde pueda encontrar ese Helper que
dices? y ¿algún ejemplillo de cómo se aplica?

¿por qué los emuladores son tran mostruosos? por el ejemplo el Pocket PC
Phen VGA - WM 5.0. ¿se puede cambiar eso?

Gracias y un saludo.


"Unai Zorrilla Castro"
escribió en el mensaje
news:
En efecto esto es un problema, pero no estoy de acuerdo contigo cuando
dices
que no quieres ver ni en pintura los emuladores, son mucho mejor opción
que
el dispositivo real sobre todo cuando no sabes de antemano cual va a ser.
Los
emuladores te permites especificar la resolución con la que lo quieres por
lo
tanto te permite hacer pruebas en todas las resoluciones posibles.

El tema de los Dpi suele pasar mucho en los controles personalizados que
no
hereden la propiedad de AutoScale en CF 2.0 aún así hay formas de realizar
el
ajuste con una sencilla clase de helper para Dpi invocando a GetDeviceCaps
para obtener el dpi del dispositivo.

Saludos
Unai zorrilla Castro
Microsoft MVP Compact Framework


"Lonifasiko" escribió:

Es una de las cosas por las que no quiero ver el emulador ni en
pintura!

Yo norrmalmente desarrollo para la resolución 240x320. Con el CF 2.0,
si tienes establecido el AutoEscaleMode = Dpi en cada formulario (por
defecto viene así), la resolución "no debería" ser un problema y
todos los controles "deberían adaptarse" correctamente. Aún así, yo
siempre he tenido que "tocar" alguna cosilla para adaptar todo a ambas
resoluciones.

De hecho, antes del CF 2.0 recomendaban construir 'N' UIs o layouts
diferentes:

if (ClientSize.Height == 320 && ClientSize.Widht$0)
{
InitializeComponentNormal()
}
else if (ClientSize.Height == 640 && ClientSize.WidhtH0)
{
InitializeComponentVGA()
}
else
{
// Modo landscape
}

Pero como te digo, con AutoescaleMode = Dpi, las aplicaciones
desarrolladas por lo menos con CF 2.0 se autoadaptan bastante bien a
las distintas resoluciones. Si utilizas algo del Smart Device Framework
de OpenNETCF, verás que en su nueva versión 2.0 Beta1, los botones
también se adaptan correctamente. En versiones anteriores, había que
cargar imágenes diferentes para cada resolución.

Yo utilizo sólo estas dos resoluciones y me va bastante bien. Con
modos "landscape", etc.me temo que seguro que tienes que construir
layouts diferentes.

Saludox.





Respuesta Responder a este mensaje
#4 Lonifasiko
19/04/2006 - 13:41 | Informe spam
Lo de los emuladores es una opinión personal. Será porque siempre me
han dado problemas ;-)

Dejar totalmente configurado un emulador para que la aplicación corra
sin problemas es muchas veces una tarea más que compleja: en mi caso
tenía que copiar ficheros a mano,
la BD, poner breakpoints para que la aplicación no ejecutase cierto
código...en fin, mil historias. Pero como te digo, es una opinión
totalmente personal, y está claro que si no sabes cual va a ser el
dispositivo "target", es la única opción.

No conocía GetDeviceCaps. Supongo que evita mi cadena de "if"-s
relativos a distintas resoluciones. Gracias por la info.

Por lo demás, estoy muy contento con el autoescalamiento Dpi.

Saludox.
Respuesta Responder a este mensaje
#5 Unai Zorrilla Castro
19/04/2006 - 15:32 | Informe spam
Lo pongo aquí a ver si os vale

Primero la llamada a nativo:

internal class WinNative
{
[DllImport("coredll.dll")]
internal static extern int GetDeviceCaps(IntPtr hdc, int nIndex);
}


Lógicamente tenies que incluir System.Runtime.InteropServices

Ahora la clase HelperDpi

internal class DpiHelper
{

private static int mRealDpi =
WinNative.GetDeviceCaps(IntPtr.Zero,/*LOGPIXELS*/88);


public static void AdjustAllControls(Control parent)
{
if (mRealDpi == 96)
return;
foreach (Control child in parent.Controls)
{
AdjustControl(child);
AdjustAllControls(child);
}
}

public static void AdjustControl(Control control)
{
control.Bounds = new Rectangle(
control.Left * mRealDpi / 96,
control.Top * mRealDpi / 96,
control.Width * mRealDpi / 96,
control.Height * mRealDpi / 96
);
}

public static int Scale(int x)
{
return x * mRealDpi / 96;
}
}

Solamente teneis que llamar AdjustControl pásandole como parámetro el
control que querais ajustar o bien AdjustAllControls y pasarle un form para
que ajuste todos los controles contenidos en el. Con cuidado que es un método
recursivo y esto no es 'muy buena cosa' pero para empeza.

.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
Saludos
Unai Zorrilla Castro
Microsoft MVP Compact Framework
www.canaldotnet.com

Blog
www.geeks.ms/unai/default.aspx

.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.

"Diego (DCD)" escribió:

Hola,

he estado desarrollando mi aplicación con el emulador de Pocket PC y
ahora me han traido una PDA para instalarla, pero cual es mi sorpresa que al
ejecutar mi aplicación todo se ha quedado mucho más pequeño, los botones y
las imágenes casi no se ven.
¿hay alguna manera de solucionar esto, o tengo que rediseñar el programa
otra vez?

Gracias y un saludo.




Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida