Test Foro de elhacker.net SMF 2.1

Programación => .NET (C#, VB.NET, ASP) => Programación General => Programación Visual Basic => Mensaje iniciado por: DarkMatrix en 21 Septiembre 2008, 04:54 AM

Título: Una ayudita pliss
Publicado por: DarkMatrix en 21 Septiembre 2008, 04:54 AM
buenas a todos por aca espero que me puedan ayudar, veran tengo un proyecto en el cual quiero que a una imagen se le pueda colocar texto, en una Zona espesifica de la imagen, tambien que se le puedan montar otras imagenes encima o en alguna parte de la imagen, y que luego esa imagen se pueda guardar como una sola.

Aqui un ejemplo de mas o menos lo que se quiere:

http://rapidshare.com/files/147030576/yugioh_card_maker_1_0.zip.html

Claro no les pido un codigo fuente, solo ayuda para saber como puedo hacerlo Gracias por las respuestas que puedan aportar xD! ;)

Título: Re: Una ayudita pliss
Publicado por: BlackZeroX en 21 Septiembre 2008, 09:30 AM
Como NO pides ejemplos de coigos mejor te voy al punto sin tanto rollo

Parala imagen:
   con PaintPicture  o con la api bitblt
      combinarlo con TransparentBlt  para transparencias un X color
Para texto:
   Api DrawText
Título: Re: Una ayudita pliss
Publicado por: demoniox12 en 21 Septiembre 2008, 18:27 PM
Cita de: nike42 en 21 Septiembre 2008, 04:54 AM
buenas a todos por aca espero que me puedan ayudar, veran tengo un proyecto en el cual quiero que a una imagen se le pueda colocar texto, en una Zona espesifica de la imagen, tambien que se le puedan montar otras imagenes encima o en alguna parte de la imagen, y que luego esa imagen se pueda guardar como una sola.

Aqui un ejemplo de mas o menos lo que se quiere:

http://rapidshare.com/files/147030576/yugioh_card_maker_1_0.zip.html

Claro no les pido un codigo fuente, solo ayuda para saber como puedo hacerlo Gracias por las respuestas que puedan aportar xD! ;)



Toma.. este Source supongo que te va a servir.. lo hice para el laburo..

http://rapidshare.com/files/147180921/Marca_de_Agua.zip.html

salu2!
Título: Re: Una ayudita pliss
Publicado por: DarkMatrix en 21 Septiembre 2008, 20:36 PM
Cita de: ░▒▓BlackZeroҖ▓▒░ en 21 Septiembre 2008, 09:30 AM
Como NO pides ejemplos de coigos mejor te voy al punto sin tanto rollo

Parala imagen:
   con PaintPicture  o con la api bitblt
      combinarlo con TransparentBlt  para transparencias un X color
Para texto:
   Api DrawText

bueno tampoco es que no le pido ejemplos, pero esque tampoco soy muy adentrado en la materia, si podrian poner algunos ejemplillos para poder guiarme xD!
Título: Re: Una ayudita pliss
Publicado por: BlackZeroX en 22 Septiembre 2008, 02:34 AM
PaintPicture (http://foro.elhacker.net/programacion_vb/redimensionar_imagen-t228522.0.html)
las demas estan ya posteadas me parece en este foro si no busca en la Api-Guide
Título: Re: Una ayudita pliss
Publicado por: DarkMatrix en 22 Septiembre 2008, 05:59 AM
muy bien ya se como usar el paint picture pero hay un problema, Paintpicture no me permite trabajar con archivos png, lo intente con esto : http://www.recursosvisualbasic.com.ar/htm/ocx-componentes-activex-dll/102-modulo-para-leer-png.htm pero no anda.

Cita de: ░▒▓BlackZeroҖ▓▒░ en 21 Septiembre 2008, 09:30 AM

   con PaintPicture  o con la api bitblt
      combinarlo con TransparentBlt  para transparencias un X color

Esta cuestion no la entiendo mucho y tampoco encuentro ejemplos, a ver si me echan una mano, solo me falta la parte de usar imagenes con transparencias y dibujar el texto, gracias por su ayuda

Salu2!
Título: Re: Una ayudita pliss
Publicado por: demoniox12 en 22 Septiembre 2008, 06:43 AM
fijate mi programa.. utiliza PNG...

salu2!
Título: Re: Una ayudita pliss
Publicado por: BlackZeroX en 22 Septiembre 2008, 06:47 AM
DrawText.

Código (vb) [Seleccionar]

Const DC_ACTIVE = &H1
Const DC_NOTACTIVE = &H2
Const DC_ICON = &H4
Const DC_TEXT = &H8
Const BDR_SUNKENOUTER = &H2
Const BDR_RAISEDINNER = &H4
Const EDGE_ETCHED = (BDR_SUNKENOUTER Or BDR_RAISEDINNER)
Const BF_BOTTOM = &H8
Const BF_LEFT = &H1
Const BF_RIGHT = &H4
Const BF_TOP = &H2
Const BF_RECT = (BF_LEFT Or BF_TOP Or BF_RIGHT Or BF_BOTTOM)
Const DFC_BUTTON = 4
Const DFC_POPUPMENU = 5            'Solo Win98/2000 !!
Const DFCS_BUTTON3STATE = &H10
Const DT_CENTER = &H1
Const DC_GRADIENT = &H20          'Solo Win98/2000 !!

Private Type RECT
   Left As Long
   Top As Long
   Right As Long
   Bottom As Long
End Type
Private Declare Function DrawText Lib "user32" Alias "DrawTextA" (ByVal hdc As Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long
Private Sub Form_Load()
AutoRedraw = True
Dim r As RECT
r.Top = 0
r.Left = 0
r.Bottom = 20
r.Right = 500
DrawText Me.hdc, "Holaaaaaaaaaa", Len("Holaaaaaaaaaa"), r, BF_RECT Or BF_TOP
End Sub


BitBlt

usa dos piture en el picture1 carga alguna imagen en el segundo no pogas nada
Código (vb) [Seleccionar]

Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Sub Form_Load()
Picture1.ScaleMode = 3
Picture2.ScaleMode = 3
Picture1.AutoRedraw = True
Picture2.AutoRedraw = True
r = BitBlt(Picture2.hdc, 0, 0, 100, 100, Picture1.hdc, 10, 10, vbSrcCopy)
End Sub


Transparect Blt (Sacado de la Api-Guide)

Código (vb) [Seleccionar]

'This project needs 2 pictureboxes
'Picturebox1 must contain a picture with a lot of white pixels (we're going to use white as transparent color)
Private Declare Function TransparentBlt Lib "msimg32.dll" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal crTransparent As Long) As Boolean
Private Sub Form_Load()
    'KPD-Team 1999
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    Picture1.AutoSize = True
    'API uses pixels
    Picture1.ScaleMode = vbPixels
    Picture2.ScaleMode = vbPixels
End Sub
Private Sub Picture2_Paint()
    'If we don't call DoEvents first, our transparent image will be completely wrong
    DoEvents
    TransparentBlt Picture2.hdc, 0, 0, Picture2.ScaleWidth, Picture2.ScaleHeight, Picture1.hdc, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight, vbWhite
End Sub
Título: HDC a Picture
Publicado por: BlackZeroX en 22 Septiembre 2008, 06:55 AM

HDC a Picture


con respecto a los PNG seria cargarlo a el modulo y despues transformarlo a pictura o bitmap  ve esta funcion sacada de la Api-Guide

la funcion en si transforma de un Hdc a Picture ok' [como ejemplo poongo este codigo completo de la Api-Guide]
Código (vb) [Seleccionar]

Const RC_PALETTE As Long = &H100
Const SIZEPALETTE As Long = 104
Const RASTERCAPS As Long = 38
Private Type PALETTEENTRY
    peRed As Byte
    peGreen As Byte
    peBlue As Byte
    peFlags As Byte
End Type
Private Type LOGPALETTE
    palVersion As Integer
    palNumEntries As Integer
    palPalEntry(255) As PALETTEENTRY ' Enough for 256 colors
End Type
Private Type GUID
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(7) As Byte
End Type
Private Type PicBmp
    Size As Long
    Type As Long
    hBmp As Long
    hPal As Long
    Reserved As Long
End Type
Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" (PicDesc As PicBmp, RefIID As GUID, ByVal fPictureOwnsHandle As Long, IPic As IPicture) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal iCapabilitiy As Long) As Long
Private Declare Function GetSystemPaletteEntries Lib "gdi32" (ByVal hdc As Long, ByVal wStartIndex As Long, ByVal wNumEntries As Long, lpPaletteEntries As PALETTEENTRY) As Long
Private Declare Function CreatePalette Lib "gdi32" (lpLogPalette As LOGPALETTE) As Long
Private Declare Function SelectPalette Lib "gdi32" (ByVal hdc As Long, ByVal hPalette As Long, ByVal bForceBackground As Long) As Long
Private Declare Function RealizePalette Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Function CreateBitmapPicture(ByVal hBmp As Long, ByVal hPal As Long) As Picture
    Dim R As Long, Pic As PicBmp, IPic As IPicture, IID_IDispatch As GUID

    'Fill GUID info
    With IID_IDispatch
        .Data1 = &H20400
        .Data4(0) = &HC0
        .Data4(7) = &H46
    End With

    'Fill picture info
    With Pic
        .Size = Len(Pic) ' Length of structure
        .Type = vbPicTypeBitmap ' Type of Picture (bitmap)
        .hBmp = hBmp ' Handle to bitmap
        .hPal = hPal ' Handle to palette (may be null)
    End With

    'Create the picture
    R = OleCreatePictureIndirect(Pic, IID_IDispatch, 1, IPic)

    'Return the new picture
    Set CreateBitmapPicture = IPic
End Function
Function hDCToPicture(ByVal hDCSrc As Long, ByVal LeftSrc As Long, ByVal TopSrc As Long, ByVal WidthSrc As Long, ByVal HeightSrc As Long) As Picture
    Dim hDCMemory As Long, hBmp As Long, hBmpPrev As Long, R As Long
    Dim hPal As Long, hPalPrev As Long, RasterCapsScrn As Long, HasPaletteScrn As Long
    Dim PaletteSizeScrn As Long, LogPal As LOGPALETTE

    'Create a compatible device context
    hDCMemory = CreateCompatibleDC(hDCSrc)
    'Create a compatible bitmap
    hBmp = CreateCompatibleBitmap(hDCSrc, WidthSrc, HeightSrc)
    'Select the compatible bitmap into our compatible device context
    hBmpPrev = SelectObject(hDCMemory, hBmp)

    'Raster capabilities?
    RasterCapsScrn = GetDeviceCaps(hDCSrc, RASTERCAPS) ' Raster
    'Does our picture use a palette?
    HasPaletteScrn = RasterCapsScrn And RC_PALETTE ' Palette
    'What's the size of that palette?
    PaletteSizeScrn = GetDeviceCaps(hDCSrc, SIZEPALETTE) ' Size of

    If HasPaletteScrn And (PaletteSizeScrn = 256) Then
        'Set the palette version
        LogPal.palVersion = &H300
        'Number of palette entries
        LogPal.palNumEntries = 256
        'Retrieve the system palette entries
        R = GetSystemPaletteEntries(hDCSrc, 0, 256, LogPal.palPalEntry(0))
        'Create the palette
        hPal = CreatePalette(LogPal)
        'Select the palette
        hPalPrev = SelectPalette(hDCMemory, hPal, 0)
        'Realize the palette
        R = RealizePalette(hDCMemory)
    End If

    'Copy the source image to our compatible device context
    R = BitBlt(hDCMemory, 0, 0, WidthSrc, HeightSrc, hDCSrc, LeftSrc, TopSrc, vbSrcCopy)

    'Restore the old bitmap
    hBmp = SelectObject(hDCMemory, hBmpPrev)

    If HasPaletteScrn And (PaletteSizeScrn = 256) Then
        'Select the palette
        hPal = SelectPalette(hDCMemory, hPalPrev, 0)
    End If

    'Delete our memory DC
    R = DeleteDC(hDCMemory)

    Set hDCToPicture = CreateBitmapPicture(hBmp, hPal)
End Function
Private Sub Form_Load()
    'KPD-Team 1999
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    'Create a picture object from the screen
    Set Me.Picture = hDCToPicture(GetDC(0), 0, 0, Screen.Width / Screen.TwipsPerPixelX, Screen.Height / Screen.TwipsPerPixelY)
End Sub


solo edita la linea siguiente y edita los datos requeridos

Código (vb) [Seleccionar]

    Set Picture2.Picture = hDCToPicture(Picture1.hdc, 0, 0, 100, 100)
[]/code[
Título: Re: Una ayudita pliss
Publicado por: andreina en 23 Septiembre 2008, 01:45 AM
[hola me gustaria q me ayudaran a resolver unos ejercicios con vectores en visual basic... los ejercicios son:
1. se tienen dos arreglos unidimensionales a y b de m elementos, partiendo de los dos arreglos, elaborar un algoritmo q forme tres nuevos arreglos. el primero con la suma de los elementos respectivos, el otro con el producto y el ultimo con la diferencia.
2. hacer un programa q permita realizar las siguintes operaciones:
a) cargar un vector
b) encontrar el mayor elemento del vector y su posicion
c) calcule el promedio de los elementos del vector y forme dos nuevos arreglos, uno con los elementos menores o iguales al promedio y otro con los superiores. imprima los dos nuevos arreglos
d) calcular e imprimir los numeros de datos repetidos en el vector
e) el numero de valores impares
f) en otro vector mostrar los elementos pares

le agradezco a quien me pueda  ayudar con los programas!!!

Título: Re: Una ayudita pliss
Publicado por: seba123neo en 23 Septiembre 2008, 01:56 AM
andreina tendrias que haber creado un nuevo post, no poner tu tema,en este tema que no tiene nada que ver son tu pregunta...igualmente esas no son dudas , esa es tarea ,aca nadie le hace la tarea a nadie..
Título: Re: Una ayudita pliss
Publicado por: andreina en 23 Septiembre 2008, 02:08 AM
pues por eso esto se llama una ayudita  porque talvez haa gente q si me quiera colaborar igual su ayuda no la necesito... a lo mejor ni sabra nada y se las viene a dar de mucho!!!!! >:D
Título: Re: Una ayudita pliss
Publicado por: DarkMatrix en 23 Septiembre 2008, 04:37 AM
Oigan no se pelen asi xD! aqui todos somos una comunidad.

Con respecto a mi tema he logrado hacer el drawtext y el paint picture, lo de las imagenes png aun no lo he probado pero voy en esa.

Tengo varios problemas con el DrawText, Cuando se dibuja el texto sobre la imagen todo bien, pero queria saber si se puede hacer un limite para el texto, que cuando este llegue al limite me salte a la otra linea, como en los Textbox con multiline en true.

con respecto al proyecto en general, queria saber si despues que se hace el drawtext o el paint picture no hay forma de volver hacia atras, osea deshacer lo hecho o ya queda grabado en la imagen.

De Antemano Gracias por su ayuda.
Título: Re: Una ayudita pliss
Publicado por: BlackZeroX en 23 Septiembre 2008, 05:44 AM
el que pide que le realicen la tarea y despues nos llame engreidos es un idiota pero bue ni que asi son:

Nike42:

Ahora ese que pides o del multiline o como los textbox seria midiendo el ancho del caracter pero antes medir el anchoo del rectangulo y dividirlo entre el ancho de el caracter para asi determinar cuando se deberia de realizar un salto de linea algo asi ve:



Ancho digamos del picture (representado por la linea de abajo):

|------------------------------|

Ancho = DeLaLinea

despues usas la funcion:

AnchoTextual = picture1.Textwidth("Aca el texto")

Si anchotextual>=ancho entonces
   salta a la siguiente linea
de lo contrario
   sigue en la linea


lo pongo asi por que la verdad debes pensar un poco eso de multiline es algo facil colo usa la concatenacion con el texto actual con  VBNewLine o chr$(13)

Citarcon respecto al proyecto en general, queria saber si despues que se hace el drawtext o el paint picture no hay forma de volver hacia atras, osea deshacer lo hecho o ya queda grabado en la imagen.

bueno eso ya es a tu ingenio ya que despues de dibujar en un picture me parece que no se desase pero eso tiene arreglo solo ingeniatelas a mi se me ocurre cargar la imagen x en dos picture

uno visible y uno no visible y si dese desaser un cambio en el picture2 (el que no se ve) qeu guarde la imagen original y despues por medio de variables se guarden los hechos que se puedan desaser y segun estos cortar X trozos de la imagen del picture2 al picture1 y hacer los cambios...

algo loco pero resultante

P.D. a mi se me ocurrio esto ati se te puede ingeniar otra cosa mas facil (la que mendiona usaria matrices de variables en las que se guardar informacion de X puntos de restauracion de los cambiso de la imagen algo asi como en Paint)
Título: Re: Una ayudita pliss
Publicado por: DarkMatrix en 23 Septiembre 2008, 07:49 AM
Citar


Ancho digamos del picture (representado por la linea de abajo):

|------------------------------|

Ancho = DeLaLinea

despues usas la funcion:

AnchoTextual = picture1.Textwidth("Aca el texto")

Si anchotextual>=ancho entonces
   salta a la siguiente linea
de lo contrario
   sigue en la linea



Si bien entiendo este code lo que hace es contar los caracteres del texto para que cuando llegue al limite del ancho del picturebox aplique una nueva linea al texto.

Pero esta funcion no se aplica al DrawText, intente realizarlo pero o no se pinta el texto o el texto siempre esta en una linea a ver si aqui me explico:

(http://img526.imageshack.us/img526/5909/dibujoqs9.jpg)

el code que tengo para hacer el drawtext es este:



Private Sub Form_Load()

Dim r As RECT
Dim Texto as String
Dim Ctexto as Long

Picture1.AutoRedraw = True
Texto = "Esto es un texto de ejemplo para la descripcion de esta carta."
Ctexto = Len(Texto)

r.Top = 1   ' Coordenada Y
r.Left = 1  ' Coordenada X
r.Bottom = 500 ' Alto del Rectangulo
r.Right = 200  ' Ancho del Rectangulo
DrawText Me.Picture1.hdc, Texto, Ctexto, r, DT_LEFT

End Sub



y funciona correctamente, pero no hace el salto de linea. bueno no se si esque estoy haciendo algo mal pero espero que me ayuden xD! saludos!!!  ;)