Cuando quieres borrar una pizarra, qué es lo que haces ?....
Quitas lo que hay encima dejando lo que está debajo. Pero qué pasa cuando hay 2 'capas' es decir que no queremos llegar a la pizarra...? , que hay que restaurar
lo que estaba debajo. Para lograr esto se necesita 'saber' que había debajo, es decir tenemos que tener guardado de alguna manera lo que había debajo para poder consltarlo
y a partir de elló reconstruirlo.
Hay varias formas unas más cómodas que otras , unas más complejas que otras y unas más costosas que otras...
a ) Por ejemplo lo más cómodo sería usar alguna librería que ya hiciera eso, pero quizás no sea fácil de adquirir, de usar o de aprender a usar, o simplemente la licencia de uso tiene consideraciones que no entran en nuestros propósitos respecto del proyecto que estemos haciendo.
b ) Casi lo más sencillo de hacer utilizando 4 líneas de código ( lo mas sencillo se describe 2 puntos más abajo pero necesitas explicaciones de este punto y el siguiente) , pero para obtener resultados buenos debes entender como opera si no te romperás la cabeza y sólo darás vueltas y vueltas... El código que te expongo ahora va en esa dirección...
Crea una nueva aplicación, añade 2 botones y un picturebox, carga desde diseño una imagen al picturebox, copia el código (de más abajo) , ejecútalo... los dos botones dan 4 combinaciones posibles en función del orden pulsado, por tanto podrás observar 4 situaciones diferentes del gráfico.
Prueba a hacer cambios, si lo entiendes mo necesitarías más ayuda...
Const ini = 100
Dim iniX As Integer
Dim iniY As Integer
Private Sub Command1_Click()
For k = 0 To 29
Picture1.Line (iniX, iniY)-(iniX, iniY + 300), 16777215 - vbRed ' quiero poner rojo, pero como utilizo el 'XOR'...
iniX = ini + (k * 20)
Next
End Sub
Private Sub Command2_Click()
iniX = 100: iniY = 100
For k = 0 To 29 Step 2 ' solo toca las líneas pares
Picture1.Line (iniX, iniY)-(iniX, iniY + 20 + (10 * k)), vbBlue ' estas líneas van creciendo en longitud
iniX = ini + (k * 20)
Next
End Sub
Private Sub Form_Load()
Dim img As IPictureDisp
Me.ScaleMode = vbPixels
iniY = 100
With Picture1
.AutoSize = True
.AutoRedraw = True ' prueba a desactivar esta línea, y verás lo que ocurre...
.Refresh
.ScaleMode = vbPixels
.DrawMode = vbXorPen
.DrawWidth = 15 ' para ver mejor qué es lo que hace, lo normal es que vayas a utilizar 1 o 2...
Set img = .Picture
.Width = 700 ' bucle de 30 * 20 distancia entee líneas + 100 de ini=700, así quedan todas visibles...
.Height = 500 ' 100 de iniy(margens superior) + 300 de alto de línea mayor, más 100 de margen inferior = 500
.PaintPicture img, 0, 0
.Picture = .Image
End With
Set img = Nothing
End Sub
Personalmente me crearía una clase que contuviera una colección de estructuras de tipo 'Linea' con algunos métodos para manejar la colección y dibujar-ocultar ...
c ) Puedes usar el control line, en vez del método line del contenedor, al efecto deberías crear una matriz de controles line, donde el primer control tiene índice 0, y no está visible... un botón debería indicar 'Crear nueva línea' y haces un load line(0) y luego un visible=true para esa línea, deberías tener un conjunto de controles para modificar el ancho, alto, posición horizontal y posición vertical , color...
Luego a la gora de quitar líneas es un unload él control línea que sobra.
Para guardar el resultado en vez de guardarlo como gráfico (esto depende de dónde y cómo lo vayas a usar después ) puedes guardarlo como un conjunto de estructuras de tipo línea que recogen las propiedades que la definen (x,y, dx ,dy , color.... visible ) nº de líneas ... es decir quedarían guardadas como un gráfico 'vectorial' no como un gráfico 'pintado' ... la ventaja es que podrías manipularlo fácilemtne en una nueva carga, por ejemplo escalnado, además actualizarlo sería más fácil si por ejemplo un día toda una cuadra de calles ahora es un único edificio, otra ventaja es el tamaño que ocupa en disco, bastante poco en comparación con una imagen de ANCHO x ALTO píxeles...
si en cambio las quieres guardar como gráfico basta que cree un 2º picturebox oculto, con uaotredraw= true, y dibujas con picture2.line la serie de líneas que son visibles en el gráfico actual con las propiedades que tiene cada línea usando for each c in picture1.controls : if typeof(c) is line then... with c picture2.lines( .x , .y) - ( .x1, .y1), .backcolor ...etc... después hacees el picture2.picture= su image y luego salvas las imagen del picture2....
Este modelo es bastante más sencillo de hacer que el modo anterior, pués no tienes que preocuparte de lo que tienes que hacer para controlar cuando y como ocultar líneas en un momento dado, basta eliminarlas o hacerlas invisibles.
d ) cualquier método que te permita recordar las lineas trazadas, al quitar líneas lo que harás será borrar el contenido gráfico y redibujar sólo aquellas líneas que se quieren dibujar. La diferencia de este modo con los 2 anteriores, es que requiere redibujar por completo todas las líneas 'válidas' si sólo son unos pocos cientos 8incluso miles) es rapido pero si hay decenas de miles castiga bastante al procesador con cada repintado... Los mértodos descritos anteriores permiten alterar sólo las líneas de interés las demás no habría porqué tocarlas ( en el código de ejemplo, se toca todo porque es de eso, de ejemplo, de hecho el código del botón 2 sólo toca las 'líneas' pares...). Este métod tiene la ventaja de que es el más sencillo de programar, porque no necesitas saber ni entender como funciona la transparencia, simplemente borras todo y trazas de nuevo. con todo necesitas tener que 'recordar' las líneas que se han dibujado, para reconsruirlo.
Luego hay otras formas un poco más o menos complejas... pero que no vamos a entrar en detalles, porque si no tienes cierto nivel mínimo de programación (en vb6 por lo menos) te iba a ser muy costoso realizarlo...