Escolar Documentos
Profissional Documentos
Cultura Documentos
Con este mtodo podemos dibujar Lneas y rectngulos en un objeto donde se permita utilizar dicho mtodo, como por ejemplo en los Formularios, los controles PictureBox, el objeto Printer. Los parmetros de Line son: El_Objeto.Line (X1, Y1) - ( X2, Y2), El_Color, BF
Donde El_Objeto es donde vamos a dibujar. Los primeros dos parmetros son las coordenadas para X e Y, luego el color de la lnea y por ltimo el parmetro BF al igual que el color, es un parmetro de tipo opcional, y aqu podemos pasar como valor: B o BF o ningn valor Si pasamos B, se dibujar un rectngulo sin relleno. Si pasamos BF el rectngulo tendr de relleno el color especificado en el parmetro Color. Si no pasamos nada se dibuja una lnea Ejemplos: Lo siguiente dibuja una lnea de color Azul en el formulario:
Como se ve en el ejemplo anterior, los valores que tomar y utilizar LINE para las coordenadas X e Y, sern los establecidos en el ScaleMode del Objeto donde dibujar, en este caso se coloc en Pixeles ( vbPixels )
Este otro dibuja una lnea horizontal y otra vertical a lo ancho y alto del Formulario, al mover el puntero del mouse. A la primer lnea se le aplica el color verde, a la la lnea horizontal el color Rojo, utilizando las constantes de color de vb. ( VbgGreen y VbRed )
Option Explicit Private Sub Form_MouseMove(Button As Integer, _ Shift As Integer, _ X As Single, _ Y As Single) ' Limpia el Form Cls 'Dibuja la lnea vertical Line (X, ScaleTop)-(X, ScaleHeight), vbGreen 'Dibuja la lnea Horizontal Line (Me.ScaleLeft, Y)-(Me.ScaleWidth, Y), vbRed End Sub
En este otro ejemplo, se dibuja en el formulario, una cantidad x de lineas con colores aleatorios, utilizando la funcin Rnd de visual basic para generar el color aleatorio y para la cantidad de lineas :
Dim Color As Long ' si el form est minimizado sale If Form1.WindowState = vbMinimized Then Exit Sub EndIf ' limpia el formulario Me.Cls
' Int(Rnd * 50) + 1, es la cantidad de lineas For x = 0 To Int(Rnd * 50) + 1 DoEvents ' valores x e y para la linea actual x1 = Int(Rnd * 101) x2 = Int(Rnd * 101) y1 = Int(Rnd * 101) y2 = Int(Rnd * 101) ' color aleatorio de 1 a 15 que luego se usa con Qbcolor Color = Int(Rnd * 15) ' dibuja la linea Form1.Line (x1, y1)-(x2, y2), QBColor(Color) Form1.Line (x1, y2)-(x2, y1), QBColor(Color) Form1.Line (x2, y1)-(x1, y2), QBColor(Color) Form1.Line (y1, y2)-(x1, x2), QBColor(Color) Next x End Sub
Este cdigo dibuja lineas, como si fuese un lapiz, es deicir al mantener presionado el mouse en el formulario:
Option Explicit Dim Flag As Boolean Private Sub Form_MouseDown(Button As Integer, Shift As Integer, _ X As Single, Y As Single) 'Establece el CurrentX y el CurrentY CurrentX = X CurrentY = Y Flag = True End Sub Private Sub Form_MouseMove(Button As Integer, Shift As Integer, _ X As Single, Y As Single) If Flag = False Then Exit Sub End If 'Dibuja la linea Line -(X, Y) End Sub Private Sub Form_MouseUp(Button As Integer, Shift As Integer, _ X As Single, Y As Single) Flag = False
End Sub
Lo siguiente dibuja un rectngulo sin relleno de color Rojo, pasndole la B como parmetro al mtodo Line
Cuando se dibujan rectngulos, es decir se utiliza B o BF, X1 , Y1, X2 e Y2 sera equivalente a : El_Objeto.Line (Izquierda, Arriba) - (Ancho, Alto).
El siguiente ejemplo dibuja una lnea vertical de color verde una al lado de la otra en todo el ancho del formulario, en un bucle:
Private Sub Form_Paint() Me.ScaleMode = vbPixels For i = 0 To Me.ScaleWidth Step 10 Line (i, 10)-(i, Me.ScaleHeight - 10), vbGreen Next End Sub
PropiedadCurrentX y CurrentY
CurrentX devuelve o establece las coordenadas horizontales para el siguiente mtodo de dibujo. CurrentY devuelve o establece las coordenadas verticales para el siguiente mtodo de dibujo, en este caso para el mtodo Line. Lo siguiente, dibuja al presionar un Command1, un rectngulo de 25 pixeles de ancho por 50 pixeles de alto. Y la posicin izquierda y la posicin superior (x1 e y1), es decir el CurrentX y el CurrentY, se puede ver como no cambian su valor, y se mantienen igual. Es decir, la primera ves que se presiona para dibujar el primer rectngulo, Currentx y Currenty valen 0. Luego la segunda ves, Currentx tiene el valor 25 y Currenty el valor 50. si se sigue
presionando el Command1, mientras no se cambie explicitamente el valor , currentx y Currenty mantendrn dichos valores, x2 e y2.
Private Sub Command1_Click() Me.Line (CurrentX, CurrentY)-(25, 50), vbRed, B MsgBox "Pos x: " &CurrentX MsgBox "Pos y: " &CurrentY End Sub Private Sub Form_Load() Me.ScaleMode = vbPixels End Sub
Siguiendo el ejemplo anterior, si quisieramos que las coordenadas x2 e y2 sean relativas a x1 e y1, podemos utilizar la palabra reservada Step. Este cdigo es exactamente igual al anterior, con la diferencia de que se utiliza Step para especificar el Currentx y el Currenty para que x2 e y2 sea relativo a x1 e y1, el resultado sera esto:
Este es igual al anterior pero la posicin Superior (y1) es fija, y lo que se desplaza es la posicin horizontal, es decir el CurrentX, y cada ves que se presione el Command1 , el Currentx (la posicin izq ) se incrementar de 25 en 25 pixeles.
Private Sub Command1_Click() Me.Line (CurrentX, 20)-Step(25, 50), vbRed, B End Sub Private Sub Form_Load() Me.ScaleMode = vbPixels End Sub
Este otro ejemplo, dibuja un cuadrado uno al lado del otro , a lo ancho del formulario, el rectngulo es de 10 pixeles de ancho por 10 pixeles de alto, y cada cuadrado est separado por 5 pixeles ente uno y otro.
Private Sub Form_Load() Dim Izquierda As Single Me.ScaleMode = vbPixels Me.AutoRedraw = True For Izquierda = 0 To Me.ScaleWidth Step 15 Me.Line (Izquierda, 10)-Step(10, 10), vbBlue, B Next End Sub
Este otro dibuja rectngulos de 25 x 25 pixeles uno al lado del otro, en todo el formulario mediante dos bucles For. El primer bucle es para los rectngulos horizontales y el otro para los verticales.
Private Sub Command1_Click() Me.Cls For Horizontal = 0 To ScaleWidth Step 30 For vertical = 0 To ScaleHeight Step 30 Line (Horizontal, vertical)-Step(25, 25), &H808080, B Next Next End Sub Private Sub Form_Load() Me.ScaleMode = vbPixels End Sub
Dibujar cuadrcula
Lo siguiente dibuja una cuadracula mediante el mtodo Line en el objeto indicado, puede ser un picturebox o formulario, indicando la cantidad de cuadros para la forma horizontal y la cantidad para el vertical.
Next i End Sub Private Sub Form_Load() With Me .BackColor = vbWhite .ForeColor = vbBlue .FontSize = 12 .AutoRedraw = True End With Call Dibujar_cuadricula(Me, 25, 25, vbBlue, vbRed) 'CallDibujar_cuadricula(Me, 5, 10, vbBlue, vbRed) 'CallDibujar_cuadricula(Me, 25, 50, vbBlue, vbRed) End Sub
Propiedad DrawWidth
Para establecer el grosor de la lnea de dibujo se utiliza la propiedad DrawWidth. Este ejemplo dibuja lneas una al lado de la otra, separadas por 20 pixeles, mediante un bucle y va incrementando el DrawWidth en 1 en cada pasada. El dibujo se realiza en un control PictureBox llamado Picture1
Private Sub Command1_Click() Picture1.Cls Picture1.ScaleMode = vbPixels For i = 0 To ScaleWidth Step 25 Picture1.Line (i, 10)-(i, Picture1.ScaleHeight - 10), vbGreen Picture1.DrawWidth = Picture1.DrawWidth + 1 Next Picture1.DrawWidth = 1 End Sub
Este otro ejemplo dibuja un borde y un degradado en un formulario utilizando el mtodo Line, como muestra la siguiente captura:
Para crear le ejemlo colocar la propiedad BorderStyle del formulario en 0 - None, y pegar el siguiente cdigo:
Private Sub Form_Load() With Me 'Algunas propiedades del formulario .AutoRedraw = True
Private Sub Form_Resize() 'Esto dibuja el degradado al formulario Degradado Me 'Esto dibuja el borde al formulario Call Dibujar_Borde End Sub Sub Dibujar_Borde() Me.DrawStyle = 0 Me.DrawWidth = 10 Line (0, 0)-(ScaleWidth - 1, ScaleHeight - 1), &HFFC0C0, B End Sub Sub Degradado(vForm As Form) Dim intContador As Integer vForm.DrawStyle = vbInsideSolid vForm.DrawWidth = 2 'vForm.ScaleHeight = 256 For intContador = 0 To 255 vForm.Line (0, intContador)-(Screen.Width, _ intContador - 1), _ RGB(0, 0, 255 - intContador), B Next Me.CurrentX = 20 Me.CurrentY = 20 Me.Print " Ejemplo para dibujar un borde a un formulario " End Sub
2 - Mtodo Circle
El mtodo Circle permite dibujar un crculo, una elipse o un arco sobre un objeto. La sintaxis del mtodo es la siguiente: EL_Objeto.Circle (Step As Integer, X As Single, Y As Single, Radius As Single, Color As Long, Start As Single, End As Single, Aspect As Single) Los valores para X e Y especifican el punto donde estar el centro del crculo a dibujar. Radius es el valor del radio del mismo. El parmetro es obligatorio. Color: Valor que indica el color que tendr el crculo o elipse para su contorno. Se puede pasar cualquier valor admitido en visual basic, por ejemplo un Long, un valor Rgbetc.. Los parmetros Start y End son opcionales , y se utilizan para dibujar parte de una elipse o crculo Por ltimo el parmetro Aspect, se utiliza para definir el aspecto del crculo. Este valor es opcional. Ver ejemplos mas abajo.
El siguiente ejemplo crea un crculo en el centro de un control PictureBox, con un radio de 50 pixeles.
Private Sub Command1_Click() Picture1.Cls With Picture1 Picture1.Circle (.ScaleWidth / 2, .ScaleHeight / 2), _ 50, _ vbBlue End With End Sub Private Sub Form_Load()
Este ejemplo dibuja un crculo con un radio aleatorio entre 10 y 100 pixeles, al hacer click en el formulario, es decir el centro del crculo ( x1 e y1 ), son los valores x e y del evento MouseDown del Form:
Private Sub Form_Load() ScaleMode = vbPixels Me.DrawWidth = 2 End Sub Private Sub Form_MouseDown(Button As Integer, Shift As Integer, _ X As Single, Y As Single) Circle (X, Y), Int((100 - 10 + 1) * Rnd + 10), vbRed End Sub
Private Sub Combo1_Click() Me.FillStyle = Combo1.ListIndex End Sub Private Sub Command1_Click() Me.Cls End Sub Private Sub Form_Load() ScaleMode = vbPixels 'Grosor de la lnea Me.DrawWidth = 2 'Opciones de With Combo1 .AddItem .AddItem .AddItem .AddItem .AddItem .AddItem .AddItem .AddItem End With estilo de relleno " " " " " " " " 0 1 2 3 4 5 6 7 Solido " Transparente " Linea Horizontal " Linea Vertical " Diagonal Arriba " Diagonal Abajo " Cross " Diagonal Cross "
Command1.Caption = "Limpiar" End Sub Private Sub Form_MouseDown(Button As Integer, Shift As Integer, _ X As Single, Y As Single) 'color de relleno aleatorio
Me.FillColor = RGB(Int(255 * Rnd), Int(255 * Rnd), Int(255 * Rnd)) 'Dibuja el crculo Circle (X, Y), Int((50 - 10 + 1) * Rnd + 10), _ RGB(Int(255 * Rnd), Int(255 * Rnd), Int(255 * Rnd)) End Sub
Dibujar Elipses
Para dibujar Elipses se debe especificar en el parmetro Aspecto los siguientes valores. Por ejemplo si pasamos un 1, el crculo ser una circunferencia perfecta, si pasamos 0.5 , el radio horizontal del mismo ser el doble que el radio vertical, si pasamos un 2 lo contrario.
Private Sub Form_Load() ScaleMode = vbPixels 'Grosor de la linea Me.DrawWidth = 2 For i = 0.1 To 2.1 Step 0.1 Combo1.AddItem i Next Combo1 = Combo1.List(0)
End Sub Private Sub Form_MouseDown(Button As Integer, Shift As Integer, _ X As Single, Y As Single) Circle (X, Y), Int((50 - 10 + 1) * Rnd + 10), _ RGB(Int(255 * Rnd), Int(255 * Rnd), Int(255 * Rnd)), , , CSng(Combo1) End Sub
Private Sub Form_Load() 'Modo de escala en pixeles Picture2.ScaleMode = vbPixels Picture1.ScaleMode = vbPixels 'Grosor del punto Picture1.DrawWidth = 3 End Sub Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, _ X As Single, Y As Single) Picture1.Cls ' Establece el color del Picture2 mediante el mtodo Point Picture2.BackColor = Picture1.Point(X, Y) ' Dibuja el punto Picture1.PSet (X, Y), vbGreen 'Valor Hexadecimal del color Me.Caption = "Valor del color: " &Hex(Picture2.BackColor) End Sub
Nota: la forma y variaciones en las que se dibuja el punto u otras figuras mediante los mtodos grficos, dependen de las propiedades DrawStyle y DrawMode del objeto.
Este es otro ejemplo que utiliza Pset para dibujar un punto al presionar en el formulario, tomando como valores el x e y del evento MouseDown del Form, luego se dibuja una lnea desde un punto hacia el otro punto mediante el mtodo Line
Cdigo fuente
Dim X1 As Single Dim Y1 As Single Private Sub Form_Load() AutoRedraw = True End Sub Private Sub Form_MouseDown(Button As Integer, _ Shift As Integer, _ X As Single, _ Y As Single) DrawWidth = 10 'Dibuja el punto con Psetpasandole PSet (X, Y), vbBlack If X1 <> 0 And Y1 <> 0 Then DrawWidth = 3 'Dibuja la linea Line (X1, Y1)-(X, Y), vbWhite End If X1 = X Y1 = Y End Sub el x e y donde se hizo click
Este otro ejemplo dibuja puntos en el formulario en forma aleatoria Colocarle al formulario la propiedad WindowState en Maximized y tambien agregar un control CommandButton Cdigo fuente en el formulario
Dim Tiempo As Long Private Sub Command1_Click()
' dibuja los puntos en el formulario CallDibujar_Puntos(vbBlue) ' dibuja los puntos en el formulario Call Dibujar_Puntos(vbButtonFace) End End Sub FunctionDibujar_Puntos(Color As Long) DimPosicion_X DimPosicion_Y Tiempo = Timer + 5 While Tiempo >= Timer ' valores para la posicin x e y Posicion_X = Rnd * ScaleWidth Posicion_Y = Rnd * ScaleHeight ' Dibuja el punto en la coordenada y con el color indicado con Pset PSet (Posicion_X, Posicion_Y), Color DoEvents Wend End Function Private Sub Form_Load() ' modo de escala en pixeles y grosor del lapiz para el formulario ScaleMode = 5 DrawWidth = 10 End Sub
4 - Funcin QBColor:
Definicin de la funcin QBColor de Visual basic: Esta funcin devuelve el cdigo de color RGB de un nmero de color especificado de una lista de colores estndar predefinidos Es decir, esta funcin tiene como parmetro, un nmero entre el 0 y 15, es decir 16 valores posibles para retornar un color especifico. El siguiente ejemplo, muestra el uso de esta funcin. Lo que hace es recorer en un bucle, desde el 0 hasta el 15, y le cambia el BackColor a un arreglo de controles Label. Colocar una matriz de Label1. Label1 (0), Label1(1) .... hasta el Label1(15)
Private Sub Form_Load() Me.Caption = " Ejemlpo de la funcin QBColor" Dim i As Integer For i = 0 To 15 ' Asigna el color devuelto por la funcin QBColor _ al color de fondo del Label Label1(i).BackColor = QBColor(i) ' Asigna el caption Label1(i).Caption = " Valor de QBColor: >> " & i Next i End Sub
1 - Funcin LoadPicture :
Esta funcin se utiliza para cargar una imagen o grfico en un control Form, PictureBox o Image. Esta funcin requiere como parmetro obligatorio, el path del archivo de imagen a cargar en el objeto. Por ejemplo lo siguiente carga un grfico en un control PictureBox:
Picture1.Picture = LoadPicture("c:\archivo.bmp")
Lo mismo sera para un control Image o Formulario, o cualquier objeto que soporte la carga de un archivo de imagen de formato compatible a las que soporta Visual basic ( BMP, JPG, GIF, WMF, algunos ICO etc..) , no as los archivos PNG o TIFF por ejemplo, ya para estos ltimos habra que utilizar el Api de windows o algn componente externo, para poder leerlos. Nota: En este enlace hay un Mdulo de clase que permite visualizar grficos e imgenes de tipo PNG
Image1.Picture = LoadPicture("c:\archivo.bmp")
Tambin hay otras propiedades de algunos controles, que requieren por lo general el uso de esta funcin para cargar un archivo grfico a dicha propiedad, como es el caso de: La propiedad Icon de los formularios. La propiedad MouseIcon para establecer un icono personalizado al mouse. La propiedad DragIcon que permite establecer el icono que se va a mostrar como puntero en una operacin de arrastrar y colocar, y algunas otras. lo siguiente establece un archivo de cono al puntero del Mouse para el formulario:
Adems de los controles, se pueden cargar archivos con la funcin LoadPicture, por ejemplo en los siguientes tipos de variables: IPictureDisp, Picture stdPicture. Aclarar que al cargar un grfico en la variable, se debe establecer con la instruccin Set, por ejemplo:
Lo anterior carga en el la variable " La_Imagen " el archivo grfico, y luego se puede pasar dicha variable a un objeto que tenga la propiedad Picture, en este caso se paso un control Picture1.
Para eliminar de la memoria la variable, se utiliza el valor Nothing tambin con la instruccin Set , por ejemplo:
If Not La_Imagen Is Nothing Then 'Descarga la variable de la memoria Set La_Imagen = Nothing End If
Capturar el error 53. Cuando cargamos un archivo con la funcin, y el path del archivo no existe, es decir que no se encuentra el fichero, se produce el error 53.
If Err.Number = 53 Then MsgBox "No se puede cargar el archivo, verifique la ruta", vbCritical EndIf
2 - Mtodo SavePicture:
Este mtodo lo que hace es guarda en un archivo en disco, un grfico cargado en un control Form, PictureBox o un control Image. Este posee dos parmetros, uno que especifica el Objeto Picture, y otro la ruta del archivo a generar Savepicture Picture As IPictureDisp,FileName as String
Su uso es muy simple. A continuacin una serie de ejemplos: Esto lo que es cargar en un control Image, un grfico del disco, y luego mediante otro botn, utilizando un control CommonDialog, guarda el archivo cargado en el Image en la ruta especificada: Colocar un Control CommonDialog1, un control Image1 y dos controles CommandButton, Command1 y Command2:
Cdigo en el formulario:
'Botn que carga elel archivo de imagen en el control Private Sub Command1_Click() On Error GoTo errSub With CommonDialog1 .DialogTitle = "Seleccionar un archivo" .Filter = "Archivos BMP|*.bmp|Archivos JPG|*.bmp|Todos|*.*" .ShowOpen If .FileName = "" Then Exit Sub Image1.Picture = LoadPicture(.FileName) End With Exit Sub 'Error errSub: If Err.Number = 53 Then MsgBox "No se puede cargar dicho archivo, verifique la ruta", vbCritical EndIf End Sub 'Botn que guarda el contenido del control Image en un nuevo archivo Private Sub Command2_Click() With CommonDialog1 .DialogTitle = "Guardar el archivo" Image
.Filter = "Todos los Archivos|*.*" .ShowSave If .FileName = "" Then MsgBox "No se especific ningn nombre", vbCritical End If If Image1.Picture <> 0 Then SavePicture Image1.Picture, .FileName Else MsgBox "No hay un grfico cargado para poder guardar", vbExclamation End If End With End Sub Private Sub Form_Load() Command1.Caption = "Abrir" Command2.Caption = "Guardar" End Sub
Este otro ejemplo, guarda el contenido del portapapeles de windows, en un nuevo archivo de tipo BMP. Nota, debe haber una imagen vlida en el ClipBoard, si no dar error. Para probar, se puede copiar al portapapeles la imagen de la pantalla presionando la tecla PrintScreen, y luego ejecutar el siguiente cdigo para generar el archivo
IfClipboard.GetFormat(vbCFBitmap) = True Then 'Guarda la imagen SavePictureClipboard.GetData(vbCFBitmap), "c:\Archivo.BMP" Else 'Error: no coincide el Formato MsgBox "La imagen del portapales no es vlida", vbCritical, "No se pudo guardar" EndIf
El_Objeto: Es como se coment, donde vamos a dibujar el grfico, puede ser un form, un picture o en el objeto Printer La_Imagen Este parmetro es de tipo StdPicture, y es la imagen a dibujar. Los formatos pueden ser un archivo Gif, Bmp, Jpg, Wmf, Dib, Ico . Esta imagen puede estar cargada en un control, por ejemplo en un Picture, Form, Image, o tambin en una variable de tipo StdPicture, IpictureDisp o de tipo Picture. Ver mas adelante un ejemplo de esto ltimo de como utilizar grficos cargados en variables X1 e y1: Son las coordenadas de destino, es decir la posicin Izquierda y Arriba ( Left - Top ), donde se presentar la imagen a dibujar en el objeto destino Ancho1 y Alto1: Estos parmetros especifican el ancho y alto que tendr la imagen a dibujar. Estos parmetros son opcionales, y si se omiten, la imagen se dibujar en el objeto con las dimensiones que tenga. x2 e y2 :
Son las coordenadas a tomar en la imagen, es decir es la zona de recorte de la misma. Con estos parmetros podemos copiar un trozo del grfico, si se omite, ya que es opcional, se toma la imagen completa. Ancho1 y Ancho2: Al igual que x2 e y2 son opcionales, y determinan el ancho y alto de la imagen en el objeto destino
Ejemplos:
Cargar en un control PictureBox un grfico. Luego al presionar un command1, se copiar la imagen del Picture en el formulario.
Private Sub Command1_Click() 'Copia el grfico en el formulario Me.PaintPicture Picture1.Picture, 0, 0 End Sub
Como se ve en el cdigo, indicamos que copie la imagen del picture1 en el formulario, es decir en el primer parmetro le pasamos la propiedad Picture del control. Luego, se indica la posicin izquierda y Arriba ( Left - Top ) en el objeto destino, en este caso el Form. Los dems parmetros son opcionales, y como en este caso se omitieron, la imagen se copiar con las dimensiones que tenga, es decir una copia exacta. Si en cambio en ves de especificar 0 para x y 0 para y, le especificaramos 500, y 500, el resultado sera el siguiente:
Importante. Los valores para las dimensiones y posiciones del mtodo PaintPicture, ya sea para las coordenadas x1, y1, ancho1, alto1, ancho2 y alto2, depende de la propiedad ScaleMode del objeto destino. En el ejemplo anterior, se asume que se copi en la posicin izquierda y Top, usando Twips como medida, por lo que si haces la prueba y cambias la propiedad ScaleMode del formulario, por ejemplo a vbPixels, la imagen se copiar tomando dicho modo de escala, es decir en pixeles. Lo mas comn, es trabajar con pixeles, es mas cmodo.
Ejemplo 2:
Este ejemplo es igual al anterior, pero se utilizarn cuatro controles TextBox para indicar la posicin x1, y1, ancho1 y ancho2.
Nota: el cdigo no tiene una rutina de error para comprobar que algunos valores sean correctos, es decir si por ejemplo colocamos un valor que no sea numrico, dar error. tambin se producir un error en tiempo de ejecucin , si pasamos a PaintPicture, en Ancho1 y Alto1, el valor 0 Cdigo fuente en el formulario:
Private Sub Command1_Click() 'Limpia el contenido del formulario Me.Cls 'Copia el grfico en el formulario con los valores Me.PaintPicture Picture1.Picture, CSng(Text1), _ CSng(Text2), _ CSng(Text3), _ CSng(Text4) End Sub Private Sub Form_Load() ' Modo de escala del formulario en pixeles Me.ScaleMode = vbPixels End Sub
Ejemplo 3
Lo siguiente copia el grfico cargado en un PictureBox llamado Pic_Origen, a otro PictureBox llamado Pic_Destino.
Private Sub Command1_Click() 'Copia el grfico con el ancho y alto que tenga _ Pic_Destino Pic_Destino.PaintPicture Pic_Origen, 0, 0, _ Pic_Destino.ScaleWidth, _ Pic_Destino.ScaleHeight End Sub
Como se ve, en los parmetros que especifican el alto y ancho, se pas las dimensiones que tenga Pic_destino, ( ScaleWidth y ScaleHeight )
Para dibujar una imagen centrada, por ejemplo en un formulario, podemos cargar la misma en una variable, como se coment antes, que sea de tipo Picture, IpictureDisp o StdPicture, y luego pasarla como parmetro a PaintPicture, y en los parmetros X1 e Y1 ( posicin Left y Top ) lo siguiente :
'Variable de tipo Picture para cargar mediante LoadPicture en _ tiempo de ejecucin un grfico DimUna_Imagen As Picture Private Sub Command1_Click() Dim Pos_x As Single DimPos_y As Single 'Limpia el formulario Me.Cls 'Carga en la variable la imagen Set Una_Imagen = LoadPicture("c:\bart.jpg") ' Obtiene la posicin x e y para centrar la imagen Pos_x = (Me.ScaleWidth - ScaleX(Una_Imagen.Width, vbHimetric, vbPixels)) / 2 Pos_y = (Me.ScaleHeight - ScaleY(Una_Imagen.Height, vbHimetric, vbPixels)) / 2 ' Dibuja el grfico centrado en el formulario Me.PaintPictureUna_Imagen, Pos_x, Pos_y End Sub Private Sub Form_Load() ' Modo de escala en pixeles Me.ScaleMode = vbPixels Me.Caption = " Dibujar imagen centrada " End Sub Private Sub Form_Unload(Cancel As Integer) 'Elimina la imagen/Variable If Not Una_Imagen Is Nothing Then Set Una_Imagen = Nothing End Sub
En el cdigo anterior, se declara una variable de tipo Picture para almacenar el grfico mediante la funcin LoadPicture. Pero como es una variable de objeto, se debe utilizar la palabra clave Set. Tambin como se coment, el grfico a cargar debe ser un formato de imagen de los que soporta visual basic: bmp, gif, jpg etc... , no asi los Png o los tif por decir algunos. Luego en Pos_x y Pos_y se calcula el centro del formulario, restando al ancho del form, el ancho de la imagen dividido por 2 Nota: La propiedad Width y Height de la imagen, no devuelve un valor en pixeles, si no en una medida llamada Himetric. Por ese motivo se utiliza la funcin Scalex y Scaley para convertir el valor de dicha escala a pixeles, ya que en el FormLoad se estableci el modo de escala del Formulario, que en este caso es donde se va a dibujar, en vbPixels. Aclaro que no se si es la nica forma de convertir esto, pero al menos es la que conozco.
Para el ejemplo colocar un Picture llamado Pic_Origen y cargarle un grfico. Agregar otro PictureBox llamado Pic_Destino. Tambin Cuatro TextBox en un arreglo: Text1(0), Text1(1), Text1(2) y Text1(3), para la posicin x, posicin y, para el ancho ancho y alto respectivamente. Estos valores sern en pixeles, y esos mismos valores se utilizarn para la funcin PaintPicture para dibujar dicha rea
'Dibuja la porcin de imagen en Pic_Destino Pic_Destino.PaintPicture Pic_Origen.Picture, 0, 0, , , x, _ y, _ ancho, _ alto End Sub Private Sub Form_Load() ' Escala en pixeles para los dos Picture Box Pic_Destino.ScaleMode = vbPixels Pic_Origen.ScaleMode = vbPixels 'Para que al dibujar con Line y PaintPicture mantenga la imagen Pic_Origen.AutoRedraw = True Pic_Destino.AutoRedraw = True 'algunos Text1(0) Text1(1) Text1(2) Text1(3) End Sub valores iniciales = 10 = 10 = 50 = 50
Private Sub Text1_Change(Index As Integer) On Local Error Resume Next 'Llama a la sub que dibuja con PaintPicture Call Dibujar_Imagen(CSng(Text1(0)), _ CSng(Text1(1)), _ CSng(Text1(2)), _ CSng(Text1(3))) End Sub
El ejemplo anterior, al colocar valores en los TextBox para los ejes x e y, el ancho y alto, se dibuja mediante el mtodo Line el recuadro ( rea ) en el picture origen, luego se le pasan esos mismos valores a la funcin PaintPicture que dibuja esa porcin de imagen en el otro PictureBox
Colocar dos PictureBox y un control shape. A un Picture renombrarlo a Pic_Origen y cargarle un grfico. Al otro picture renombrarlo a Pic_destino que es donde se copiar la porcin de la imagen. El shape dejarlo con el nombre Shape1
Option Explicit Dim Ancho As Single Dim Alto As Single Private Sub Form_Load() ' Algunas propiedades para el shape With Shape1 .Width = 500
.Height = 500 .BorderWidth = 2 .BorderColor = vbRed 'Coloca el shape dentro de Pic_Origen Set .Container = Pic_Origen End With Ancho = Shape1.Width Alto = Shape1.Height End Sub Private Sub Pic_Origen_MouseMove(Button As Integer, Shift As Integer, _ X As Single, Y As Single) ' Mueve el Shape en el centro del puntero del mouse Shape1.Move X - Ancho / 2, Y - Alto / 2 'Dibuja en Pic_Destino Pic_Destino.PaintPicturePic_Origen, 0, 0, _ Pic_Destino.ScaleWidth, Pic_Destino.ScaleHeight, _ (X - Ancho / 2), (Y - Alto / 2), Ancho, Alto End Sub