Autor Tema: Resolucion de pantalla  (Leído 4977 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado ejmc

  • PIC18
  • ****
  • Mensajes: 311
Resolucion de pantalla
« en: 23 de Enero de 2005, 17:55:00 »
Hola a todosSonrisa
Soy nuevo en esto del VB y hice un trabajito, es un formulario, con botones y labels y textbox y cosas asi. En la maquina donde lo hice tengo una resolucion muy alta y cuando pase el .exe a otra maquina con una resolucion mucho mas baja ,el formulario me quedo cortado por la mitad y no se llega a ver los controles que tengo del otro lado. Como se soluciona esto? para que se adapte a cualquier pantalla
A ver que me dicen.......

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
RE: Resolucion de pantalla
« Respuesta #1 en: 24 de Enero de 2005, 04:10:00 »
Tienes que jugar con las propiedades LEFT, TOP, WIDTH y HEIGHT tanto del formulario como de los controles que tengas dentro:

- LEFT y TOP son las coordenadas del vértice superior izquierda de cada objeto
- WIDTH y HEIGHT son el ancho y alto de cada objeto

Lo ideal sería que el control de tamaños y posiciones lo realices dentro del evento FORM.RESIZE, así te garantizas que todo ocupa su sitio incluso aunque el usuario empuje o tire del borde del formulario para cambiar su tamaño.

Desconectado Colores

  • Moderadores
  • PIC16
  • *****
  • Mensajes: 232
RE: Resolucion de pantalla
« Respuesta #2 en: 24 de Enero de 2005, 20:09:00 »
La manera más rápida es conocer el tamaño de la pantalla actual.
Para esto se puede usar el objeto SCREEN. Este objeto tiene algunas propiedades que son importantes para conocer la resolucion de la pantalla y así posicionar, centrar y redimensionar un formulario en tiempo de ejecucion.
   
Screen.Width -- Devuelve el ancho de la pantalla
Screen.Height -- Devuelve el alto de la pantalla

Con esto se puede manejar todo un sistema de coordenadas para hacer lo que se quiera independientemente de la resolución. Una de las cosas que hay que tener en cuenta es que las coordenadas y medidas que devuelve son basadas en el sistema de coordenadas actual. Si uno mira en las propiedades del form encontrará una propiedad llamada "ScaleMode". Normalmente esta está establecida en "twips".
El twip es una medida independiente... 1440 twips son una pulgada o 567 twips entran en un centimetro tomando como referencia el sistema de coordenadas de una impresora.
Esto hay que convertirlo a pixeles para saber la resolucion actual. Entonces, o se cambia "ScaleMode" a pixel, o se lo deja como está en twips y se llama a la siguiente función que hice para esto:

Public Function resPantalla() As String
    Dim X As Single
    Dim Y As Single
   
    X = Screen.TwipsPerPixelX
    Y = Screen.TwipsPerPixelY
   
    X = Screen.Width / X
    Y = Screen.Height / Y
   
    resPantalla = X & "x" & Y
   
End Function

Esta función devuenve un string con la resolucion actual. Por alguna razón no funciona bien si se cambia la resolucion actual. Siempre devuelve la resolución de la primera vez que se invocó. Por ejemplo: si tengo 800x600 funciona bien, pero si cambio la resolución a 1024x768 y ejecuto el código nuevamente me devuelve 800x600. O sea, detecta bien, pero si se la cambia a veces no actualiza el cambio. Esto pasaba en W98, en XP no me acuerdo de haberlo probado.

Espero que te sirva, cualquier duda avisá.

Salu2.

Desconectado ejmc

  • PIC18
  • ****
  • Mensajes: 311
RE: Resolucion de pantalla
« Respuesta #3 en: 25 de Enero de 2005, 07:42:00 »
Bueno perdi el mensajeArdiendo, aca va de nuevo
Gracias Nocturno y Colores por sus respuestasSonrisa...
Pero haver una vez que conosco la resolucion de pantalla tengo que modificar el temano de cada control?, el tema es que tengo unos 6 arreglos de 31 textbox c/u mas unos cuantos botones y etiquetas y otras cosas, tengo qureredimencionar todo uno por unoHelado
Bueno, la paciencia es el alimento de los saviosSonrisa Gigante

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
RE: Resolucion de pantalla
« Respuesta #4 en: 25 de Enero de 2005, 09:35:00 »
Pues no se me ocurre otra manera de hacerlo, excepto modificar uno a uno los tamaños y coordenadas de tus objetos.
Otra opción más cómoda es diseñar tu formulario para que se vea bien en la menor resolución posible (¿640x480?) y así si alguien utiliza una resolución mayor lo verá más chiquitín, pero servirá siempre...

Desconectado Colores

  • Moderadores
  • PIC16
  • *****
  • Mensajes: 232
RE: Resolucion de pantalla
« Respuesta #5 en: 25 de Enero de 2005, 10:45:00 »
Nocturno tiene razón, es la manera más sencilla... aunque si te querés complicar un poquito más, acá te digo cómo:

SI, tenés que redimensionar todos los controles, pero hay una manera de automatizarlo.

Primero tenés que saber cuantos controles hay en el formulario:

*******************
Dim Xcontrol As Integer
For Xcontrol = 0 To frmMain.Controls.Count - 1
*******************

Esto te devuelve en XControl la cantidad de controles que tiene el formulario.
Después los vas recorriendo con un FOR y según el tipo que sean (lo sabes preguntando con TypeOf) les aplicas o no la "redimensión".
Todo completo sería así:

*******************
Public Sub cambiar_escalas() "Sólo para 800x600
Dim Xcontrol As Integer
Dim name As String  "Solo para depurar
    grafico = 100
   
    For Xcontrol = 0 To frmMain.Controls.Count - 1
        If TypeOf frmMain.Controls(Xcontrol) Is Timer Or TypeOf frmMain.Controls(Xcontrol) Is CommonDialog Or TypeOf frmMain.Controls(Xcontrol) Is ImageList Or TypeOf frmMain.Controls(Xcontrol) Is Menu Or TypeOf frmMain.Controls(Xcontrol) Is Line Then
            GoTo SinCambio  " Estos controles no se pueden "resizear"
        Else
            name = frmMain.Controls(Xcontrol).name
            If TypeOf frmMain.Controls(Xcontrol) Is PictureBox Then
                frmMain.Controls(Xcontrol).Left = frmMain.Controls(Xcontrol).Left / 1.28
                frmMain.Controls(Xcontrol).Top = frmMain.Controls(Xcontrol).Top / (185 / 140) "(185 / 143) era el cálculo original.
                frmMain.Controls(Xcontrol).AutoSize = False
            Else
                frmMain.Controls(Xcontrol).Left = frmMain.Controls(Xcontrol).Left / 1.28
                frmMain.Controls(Xcontrol).Width = frmMain.Controls(Xcontrol).Width / 1.28
                frmMain.Controls(Xcontrol).Top = frmMain.Controls(Xcontrol).Top / (185 / 140)
                frmMain.Controls(Xcontrol).Height = frmMain.Controls(Xcontrol).Height / (185 / 140)
            End If
        End If

SinCambio:
    Next Xcontrol
   
    frmMain.ShapePlayer(1).BorderWidth = 1
    frmMain.ShapePlayer(2).BorderWidth = 1
    frmMain.ShapePlayerSombra(1).BorderWidth = 5
    frmMain.ShapePlayerSombra(2).BorderWidth = 5
   
    "frmMain.ShapePlaylist.BorderWidth = 1
    "frmMain.ShapePlaylistSombra.BorderWidth = 5
   
    frmMain.LabelName(1).FontSize = 18
    frmMain.LabelName(2).FontSize = 18
    frmMain.LabelDuracion(1).FontSize = 16
    frmMain.LabelDuracion(2).FontSize = 16
    frmMain.LabelTime(1).FontSize = 46
    frmMain.LabelTime(2).FontSize = 46
    frmMain.LabelMs(1).FontSize = 30
    frmMain.LabelMs(2).FontSize = 30
    frmMain.lblTimeMode(1).FontSize = 7
    frmMain.lblTimeMode(2).FontSize = 7
   
    frmMain.LabelPitch(1).FontSize = 16
    frmMain.LabelPitch(2).FontSize = 16
   
    frmMain.lstGrupos.Font.Size = 9
    frmMain.lstArchivos.Font.Size = 8
    "frmMain.lstArchivos.Font.Bold = False
   
    "frmMain.Label3.FontSize = 7
    "frmMain.Label4.FontSize = 7
   
    For Xcontrol = 1 To 6 "Hay 6 controles de estos.
        frmMain.Pote(Xcontrol).AutoSize = True
       
        frmMain.LPote(Xcontrol).X1 = frmMain.LPote(Xcontrol).X1 / 1.28
        frmMain.LPote(Xcontrol).X2 = frmMain.LPote(Xcontrol).X1 / 1.28
        frmMain.LPote(Xcontrol).Y1 = frmMain.LPote(Xcontrol).Y1 / (185 / 143)
        frmMain.LPote(Xcontrol).Y2 = frmMain.LPote(Xcontrol).Y2 / (185 / 143)
       
    Next Xcontrol
   
     
End Sub
*************************

Ese es un pedazo de código de un soft mío. Es para tomarlo como guía y para que lo adaptes. Como aclaración FrmMain es el formulario principal y lo tengo que llamar así porque este código lo tengo en otro módulo. Como verás hay cálculos que se usan porque la resolución nativa de la aplicación es de 1024x768 y se aplican sólo en el caso de que la resolucion actual sea 800x600. Con estos cálculos redimensiono todo para que se vea bien (hasta los anchos de los bordes de los controles Shape, la ubicación de los controles y el tamaño de fuentes).

O sea, usando el ejemplo anterior de la resolucion sería:

Si resolución es 1024x768 entoces todo bien.
Si resolución es 800x600 entonces llamo a "cambiar_escalas"
Si resolución es otra se pone un mensaje de advertencia y se cierra la aplicación.

En la primera parte del código se redimensionan los controles que no son "problemáticos", o sea que son más bien gráficos o no tienen problemas.
Despu´´es de la etiqueta "SinCambio" van los controles que redimensiono a mano.
Entonces ahí tenés un ejemplo de como hacerlo de las dos formas...

Salu2.


Desconectado ejmc

  • PIC18
  • ****
  • Mensajes: 311
RE: Resolucion de pantalla
« Respuesta #6 en: 26 de Enero de 2005, 08:31:00 »
Pues termine haciendo lo que me dijo Nocturno, es mas simpleSonrisa Gigante
De todas formas esta muy lindo lo que dice Colores, asi que lo guardare y lo tendre en cuenta para cuando haga algo en serio, por ahora empezare a ver las bases de datos.
Gracias a ambos

Desconectado Ignite

  • PIC16
  • ***
  • Mensajes: 107
RE: Resolucion de pantalla
« Respuesta #7 en: 26 de Enero de 2005, 12:37:00 »
Hace tiempo vi que existían algunos controles que permitían hacerlo, laverdad es que nunca los he probado y no se si sirven para todo un proyecto o para una ventana. En todo caso te recomiendo que visites la siguiente página, ya que dispone de muchos códigos fuentes, así como de controles etc....
PSCODE

Espero que os sirva, más que nada pq es un engorro tener que ir calculando para cada resolución.


 

anything