TODOPIC

Lenguajes de programación para PC => Visual Basic => Mensaje iniciado por: Picavid en 20 de Noviembre de 2006, 13:08:53

Título: Calcular código para GLCD
Publicado por: Picavid en 20 de Noviembre de 2006, 13:08:53
Hola, perdonen mi ignorancia, pero se podría usar el control de Picture para leer un .bmp y poder sacar el código para un GLCD?.

  Supongo que habría que crear un picture p.e. de tamaño 64x128, darle escala, incluir o dibujar una imagen/texto, y luego leer pixel a pixel, creando un código.

  Hace poco compré un GLCD 64x128 y todavía no me he puesto con él, pero sólo empezar, ya vi que para poner cualquier gráfico, hay que empezar haciendo una plantilla, dibujar, y sacar muestreo en bytes de cada grupo de 8 pixels verticales. Es así no? En ese caso, sería mucho más fácil poder pintar en un cuadro Picture y que realice un muestreo.

  Alguien sabría como:
-Configurar el picture (escala)
-Dibujar dentro de él (con el ratón+click o lápiz)
-Sacar muestreo

Un saludo,
David Gomà
Título: Re: Calcular código para GLCD
Publicado por: BrunoF en 20 de Noviembre de 2006, 19:16:44
Hola.
Mira, justamente hace unos dias hice algo parecido para fastyx.
Te adjunto el codigo fuente del programa que hice.

Con respecto a lo de dibujar, no es nada dificil. Debes usar los eventos mouse_down y mouse_move de un objeto picturebox y utilizar la instruccion pset (x,y), color del picturebox.

Saludos.
Título: Re: Calcular código para GLCD
Publicado por: Picavid en 21 de Noviembre de 2006, 00:58:53
Gracias BrunoF, eres un Crack. En pocos días montaré un circuito y esté programa me ahorrará un montón de horas.

Estoy empezando a ampliar mis conocimientos en VB6 con los libros de Anaya, pero me quedo justo. Estos ejemplos además de ser MUY PRÁCTICOS, también son muy instructivos.

Con tu permiso voy a tratar de añadirle un par de cositas que llevaba en la cabeza: -modificar el tamaño y posición de la imagen dentro del escenario y añadirle texto. Si lo consigo y sale bien lo cuento.

Una vez mas, muchas gracias y un saludo.
Título: Re: Calcular código para GLCD
Publicado por: LordLafebre en 21 de Noviembre de 2006, 01:19:31
Hola:

Felicidades y gracias por el trabajo bruno, a ver si lo pruebo a ver como me va con proton.  :mrgreen: :-/
Título: Re: Calcular código para GLCD
Publicado por: BrunoF en 21 de Noviembre de 2006, 03:58:24
Gracias BrunoF, eres un Crack. En pocos días montaré un circuito y esté programa me ahorrará un montón de horas.

Estoy empezando a ampliar mis conocimientos en VB6 con los libros de Anaya, pero me quedo justo. Estos ejemplos además de ser MUY PRÁCTICOS, también son muy instructivos.

Con tu permiso voy a tratar de añadirle un par de cositas que llevaba en la cabeza: -modificar el tamaño y posición de la imagen dentro del escenario y añadirle texto. Si lo consigo y sale bien lo cuento.

Una vez mas, muchas gracias y un saludo.


Bueno, me alegro que te sirva. Agregale todo lo que desees. Yo lo hice como una herramienta basica para crear un array partiendo de una imagen.


Hola:

Felicidades y gracias por el trabajo bruno, a ver si lo pruebo a ver como me va con proton.  :mrgreen: :-/

Jejeje Gio, usalo. A ver si me terminas de explicar como se definen los elementos de un array en proton, y modifico(o lo modificas tu) el programa para que se pueda elegir el compilador.

Saludos.
Título: Re: Calcular código para GLCD
Publicado por: Picavid en 22 de Noviembre de 2006, 07:05:19
Hola BrunoF, ya tengo parte de la aplicación. Ya inserto una imagen en un picture en la posición y tamaño que le indique. Después puedes digitalizarla convirtiendo los colores a blanco y negro en la scala de pixels 128x64, pero al definir los puntos, lo hace con un punto redondo, y siempre se queda algo de fondo, entonces mi pregunta es: Como puedo harcer puntos cuadrados que me llenen el pixel entero?

Un saludo

Título: Re: Calcular código para GLCD
Publicado por: BrunoF en 22 de Noviembre de 2006, 19:37:47
Hola Picavid.

Bueno, el control PictureBox de VB no maneja directamente formas cuadradas. Sólo permite punto(como bien dijiste, redondos), línea, círculo y elípse.

Para rellenar con un rectángulo un sector del PictureBox, tenes que utilizar la API de Windows:

Declara arriba de todo en el Formulario esto:

Código: Visual Basic
  1. Private Declare Function Rectangle Lib "GDI32.dll" ( _
  2.     ByVal hDC As Long, ByVal X1 As Long, ByVal Y1 As Long, _
  3.     ByVal X2 As Long, ByVal Y2 As Long) As Long

Esa es una llamada a una función de la librería gráfica de Windows y te va a permitir dibujar rectángulos(por lo tanto también cuadrados cuando el ancho sea igual al alto).

El rectángulo esta conformado por dos partes: El borde y un relleno(perímetro y superficie).
El color del borde viene dado por la propiedad ForeColor del control PictureBox al momento de dibujar el rectángulo.
El color del fondo viene dado por la propiedad FillColor del control PictureBox al momento de dibujar el rectángulo.
El tamaño del borde viene dado según el valor que tenga la propiedad DrawWidth del controlPictureBox al momento de dibujar el rectángulo.

Hay otras propiedades más a tener en cuenta:
Para que lo que dibujamos no se borre y permanezca dentro del HCD del control PictureBox, la propiedad AutoRedraw del mísmo debe estar puesta en TRUE.

Y las propiedades DrawMode, DrawStyle y FillStyle del PictureBox.
Cada una realiza una función distinta:

La propiedad DrawMode determina qué parámetro se utilizará para dibujar sobre el PictureBox. Recomiendo que en un principio lo dejes en 13(Copy Pen). Luego si quieres puedes experimentar lo que sucede al cambiar esta propiedad.

La propiedad DrawStyle no te va a servir de nada para el rectángulo. Por lo que estuve probando, no hay diferencia visible en el rectángulo al cambiar esta propiedad.

La propiedad FillStyle es importante. Para crear rectángulos rellenos, debes setearla a 0(Solid). Luego podes experimentar con los distintos valores de esta propiedad.

Según lo que he estado probando, la función Rectangle trabaja en unidad pixel. Por lo tanto, sería lógico setear la propiedad ScaleMode del PictureBox a 3(Pixels) para igualar las unidades de medición. Esto te va a facilitar el cálculo de las coordenadas X,Y a la hora de graficar los rectángulos sobre el PictureBox.

Luego si estás mas canchero con la función podes probar utilizar la función Scale del PictureBox y cambiar las escalas del mísmo a 128 horizontal y 64 vertical. Pero ojo que esto afectará la posición en la que se dibujan los rectángulos.

He descubierto que la función tiene ciertos BUGS. Puede que no te ocurran o puede que si.

Su uso es bastante simple:

Código: Visual Basic
  1. Picture1.ForeColor = vbBlue
  2. Picture1.FillColor = vbRed
  3. Picture1.FillStyle = vbFSSolid
  4. Rectangle Picture1.hDC, 10, 10, 120, 150

Saludos.

Título: Re: Calcular código para GLCD
Publicado por: Picavid en 23 de Noviembre de 2006, 01:46:26
Hola BrunoF, gracias por la información. No sabía eso y los rectángulos los había hecho con líneas. Esto ahorra bastante código.

  Pero creo que no me expliqué del todo bien. Verás, una imagen vale mas que mil palabras:

  Te explico: La imagen entera es el Picture, que corresponderia a la GLCD. En este caso he seleccionado como fondo el verde claro. He insertado la imagen grande y la he digitalizado, y postiormente he insertado otra vez la imagen mas pequeña y la he dejado sin digitalizar. Como ves, quedan restos del color de fondo, ya que al hacer los puntos redondos, quedan las esquinitas. Mirando en el msdn: Trazar puntos, Conceptos de Visual Basic, hay un ejemplo con puntos cuadrados, pero no dice como hacerlos. Con lo que has expuesto, he intentado lo siguiente definir un minicuadrado con un pixel de diferencia (hDC, 10,10,11,11), pero en pantalla aparece como un punto redondo.

Saludos
Título: Re: Calcular código para GLCD
Publicado por: BrunoF en 23 de Noviembre de 2006, 02:57:28
Hola Picavid.

Antes que nada te voy a advertir sobre un par de cosas:

Mi programa, como habras visto, posee un Image y un PictureBox.
Utilizo ambos ya que para agilizar las cosas, aprovecho la propiedad Strech del Image para acomodar el tamaño de la imagen a 64x128. Luego copio el contenido del Image al PictureBox. Por lo tanto, la lectura de los pixels se hace desde el contenido del PictureBox. Entonces, el Image ya no me sirve de nada una vez hecho, pero si me sirve el PictureBox.
No modifiques el contenido del PictureBox antes de que el programa haga el barrido, sino va a generar mal los valores del array(excepto que precisamente desees modificar el contenido antes de crear el array).






Bueno, voy a comenzar a suponer un par de cosas:

1)Supongo que el tamaño del control Image(el pequeñin del borde inferior derecho) tiene un ancho de 128 pixels y un alto de 64 pixels(ojo que en el programa que te pase tenía 132x68 y hay que corregir ese pequeño desfasaje).
2)Supongo que el PictureBox tiene un ancho y alto múltiplos del control Image(si no es asi(mi ojo milimetrado detecta que no es múltiplo) hacelos que sean múltiplos: ejemplo: 256x128 512x256, etc).

Basandonos en esto: supongamos que seguiste mi no tan sabio consejo de hacer el tamaño del PictureBox múltiplo del control Image.

Entonces asigná por ejemplo...
Image1.ScaleMode = vbpixels
Picture1.ScaleMode = vbpixels
Picture1.Width = Image1.Width*3 y
Picture1.Height = Image1.Width*3

¿Cuál fue tu error?

Detengamonos a ver un poco lo que hiciste:

Tomaste una imágen(la pequeñita) y la vas leyendo. En base a eso quieres crear una imágen monocromática y de mayor tamaño a la pequeñita.¡La imágen creció y sin embargo seguiste usando un tamaño de rectángulos de 1x1 pixel!

Por lo tanto, si agrandas el tamaño del grafico...¡DEBES AGRANDAR EL TAMAÑO DE CADA PIXEL(rectangulo)!

Si el dibujo grande es 4 veces mas ancho y alto que el pequeñito, pues entonces cada pixel del dibujo será en realidad un conjunto de 4x4 pixels. Por lo tanto, tus rectángulos deberán tener 4 pixels de ancho y 4 de alto cada uno.

¿Comprendiste?

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=14851.0;attach=2734)
Saludos...

Título: Re: Calcular código para GLCD
Publicado por: Picavid en 23 de Noviembre de 2006, 15:04:12
Hola BrunoF,

  Haber, intento aclarme porque me pierdo.
  Primero, bebido a, como te dije, que quería poder dibujar, modificar y escribir, decidí hacer un nuevo programa.
    -En vez de poner un image y un picture, puse dos pictures, porque me liaba mucho. (no tengo idea si es mejor o peor)
    -El picture principal, tiene un tamaño en pantalla de 12.495 por 5.085, pero una resolución de 128x64. Esto lo he hecho usando ScaleWidth y ScaleHeight a 128 y 64 respectivamente. Estoy convencido de esto, porque todo el programa se basa en esta resolución, incluso cuando desplazas el mouse por encima te va indicando las coordenadas (Esto lo aprendí con lo que dijiste de MouseMove y MouseDown.
    -Para Insertar la imagen:
        TamW = finX - iniX      'Es tamaño a escala Width-ancho
        TamH = finY - iniY      'Es tamaño a escala Height-alto
        Picture1.PaintPicture Picture2.Image, iniX, iniY, TamW, TamH
      Con esto, inserto la imagen que tengo en Picture2 en la posición y tamaño que previamente he marcado con iniX,...,finY

  -Para dibujar (puntos o lineas). Tengo configurado en Form_Load:
         Picture1.DrawWidth = (Picture1.Width / 1950)
         Esto me define el tamaño del punto que ocupa mas o menos el pixel entero(Esto es lo que no tengo claro. Este valor lo he puesto aleatoriamente hasta cuadrarlo.).
         Luego ya, con la funcion mouse_down y mouse_move, puedo dibujar dentro del picture.
*****Y aquí está mi duda. Cuando pinto un pixel, pone un punto redondo y no puedo ponerlo cuadrado!!!****
         El pintado lo hago así:
         Picture1.PSet (pntX, pntY), colPixel
         
         Bien, si aqui uso Rectangle con diferencia entre puntos de 1,1, igualmente sale un punto redondo. Si es de tamaño ...p.e. 50x50, bien, aunque cambia la escala de pixels, pero bueno. Esto tampoco lo entiendo mucho.
         ¿Es esto lo que dices? Si es así, no hay otro método tan engorroso (calcular escala, tener que definir un punto con cuatro coordenadas, definir color de marco, color de relleno,...)?

      A pesar de todo, ya he comprovado que no hay problema. Una vez digitalizo (paso a dos colores en definición 128x64) y codifico (leo los bytes) la imagen con tu metodo (punto a punto. Es de color ...?),  grabo los bytes. Luego he puesto la función de decodificar, recupero ese archivo, me lo carga en el picture, y ... perfecto. No ha grabado nada de los restos de colores que quedaban en la imagen original. En realidad, esto era lo que me preocupaba.

  Ahora la única preocupación respecto a los puntos es simplemente como acabado/presentación, que merecería la pena corregir, pero si no se puede, no se puede, a buscar otro metodo...

  Perdona si no te entiendo, pero todavía estoy bastante pez!!!


  Saludos,
Título: Re: Calcular código para GLCD
Publicado por: BrunoF en 24 de Noviembre de 2006, 00:18:13
Hola. No se en que parte no entendiste mi explicación. Me parece que no has captado la teoría que expuse por completo.
Te estas complicando mucho.
Aca te adjunto el programa que necesitas. Si bien no es 100% funcional, te va a servir a manera de explicacion practica.

Observa que el Picture2 que es el gigante, tiene su escala en Pixels, para utilizar la misma escala que usa la funcion Rectangle de la WINAPI.

No es necesario reescalar la imagen. Si la reescalas a 128x64, se te van a complicar los calculos ya que debes pasar de una escala USER(es decir, que la definis vos como lo hiciste segun lo que mencionas) a pixels para poder dibujar en la posicion correcta los rectangulos y su dimension.

Saludos.
Título: Re: Calcular código para GLCD
Publicado por: Picavid en 24 de Noviembre de 2006, 06:00:05
Hola BrunoF,
  Creo que no estamos hablando de lo mismo.  La imagen que adjunté, corresponde a un solo Picture. En ella coloqué la misma imagen dos veces a diferente escala y posición, y es ese picture grande sobre el que edito. Me interesa esto porque en un GLCD quiero, tanto poner una imagen como texto y/o dibujos a mano alzada.
  Bien, adjunto el programa (está sin depurar y a medias) y entenderás a lo que me refiero.
  Saludos
 
Título: Re: Calcular código para GLCD
Publicado por: BrunoF en 24 de Noviembre de 2006, 08:43:21
Hola.
Estabamos hablando de lo mismo, pero aplicado a distintas cosas.
Este programa deberia solucionar tus dudas. Lamentablemente, te tocara cambiar el resto del programa, ya que ahora el Picture1 trabaja en escala de Pixels con un scalewidth multiplo de 128 y un scaleheight multiplo de 64.

Saludos.
Título: Re: Calcular código para GLCD
Publicado por: PalitroqueZ en 24 de Noviembre de 2006, 16:30:21
Está muy bien ese programa que estan haciendo ustedes BrunoF y Picavid.

Yo hice uno similar, el generador de caracteres para LCD (http://www.todopic.com.ar/foros/index.php?topic=14552.0) y tuve el mismo problema que picdavid, el problema del punto redondo, parece que el método LINE no dibuja puntos cuadrados, o por lo menos no encontré la forma. Busqué y busqué la manera de trabajar con el picture dibujando al estílo paint, pero no encontré la manera.

Si miran el programa para dibujar imagenes para pantallas graficas que anda por aquí en el foro (el que dá el código en Basic), notaran que al dejar presionado el botón del mouse se mantiene la línea si recorren los pixeles.

así era que lo quería hacer, pero no pude :( y no me quedó más remedio que irme por el camino largo. Tomar un picturebox como un píxel y crear una matríz de control para 8 caracteres de 5x7 = 8x5x7 = 280 picturebox, claro para el programa de Picavid esto sería engorroso.

voy a seguir sus avances y ver si puedo usar esa api (Rectangle) que menciona BrunoF para manejar pixeles en un pictureBox.

PD: disculpenme si me pasé alguna explicación, que ya me pongo a leerla.

Salu2
Título: Re: Calcular código para GLCD
Publicado por: BrunoF en 24 de Noviembre de 2006, 19:30:35
Hola PalitroqueZ.
Antes que todo, gracias.

Proba el ultimo programa que puse. presiona el click izquierdo y derecho sobre el picturebox. Creo que eso es lo que andas necesitando.

Saludos.
Título: Re: Calcular código para GLCD
Publicado por: Picavid en 25 de Noviembre de 2006, 02:52:35
Hola,

  Gracias a los dos. Bruno, ya he entendido lo que me habías explicado, gracias.
  PalitroqueZ, creo que lo que quieres hacer, lo puedes hacer con el programa. Te cuento:
   -Apretando el boton izq., trazas lineas,
   - con el derecho, haces puntos,
   - Y, manteniendo pulsada la tecla shift mientras mueves el ratón, trazas a mano alzada.

Saludos,
Título: Re: Calcular código para GLCD
Publicado por: BrunoF en 25 de Noviembre de 2006, 05:14:57
Bueno, me alegro que hayas comprendido.
Ni vi lo del SHIFT para graficar a mano alzada. Tenes que cambiar los Pset por los rectangle. las coordenadas X1,Y1,X2,Y2 del rectangulo son iguales a las que uso para el click del boton derecho en Picture1_mousedown.

Espero que termine en buen puerto.
Saludos.
Título: Re: Calcular código para GLCD
Publicado por: PalitroqueZ en 27 de Noviembre de 2006, 15:33:44
Bueno amigos, probé el código que ustedes hicieron (GLCD Grafico + Picavid) y le hice una pequeña adaptación de lo que yo quería hacer:

(http://img427.imageshack.us/img427/2038/dibujandoey3.jpg)

-para dibujar un pixel (un punto cuadrado), usé la api Rectangles y de acuerdo al la escala escogida (Picture1.DrawWidth = Picture1.ScaleWidth / 35) seleccioné como coordenadas del pixel X,Y,X+2,Y+2 y efectivamente dibuja correctamente.

nota: si utilizaba X+1,Y+1 en vez de mostrar rectangulos aparecian circulos, así que fuí tanteando e incrementrando a 2 me aparecía el mínimo necesario para mostrar un punto cuadrado. Creo que esa es la duda que tenía Picavid.

-también le añadí el mismo código al evento mouse_down para dibujar el píxel sin mover
el ratón.

- otra observación, tuve que usar Picture1.Refresh después de la llamada de la api para que dibujara en cada evento.

ahora intento probar como ajustar el picturebox de manera que si ya dibujé en una determinada coordenada no vuelva a tocar ese punto y dibuje el rectángulo completo en la coordenada de al lado.

es que quisiera modificar el programita de caracteres y hacerlo de la manera como ustedes lo estan trabajando, así que iré contestando por aquí 8).

Salu2
Pedro
Título: Re: Calcular código para GLCD
Publicado por: BrunoF en 27 de Noviembre de 2006, 19:13:34
Hola Pedro.

- otra observación, tuve que usar Picture1.Refresh después de la llamada de la api para que dibujara en cada evento.

Efectivamente, parecería tener algun bug con el Pen o algo nos falta para poder dibujar más de un rectángulo sin necesidad de tener que poner una función que lo arregle. Yo en el programa en lugar del refresh utilice el Pset en un lugar invisible del PictureBox. Lo hice asi porque me parece que es mas rápido que el Refresh(al menos en mi pc y esto depende mucho de la placa gráfica de cada computadora).

ahora intento probar como ajustar el picturebox de manera que si ya dibujé en una determinada coordenada no vuelva a tocar ese punto y dibuje el rectángulo completo en la coordenada de al lado.

Esto no me quedó claro.
Si usas 3 colores: color de fondo(por defecto) color de pixel apagado y color de pixel encendido, con un Picture1.Point podrías leer el color del pixel acutal y fijarte si corresponde al color de fondo. Si corresponde, dibujas sobre el mísmo. Sino dibujas en el pixel de al lado.

Si sólo usas dos colores: color de pixel apagado y color de pixel encendido(es decir que el color de fondo seria pixel apagado) y deseas que si apagas un pixel no se vuelva a modificar el mísmo sino el pixel de al lado, tendrás que recurrir a una matriz que almacene los pixels ya dibujados para poder comprobarlo.

Saludos.
Saludos.
Título: Re: Calcular código para GLCD
Publicado por: PalitroqueZ en 28 de Noviembre de 2006, 14:11:41
Te comento que en mi pc ambas funciones (Pset y rctangle) me dan el  mismo resultado, si pasas muy rápido el mouse se dibujaran puntos muy separados.

En realidad me estoy basando un poco en el programa fastlcd, supongamos que tienes una coordenda (usando rectangles)

X1,Y1=30,30
X2,Y2=32,32

si yo quisiera dibujar en esa misma coordenada, con una bandera se solucionaría:

if pixel =verde then
 pixel=negro
else
 pixel=verde

pero supongamos que se quiere dibujar el pixel vecino habría que determinar la posición del cursor para que el programa dibuje el pixel vecino y no quede entre 2 pixeles y así no dibuje un pixel entre 2 puntos ¿me explico?

volviendo al fastlcd (que me parece excelente programa) me parece que el picturebox grande lo dividieron en puntos cuadrados que dependen de zoom y otros parametros que el usuario puede cambiar, claro yo no me quiero complicar mucho, solo estoy averiguando como dividir un picturebox en 7x5 puntos cuadrados y que mediante las tecnicas para dibujar que ustedes explican creo que se puede usar también en este caso.

voy a utilizar la propiedad point que mencionas para agregarlo al código que estoy construyendo.

definición:
pixel=punto cuadrado, unidad mínima que forma parte del caracter y es activado al clicar sobre el picturebox

Salu2
Pedro
Título: Re: Calcular código para GLCD
Publicado por: BrunoF en 28 de Noviembre de 2006, 18:07:55
Hola PalitroqueZ.

Si miras el codigo fuente del ultimo programa que he hecho, podras ver por ejemplo en el evento mouse_down del Picturebox que el cálculo se hace exactamente como vos lo necesitas.
Yo he utilizado el método del resto(mod) para hacerlo.

Si necesitas hacerlo de 7x5(7 filas, 5 columnas) entonces te recomiendo que el ancho del PictureBox sea múltiplo de 5 y el alto múltiplo de 7. Y ambos en las mismas proporciones:
Ejemplo:
si decides un ancho del PictureBox=10(pixels) el alto del PictureBox debe ser =14(pixels)
si decides un ancho del PictureBox=15(pixels) el alto del PictureBox debe ser =21(pixels)
si decides un ancho del PictureBox=20(pixels) el alto del PictureBox debe ser =28(pixels)

y asi todos los múltipos posibles hasta encontrar el que más cercano se ajuste al tamaño que deseas que tenga el PictureBox.
De esta manera logras cuadrados y perfectamente escalados.

Saludos.
Título: Re: Calcular código para GLCD
Publicado por: PalitroqueZ en 29 de Noviembre de 2006, 12:47:46
¡Que barbaro! BrunoF, ¿de donde sacas esas formulas para manejar graficos? :)), muy cierto lo que mencionaste, cambié la resolución a 5 de ancho y 7 de alto y gracias a esa ecuación (la que usa el MOD) los puntos se ajustan a las dimensiones del picturebox.

Bueno ya sé como se hace, lo que voy averiguar ahora, es porque lo hace.

observa que al pintar un punto (en el adjunto de abajo), mientras el cursor se mantenga dentro del punto las coordenadas X1,Y1,X2,Y2 seran constantes, aunque las coordenadas del cursor varien, o sea, esa ecuación hace exactamente eso , de alguna manera, que no  se porque lo hace, mantiene las coordenadas constantes en un rectangulo y por eso es que cuando se está fuera de ese rectangulo, se pinta el punto vecino sin afectar al ya dibujado porque existe una coordenada para cada rectangulo y ningun punto puede tocar al siguiente.

Yo estuve buscando por allí en las paginas de código fuente de VB, todo lo relacionado a manejar graficos mediante estos controles, pero ya me dí cuenta que no revisé bien, jeje. Si tienes algún link donde hablen sobre programación gráfica, sería de ayuda.

Salu2
Pedro
Título: Re: Calcular código para GLCD
Publicado por: BrunoF en 29 de Noviembre de 2006, 18:20:41
Hola Pedro.
Pues no las saco de ningun lado...salen de mi cerebrito :P.

Analicé lo que necesitaba, plantié el problema, generé una ecuación que demostraba el comportamiento requerido, y la apliqué al VB.

Te explico cómo funciona.

Supongamos que tienes un PictureBox con un ancho de 20 pixels. Como tu tienes en realidad sólo 5 elementos verticales(columnas) por caracter del LCD, sabemos que cada pixel en realidad debe ocupar 4(20/5)pixels de ancho.

Plantiemos el problema en la recta numérica:

    Pixel 1                 Pixel 2                Pixel 3              Pixel 4               Pixel 5
!------------------!------------------!-------------------!--------------------!-------------------!------------->
0    1    2    3    4    5    6    7    8    9    10   11   12   13   14   15   16   17   18   19  20

Verás que la fórmula que realice es: X - X mod (Picture1.ScaleWidth / 5)

(Picture1.ScaleWidth/5) es una constante siempre y cuando no redimensiones el tamaño o cambies las escalas del PictureBox1.
En este caso sería 20/5= 4.

Entonces tenemos: X1= X- X mod 4
Si te fijas rápidamente, y comienzas a asignar valores a X podrás ver cómo se comporta la función rápidamente:

Si X = 0
X1 = 0 - 0 mod 4
X1 = 0 - 0
X1 = 0

Si X = 1
X1 = 1 - 1 mod 4
X1 = 1 - 1
X1 = 0

Si X = 2
X1 = 2 - 2 mod 4
X1 = 2 - 2
X1 = 0

Si X = 3
X1 = 3 - 3 mod 4
X1 = 3 - 3
X1 = 0

Si X = 4
X1 = 4 - 4 mod 4
X1 = 4 - 0
X1 = 4

Si X = 5
X1 = 5 - 5 mod 4
X1 = 5 - 1
X1 = 4

Si X = 6
X1 = 6 - 6 mod 4
X1 = 6 - 2
X1 = 4

Si X = 7
X1 = 7 - 7 mod 4
X1 = 7 - 3
X1 = 4

Si X = 8
X1 = 8 - 8 mod 4
X1 = 8 - 0
X1 = 8

Si X = 9
X1 = 9 - 9 mod 4
X1 = 9 - 1
X1 = 8

.....

Como puedes ver, X1 sólo adquiere 5 valores posibles: 0, 4, 8, 12 ó 16.
Justamente estos valores son las coordenadas X1 del rectángulo que dibujarás.

La coordenada X2 se hace exactamente igual, solamente que define hasta dónde dibujar el rectángulo. Y siempre será X1 + 4 en este caso.
En fórmulas:
Si X1 =  X - X mod (Picture1.ScaleWidth / 5)
Y X2 = X - X mod (Picture1.ScaleWidth / 5) + (Picture1.ScaleWidth / 5)

Reemplazando X1 en X2 obtenemos:

X2 = X1 + (Picture1.ScaleWidth / 5)

Sabiendo que (Picture1.ScaleWidth / 5) es una constante y vale 4 en este caso, nos queda:

X2= X1 + 4

Lo mísmo hice para el eje Y del PictureBox.


PD. Si utilizas un borde fixed single para el rectángulo(que lo estoy viendo en tu programa), debes añadirle 2 pixels más al ancho y alto del rectángulo, ya que el borde ocupa 1 pixel de cada lado del rectángulo del PictureBox.

Por lo tanto, si por ejemplo tenes un width = 20 y un height = 28, sumale dos a ambos quedando un width = 22 y un height = 30 para que las escalas sean perfectas. Estos son los valores correctos.

Saludos.
Título: Re: Calcular código para GLCD
Publicado por: PalitroqueZ en 30 de Noviembre de 2006, 10:58:32
Hola BrunoF, con la magistral explicación que das, ya tengo superclaro el porqué usaste la función MOD (yo tengo varios topicos del VB algo crudo y el de los graficos es uno de ellos)

nota: recién acabo de leer tu mensaje, así que tendré en cuenta el ajuste del picturebox.

te comento que hice unos avances anoche, referente al código del que me has ayudado bastante, y lo modifiqué un poco en la parte donde toma el valor del pixel, esta vez jugando con la escala del cual estoy conociendo poco a poco.


pues bien, usé el método point de la siguiente manera:

En el código original usabas una matriz para asignarle las coordenadas X e Y a point
y dependendiendo del resultado de éste (el número del color en ese punto) usabas la
variable binario para conmutar un "1" ó un "0".
Yo lo hice similar, solo que en For anidado y sabiendo que el tamaño del pixel es de 13,
entonces para la coordenada Y (que vendría siendo j) multiplico 7*13

Código: [Seleccionar]
For j = 0 To (7 * 13) Step 14   ' recorre 7 pixeles en pasos de 14
    For i = 0 To (5 * 13) Step 14   ' recorre 5 pixeles en pasos de 14
        If Picture1.Point(i, j) = vbBlack Then  ' pregunta si el pixel es negro
        Binario = Binario & 1
        Else                       
        Binario = Binario & 0 ' es el color del fondo
        End If
    Next i
Next j

Text1.Text = "int const caracter0_datos[8]={"

For i = 1 To 35 Step 5
    Text1.Text = Text1.Text & " " & Mid$(Binario, i, 5)
' toma dentro de la cadena binario y agrupa en nibbles de cada pixel
Next i

como el código que estoy haciendo no requiere de insertar imagenes, pienso que esta manera es sencilla e igual cumple el objetivo. Esto era la parte díficil, aunque todavía quisiera añadirle una cosita más y es lo siguiente:

como todo entorno para dibujar siempre existe la opción de activar la grilla ó cuadrícula, faltaría entonces la posibilidad de añadirle a ese picture box un grid para facilitarle al usuario la ubicación de los pixels.

Creo que eso se haría con el método line, voy a tratar de hacerla.


una observación que quisiera hacer es que cuando dejas apretado el botón izquierdo del mouse y te sales fuera del picture, parece que el evento mouse_move se sigue ejecutando, menos mal que no interfiere en los resultados porque ya se ajustaron las escalas para que no tome datos fuera del recuadro.


el adjunto con el avance que hice anoche :http://www.4shared.com/file/6693548/edb8ab42/crear_caracter_5x7.html (http://www.4shared.com/file/6693548/edb8ab42/crear_caracter_5x7.html)


Salu2 y gracias por tenerme paciencia al leer esto, jeje.
Pedro

Título: Re: Calcular código para GLCD
Publicado por: BrunoF en 30 de Noviembre de 2006, 18:12:54
Hola Pedro.

Si. El mouse_down sigue registrando el boton izquierdo presionado más alla de los límites del PictureBox ya que puedes utilizarlo para hacer un Drag & Drop a medida.

El código para generar la cuadrícula:

Código: [Seleccionar]
Private Sub Cuadricula()

Dim Lineas As Integer

      'Evitar dibujar linea en X=0     'Evitar dibujar linea en X=Picture1.Scalewidth      'se incrementa según el ancho de cada rectángulo
For Lineas = Picture1.ScaleWidth / 5 To Picture1.ScaleWidth - Picture1.ScaleWidth / 5 Step Picture1.ScaleWidth / 5
    Picture1.Line (Lineas, 0)-(Lineas, Picture1.ScaleHeight), vbWhite
Next

    'Evitar dibujar linea en Y=0         'Evitar dibujar linea en Y=Picture1.Scaleheight      'se incrementa según el alto de cada rectángulo
For Lineas = Picture1.ScaleHeight / 7 To Picture1.ScaleHeight - Picture1.ScaleHeight / 7 Step Picture1.ScaleHeight / 7
    Picture1.Line (0, Lineas)-(Picture1.ScaleWidth, Lineas), vbWhite
Next

End Sub

Ahora vas a tener que renegar con la propiedad AutoRedraw...Ya te vas a dar cuenta de lo que digo seguramente.
Saludos.
Título: Re: Calcular código para GLCD
Publicado por: PalitroqueZ en 04 de Diciembre de 2006, 12:47:16
Hola Bruno, aquí estoy de nuevo  :) voy poco a poco, para tener un entendimiento sobre las tecnicas de dibujo. Por ahí tengo un código tuyo sobre hacer graficas para aplicaciones de datos de entrada (por ej RS-232), pero eso lo tengo frenado por los momentos.

ya le agregué la grilla, con el código que posteaste y efecto que noté es que cuando coloco autoredraw=false es lo que explica la ayuda msdn, elimina el gráfico persistente, si minimizo la ventana desaparece todo lo pintado en el picturebox,

ahora cuando autoredraw=true no ví nada raro excepto que el método point falla al tomar los pixel negro y asumo que la linea me consume  una unidad de pixel (ya que scalemode=3), entonces modifiqué el for anidado para vaya en pasos de a 15 (sumando el extremo del rectangulo+linea) y también esta linea (es la que está dentro de los for anidado):

(Picture1.Point(i, j) = vbBlack) Or (Picture1.Point(i, j) = linea_gris)

para que si se consigue con la linea de la cuadricula, no tenga problemas en identificar que hay un rectangulo.

eso si, tuve que llamar al procedimiento cuadricula en casi todos lados para que no se me borre.

Voy a completar el picturebox para un caracter y luego creo una matriz de 8 controles para hacer el código completo

observación: para modificar los valores de scalewidth y scaleheight, no los pude hacer directamente porque la propiedad scalemode se cambia a user en vez de mantenerse a pixel entonces lo que hice fué cambiar los valores de height y width, como hablaste varios mensajes atrás.

aquí está otro adjunto (yo cada rato con mis adjuntos, :))) casi terminado para un carácter, entre las opciones estan:

- posibilidad de mostrar o desaparecer la cuadrícula, grilla o grid.
- posibilidad de abrir/guardar el caracter dibujado, + estado grilla + el lenguaje utilizado* + cantidad de caracteres en un archivo para uso posterior*

* esto si vá para el programa completo


estoy barajando la posibilidad de 5x10, pero ello implicaría modificar las escala del picturebox el cuál cambiaría varias funciones y bueno...  sigo pensando... además con 5x10 lo que se tienen son apenas 4 caracteres, pero eso quedaría para futuro.

bajar_ultimo_avance (http://www.4shared.com/file/6899748/bb8bfe38/uncaracter7x5.html)

Salu2
Pedro
Título: Re: Calcular código para GLCD
Publicado por: BrunoF en 04 de Diciembre de 2006, 16:46:38
¡Hola!

ya le agregué la grilla, con el código que posteaste y efecto que noté es que cuando coloco autoredraw=false es lo que explica la ayuda msdn, elimina el gráfico persistente, si minimizo la ventana desaparece todo lo pintado en el picturebox,

Si. Si minimizas la ventanas o pones otra ventana sobre la grilla verás que desaparece. Esto se debe a que los gráficos no quedan asociados al controlador gráfico del picturebox(hDC) y se pierden.

Dibujar con un autoredraw = false es más rápido que con un autoredraw=true debido a que obviamente no requiere ser registrado en el controlador gráfico del objeto.Por lo tanto es muy útil cuando no te interesa registrarlo ya que sabes que probablemente lo que muestras en pantalla variará constantemente(es decir que lo refrescarás tu cada determinada cantidad de tiempo).
Esto se usa por ejemplo: en los juegos de PC donde la pantalla es redibujada cada cierto tiempo constantemente por lo que no interesa que permanezca en pantalla.

ahora cuando autoredraw=true no ví nada raro excepto que el método point falla al tomar los pixel negro y asumo que la linea me consume  una unidad de pixel (ya que scalemode=3), entonces modifiqué el for anidado para vaya en pasos de a 15 (sumando el extremo del rectangulo+linea) y también esta linea (es la que está dentro de los for anidado):

(Picture1.Point(i, j) = vbBlack) Or (Picture1.Point(i, j) = linea_gris)

para que si se consigue con la linea de la cuadricula, no tenga problemas en identificar que hay un rectangulo.

Podrías haber optado por cambiar:

(Picture1.Point(i, j) = vbBlack)

por:

(Picture1.Point(i+2, j+2) = vbBlack)

Creo que eso hubiese bastado para asegurar que nunca coincida el dato a leer con las líneas de la grilla.

eso si, tuve que llamar al procedimiento cuadricula en casi todos lados para que no se me borre.

Desventajas del autoredraw=false :D

observación: para modificar los valores de scalewidth y scaleheight, no los pude hacer directamente porque la propiedad scalemode se cambia a user en vez de mantenerse a pixel entonces lo que hice fué cambiar los valores de height y width, como hablaste varios mensajes atrás.

Efectivamente, debes modificar el alto y ancho del control. Si modificas el ScaleWidth y/o ScaleHeight cambiarás automáticamente el ScaleMode perdiendo la relación idéntica entre la función Rectangle y el tamaño del PictureBox.

estoy barajando la posibilidad de 5x10, pero ello implicaría modificar las escala del picturebox el cuál cambiaría varias funciones y bueno...  sigo pensando... además con 5x10 lo que se tienen son apenas 4 caracteres, pero eso quedaría para futuro.

Bueno, yo también estaba enroscado con el tema del 5/10. El problema es que según leí en el datasheet del controlador Hitachi al poner el display en modo 5/10 el LCD trabaja con una sóla fila(sólo se usa la primera). Asi que realmente no sé hasta dónde puede ser de utilidad, pero supongo que puede servir para alguien. Nunca se sabe.

Saludos.