Вы находитесь на странице: 1из 3

Para tal labor lo mejor es emplear una clase propia que te permita realizar dichos controles de diseo sobre

el formulario. Tengo por aqu un ejemplillo que te puede venir bien para que veas cmo se contruye, los mtodos empleados, y sobre todo, la lgica ylas libreras que lo mueven. Te anticipo que empleo GDI+, apoyndose en un doble bufer para evitar cierto molesto parpadeo que intercede sobre las imgenes. Empecemos pues ok?... Crate una nueva "Aplicacin para windows" y asgnale una clase nueva. En este ejemplo la he llamado "Grafico". Ahora, antes de continuar, un poco ms de teora... que cunto ms aprendas acerca de cmo se mueve por dentro este lenguaje, ms lejos podrs llegar y con mayor efectividad . Lo normal de VB.NET cuando se trata de dibujar sobre un control (recordemos que un formulario es un tipo de control ), dibujamos directamente sobre su rea empleando el objeto graphics del mismo control en cuestin, invocando a su mtodo createGraphics. As acta VB.NET, pero nosotros NO vamos a hacerlo as... por qu? porque se trata de hacerlo mejor, y es que este mtodo contempla el error que te mencion antes, provoca parpadeos en el dibujo. As pues nuestra tcnica de doble bufer dibujar sobre un objeto Bitmap (no sobre el control formulario, pues), y lo har a partir de un segundo objeto graphics creado a partir de la misma imagen. Cuando ya est dibujada sobre el bufer, lo pasamos al objeto graphics. Para ello emplearemos el mtodo "fromImage" de la clase graphics. Bueno... igual si no ests muy familiarizado con esta jerga todo esto te "pierde" un poco, pero ya vers como a medida que veas el cdigo lo vas entendiendo, y ese galimatas va tomando sentido .

Nos quedamos en la creacin de la clase "grafico", pues... Vamos all y creamos las siguiente vars privadas: Dim Grafico As Graphics Dim ImgBuffer As Bitmap Dim GraficoBuffer As Graphics ' Almacena el color del control donde dibujaremos (que puede ser el form, como antes dije) porqu? Porque cuando dibujemos algo 'nuevo, podremos borrar la imagen habida ponindola del color de ese control ;) Dim ColorFondo As Color Ahora tenemos que tener claro que el primer punto es enviar el control sobre el que pensamos dibujar, y eso debemos envirselo a un constructor. A partir del mismo, creamos el objeto graphics (declarado en la clase anterior), un bitmap de su tamao (idem) y un grfico surgido de ese bitmap. Igualmente almacenamos el color que tenga elcontrol en la variable ColorFondo. As mismo nos creamos ya el mtodo que se ocupar de borrar el dibujo como dijimos atnes, metindole a la imagen el color del control . Public Sub New(ByVal controlADibujar As Control) Grafico = controlADibujar.CreateGraphics ImgBuffer = New Bitmap(controlADibujar.Width, controlADibujar.Height) GraficoBuffer = Graphics.FromImage(ImgBuffer) ColorFondo = controlADibujar.BackColor End Sub Public Sub Borrar() GraficoBuffer.Clear(ColorFondo)

End Sub A partir de aqu te muestro el cdigo para dibujar una imagen que tengas. Aadirle la clase que t solicitas para dibujar un rectngulo o semejante no creo que te cueste mucho tras ver estos ejemplos de clases , aunque de todas formas te lo he puesto tambin ms abajo. Vers que hay varias funciones que transmiten distintas funcionalidades a nuestro "programilla":

'Dibuja la imagen dada en su tamao original Public Overloads Sub DibujarImagen(ByVal x As Integer, ByVal y As Integer, ByVal fichImagen As String) Dim imagen As Bitmap = New Bitmap(fichImagen) GraficoBuffer.DrawImage(imagen, x, y) End Sub 'Dibuja la imagen dada en un tamao determinado Public Overloads Sub DibujarImagen(ByVal x As Integer, ByVal y As Integer, ByVal ancho As Integer, ByVal alto As Integer, ByVal fichImagen As String) Dim imagen As Bitmap = New Bitmap(fichImagen) GraficoBuffer.DrawImage(imagen, x, y, ancho, alto) End Sub 'Esta clase dibuja un crculo... fjate cmo la hago y sobre todo los mtodos a los que llamo para tal labor Public Sub DibujarCirculo(ByVal x As Integer, ByVal y As Integer, ByVal radio As Integer, ByVal color As Color) Dim brocha As New SolidBrush(color) Dim lapiz As New Pen(brocha) GraficoBuffer.DrawEllipse(lapiz, x, y, radio, radio) GraficoBuffer.FillEllipse(brocha, x, y, radio, radio) End Sub 'Bueno este mtodo te resultar muy til para tu duda :D Public Overloads Sub DibujarRectangulo(ByVal x As Integer, ByVal y As Integer, ByVal ancho As Integer, ByVal alto As Integer, ByVal color As Color) Dim brocha As New SolidBrush(color) GraficoBuffer.FillRectangle(brocha, x, y, ancho, alto) End Sub 'Qu diferencia a esta funcin de la anterior? Se le pasan dos colores, y es que uno es el color de fondo y otro el del marco ;) Public Overloads Sub DibujarRectangulo(ByVal x As Integer, ByVal y As Integer, ByVal ancho As Integer, ByVal alto As Integer, ByVal color1 As Color, ByVal color2 As Color) 'Dim brocha As New SolidBrush(color) Dim rectangulo As New Rectangle(x, y, ancho, alto)

Dim brocha As New Drawing2D.LinearGradientBrush(rectangulo, color1, color2, Drawing2D.LinearGradientMode.Vertical) GraficoBuffer.FillRectangle(brocha, rectangulo) End Sub 'Nunca una lnea fue tan sencilla de mostrar :D Public Sub DibujarLinea(ByVal x1 As Integer, ByVal y1 As Integer, ByVal x2 As Integer, ByVal y2 As Integer, ByVal grosor As Integer, ByVal color As Color) Dim lapiz As New Pen(color, grosor + 10) GraficoBuffer.DrawLine(lapiz, x1, y1, x2, y2) End Sub 'Pues eso.. para escribir textos en el dibujo Public Sub Escribir(ByVal Texto As String, ByVal x As Integer, ByVal y As Integer, ByVal tamano As Integer, ByVal color As Color) Dim fuente As New Font("Arial", tamano, GraphicsUnit.Pixel) Dim brocha As New SolidBrush(color) GraficoBuffer.DrawString(Texto, fuente, brocha, x, y) End Sub

Ale, ya tenemos todo... ahora nos falta decirle que "nos lo dibuje". Para eso llamamos a un nuevo mtodo (el que viene a continuacin) que toma los dibujado y lo plasma sobre el control : Public Sub Actualizar() Grafico.DrawImage(ImgBuffer, 0, 0) End Sub Ya solo nos falta una clase que libere recursos del sistema: Public Class Grafico Implements IDisposable Y definir la interfaz Public Sub Dispose() Implements IDisposable.Dispose Grafico.Dispose() GraficoBuffer.Dispose() ImgBuffer.Dispose() Grafico = Nothing GraficoBuffer = Nothing ImgBuffer = Nothing End Sub

Вам также может понравиться