programa para dibujar en windows xD

Iniciado por vivachapas, 21 Enero 2008, 05:34 AM

0 Miembros y 2 Visitantes están viendo este tema.

vivachapas

bueno estuve viendo como trabjar con img... como en un picture dibujar en cierto pixel... y ese tipo de cosas q nunca habia hecho..
(la idea era tratar de hacer un juego) pero para eso falta todavia...

hice un par de programas "bobos" pero les dejo este q es el mas entretenido y muy simple para quien quiera aprender algo mas...

http://rapidshare.com/files/85333855/Capturas_de_pantalla.rar

el codigo es 100% mio.. no se si laguien ya hizo algo al estilo de este xD

SALUDOS

P/D: hice un programa tipo Paint.. pero no se como guardar lo q dibujo en el picture box... x favor si alguno me puede explicar o darme un manual donde se hacen este tipo de cosas.. ya q lo q fui haciendo fue todo probrando xD

ah y como se si ese pixel ya tiene algun color...

otra pregunta alguno tiene un code de esos jueguitos viejo...(de los primeros) en el q un pixel es un autito... y esta siempre quiero pero se mueve la pista... o algun code asi para ponerme a investigar.. en google no encuentro xD

cassiani

#1
 Nunca he trabajado con algo así pero viéndolo por encima ¿porque no capturarlo como hicisteis en el evento load y actualizarlo?
Private Sub menuGuardar_Click()
    foto.SetSamplingFrequencies 2, 2, 2, 2, 2, 2
    foto.Quality = 100
    foto.SampleScreen
    If ExisteArchivo("c:\Salvado.jpg") = True Then _
    Kill "c:\Salvado.jpg" 'Necesario eliminarlo, sino no salva :-[
    foto.SaveFile ("c:\Salvado.jpg")
    'Lo vuelvo a cargar, para verificar que guardo, ¡pero no es necesario!
    Picture1.Picture = LoadPicture("c:\salvado.jpg")
End Sub

Private Sub menuSalir_Click()
    Unload Me
End Sub

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
    If Button = 2 Then 'Si se presiono el boton derecho del mouse
        PopupMenu Menu
       
        'Esquema del menu
        '---------------------------
        'Menu --> Menu
            'Guardar --> menuGuardar
            'Salir --> menuSalir
        '---------------------------
    End If
End Sub

'Esta es la función más sencilla para detectar la existencia de un archivo
Public Function ExisteArchivo(Archivo As String) As Boolean
    ExisteArchivo = IIf(Dir$(Archivo) = "", False, True)
    'Devolverá false, si Dir$ no encuentra el archivo especificado
End Function


Con un PopupMenu con las opciones guardar y salir, lo demás es... ¡claro! se podria ahorrar código creando una rutina para la captura de pantalla, y así llamarla cada vez que se necesite, en el load y en guardar como es este el caso ¡por ejemplo!. Por el momento no os puedo seguir ayudando por falta de tiempo, después pruebo lo demás y si lo deseáis os sigo ayudando.

Pd: tambien seria necesario usar commondialog para guardar, y así no sustituir siempre la captura anterior.

¡S4lu2!

Chefito

Nas compas. La verdad es que os llevo leyendo algún tiempo esporadicamente y es la primera vez que intento ayudar. Espero que sirva de algo mi ignorancia. Mira...respecto a lo de saber el color de un pixel en un objeto picturebox mira lo que pone el msdn:
Devuelve, como un valor de tipo Integer Long, el color rojo-verde-azul (RGB) delpunto especificado de un objeto Form o un control PictureBox. No aceptaargumentos con nombre.

Sintaxis

objeto.Point(x, y)

La sintaxis del método Point consta de las siguientes partes:

Parte Descripción
objeto Opcional. Unaexpresión de objeto que da como resultado un objeto de la lista Se aplica a. Si se omite objeto, se supone que el objeto es el objeto Form que tenga elenfoque.
x, y Requerido. Valores de precisión simple que indican las coordenadas horizontal (eje x) y vertical (eje y) del punto según la propiedad ScaleMode del objeto Form o el control PictureBox. Deben colocarse entre paréntesis.


Comentarios

Si el punto definido por las coordenadas x e y está fuera del objeto, el método Point devuelve -1.

Vamos...que sería color=picturebox1.point(x,y).
Por supuesto tendrías que tener la propiedad Scalemode del objeto picturebox igual a vbpixels o 3 para que la unidad de medida de las coordenadas fuesen pixeles.
Te remiendo que utilices esto, ya que el vb nos lo facilita. Pero para aportar más, también está la api getpixel:
Declare Function GetPixel Lib "gdi32" Alias "GetPixel" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Esta api también devuelve el color del pixel del objeto. En hdc tendrías que poner picturebox1.hdc y en x e y pues ya sabes :).
Para hacer juegos te recomiendo que empices mirandote las apis de la libreria gdi32, que son de manejo de gráficos. Luego si te quieres meter en un embolado, mirate la libreria de, por ejemplo, los directX, aunque hay por ahi librería más intuitivas (creo recordar que en su día de los que más me gusto fue revolution3d por ejem):
http://www.revolution3d.net/cms/index.php?option=com_frontpage
Aunque no lo toqué apenas. Pero lo que te digo, si te quieres meter en camisa de once baras, te calientas el coco con la api de directx y punto, que los directx estas instalados en todos los win :).
Y sobre juegos en vb.....pues en su día si había por la web, busca que seguro que encuentras. Mira en esta pagina:
http://www.planet-source-code.com/vb/default.asp?lngWId=1
En la parte de abajo verás dos apartados que pueden que te interesen: Games y Graphics. Busca.
Había un juego parecido al arkanoid hecho totalmente en vb tirando a tope de apis llamado ArkX. Buscalo, es bastante interesante.
Yo mismamente hace años, intenté hacer el típico juego de las dos raquetas y la pelota (el de la atari 2600 :)). Al final casi lo acabé. Está por ahí perdido, pero si te interesa lo intento buscar y mandar. Tiene fallos pero la programación es bastante facil de entender.
Y si os interesa pego un curso de metodos gráficos en vb6 (solo sus funciones, procedimientos y propiedades, nada de apis) que hace tiempo bajé de una pagina.
Bueno, espero haber ayudado en algo. A ver si vuelvo a programar algo.
P.D. Si quieres hacer juegos, a lo mejor te gustaría saber que hay lenguajes especificos para eso, lo mismo te interesan (Ejem. DarkBasic, BlitzBasic). Yo mismo tuve una pequeña época de Game Dev Studio :). Pero si te pones con vb y alguna librería puedes hacer maravillas ;).
Moderador del foro oficial de AutoIt en español: www.AutoIt.es.

Todos tenemos inteligencia, lo malo es que algunos no nos acordamos donde la dejamos guardada ;)

vivachapas

chefito muchas gracias x la info! ya la voy a leer mas detenidamente...

y C@ss¡@n¡... la programa q yo me referia es otro... mira pongo el code tb asi lo ven... y lo q quiero es guardar lo q dibujo en el picturebox...

http://rapidshare.com/files/85477201/Dibujos.rar

en ese proyecto es donde quiero guardar el archivo...

SALUDOS

cassiani

CitarC@ss¡@n¡... la programa q yo me referia es otro...

¡Ups! en ese caso mirad esto:

Private Sub CmdGuardar_Click()
    With CommonDialog1
         .DialogTitle = "Guardar el archivo"
         .Filter = "Archivos BMP|*.bmp|Archivos JPG|*.bmp|Todos|*.*"
         .ShowSave
         If .FileName = "" Then
            MsgBox "No se especificó ningún nombre", vbCritical
         End If
         Picture1.Picture = Picture1.Image
         SavePicture Picture1, .FileName
    End With
End Sub

Private Sub Form_Load()
    Picture1.AutoRedraw = True
End Sub


Implementa eso a tu proyecto y seguro que funciona, no olvides el AutoRedraw del PictureBox a True es fundamental.

Bueno... ¡S4lu2!

Chefito

Un pequeño aporte para cuando canceles o cierres el cuadro de dialogo no se grabe la imagen:
Private Sub CmdGuardar_Click()
    With CommonDialog1
         .DialogTitle = "Guardar el archivo"
         .Filter = "Archivos BMP|*.bmp|Archivos JPG|*.bmp|Todos|*.*"
         .ShowSave
         If .FileName = "" Then
            MsgBox "No se especificó ningún nombre", vbCritical
         End If
         If not(.CancelError) then SavePicture Picture1.Image, .FileName
    End With
End Sub

Private Sub Form_Load()
    Picture1.AutoRedraw = True
End Sub
Moderador del foro oficial de AutoIt en español: www.AutoIt.es.

Todos tenemos inteligencia, lo malo es que algunos no nos acordamos donde la dejamos guardada ;)

Chefito

Por cierto, otro apunte. Si quieres que no se te produzcan esos espacios a causa de utilizar el pset utiliza el line con alguna modificación en tu programa. Según me dijo un amigo sabio en vb hace mucho tiempo, los programas de dibujo hacen esto para no dejar espacios. Pon esto en tu código:
Declara esto:
Dim X1 As Integer, Y1 As Integer
Y sustituye los procedimientos siguientes:
Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button = 1 Then Picture1.PSet (X, Y), Color
    X1 = X
    Y1 = Y
End Sub

Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Static X2 As Integer, Y2 As Integer
    If Button = 1 Then
        X2 = X
        Y2 = Y
        Picture1.Line (X1, Y1)-(X2, Y2), Color
        X1 = X2
        Y1 = Y2
    End If
End Sub

Quita el procedimiento Picture1_MouseUp que no sirve para nada ;)
Si no entiendes algo dilo....si no soy yo alguien te lo aclarara.
Moderador del foro oficial de AutoIt en español: www.AutoIt.es.

Todos tenemos inteligencia, lo malo es que algunos no nos acordamos donde la dejamos guardada ;)

vivachapas

muchas gracias x los codes.. en serguida los pruebo...

el de chefito no me funciona :(

gracias de todos modos ;)

SALUDOS

Chefito

Mmmmmmm.....como que no te funciona? Pero si te lo di mascado! :)
Haber sustituye la declaración tuya del principio:
Dim Color As ColorConstants
por
Dim Color As ColorConstants, X1 As Integer, Y1 As Integer
y sustituye los dos procedimientos del final de tu código:
Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then
Picture1.PSet (X, Y), Color
End If
End Sub

Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 2 Then Exit Sub
Picture1.PSet (X, Y), Color
End Sub

por esto:
Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button = 1 Then Picture1.PSet (X, Y), Color
    X1 = X
    Y1 = Y
End Sub

Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim X2 As Integer, Y2 As Integer
    If Button = 1 Then
        X2 = X
        Y2 = Y
        Picture1.Line (X1, Y1)-(X2, Y2), Color
        X1 = X2
        Y1 = Y2
    End If
End Sub

Y esto funciona perfectamente.
Moderador del foro oficial de AutoIt en español: www.AutoIt.es.

Todos tenemos inteligencia, lo malo es que algunos no nos acordamos donde la dejamos guardada ;)

cassiani

Cita de: Chefito en 21 Enero 2008, 23:22 PM
Un pequeño aporte para cuando canceles o cierres el cuadro de dialogo no se grabe la imagen:
Private Sub CmdGuardar_Click()
    With CommonDialog1
         .DialogTitle = "Guardar el archivo"
         .Filter = "Archivos BMP|*.bmp|Archivos JPG|*.bmp|Todos|*.*"
         .ShowSave
         If .FileName = "" Then
            MsgBox "No se especificó ningún nombre", vbCritical
         End If
         If not(.CancelError) then SavePicture Picture1.Image, .FileName
    End With
End Sub

Private Sub Form_Load()
    Picture1.AutoRedraw = True
End Sub

En ese sentido, para que sea completamente correcto seria necesario agregarle:
.CancelError = True
porque de la manera actual, entra en el siguiente bloque, canceles o no...
If not(.CancelError) then SavePicture Picture1.Image, .FileName

Por otro lado:
Citarah y como se si ese pixel ya tiene algun color...
Aunque ya la respondieron correctamente, os dejo un ejemplo sencillo, podes trabajarlo con los valores hexadecimales que devuelve:
Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    'Ejemplo... ;-]
    Me.Cls
    Me.BackColor = Picture1.Point(X, Y)
    Me.Caption = "Valor hexadecimal del color: " & Hex(Me.BackColor)
End Sub


Creo que eso es todo... ¡S4lu2! y suerte en lo que haces... :o