incrustar música .mp3 en un formulario .

Iniciado por **Aincrad**, 12 Octubre 2017, 16:09 PM

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

**Aincrad**

hola de nuevo. jeje

como dice el titulo , se podría meter una música en la pestaña resources . y después agregar el control de windows media player y el directorio poner esa musica?

osea yo se poner músicas en los formularios. pero la canción tiene que ir en la adjunto con el exe . y eso no es lo que quiero .

lo que quiero es hacer un exe que ya contenga dentro la canción y la reproduzca.

yo pienso que se debería incrustar como los txt en la parte de resources pero no se como poner el mp3
 
                                              gracias de antemano .  ;-)

                                                   




Eleкtro

#1
Cita de: **Aincrad** en 12 Octubre 2017, 16:09 PMse podría meter una música en la pestaña resources

Si, puedes añadir y embedir cualquier tipo de archivo a la tabla de recursos de tu executable.


Cita de: **Aincrad** en 12 Octubre 2017, 16:09 PMyo pienso que se debería incrustar como los txt en la parte de resources pero no se como poner el mp3

Pues exactamente de la misma manera, ¿cual es el problema que le encuentras?, simplemente seleccionas el archivo que quieres añadir como recurso, o directamente desde el explorador de Windows usas el ratón para arrastrar el archivo a la IDE (teniendo la pestaña de recursos abierta) y así se añade...

En otro post te mostré un enlace a MSDN donde te explican como añadir recursos...

Cita de: **Aincrad** en 12 Octubre 2017, 16:09 PMy después agregar el control de windows media player y el directorio poner esa musica?

Si, siempre y cuando primero extraigas los datos raw del recurso para generar un archivo local en el disco, y que así el host de WMP pueda reproducirlo, puesto que WMP solo acepta un nombre de archivo o una url. En otras palabras: no puedes usar WMP para reproducir un recurso de audio si no lo extraes al disco, lo cual no se si supone una complicación o no para las intenciones que tengas, de todas formas en otro post te mostré un código para extraer recursos y guardarlos en el disco...

Si lo que quieres es cargar diréctamente el stream del recurso de audio para reproducirlo, entonces puedes usar la clase System.Media.SoundPlayer (del set de librerías para la tecnología WPF) de la siguiente manera:

Código (vbnet) [Seleccionar]
Imports System.Media
Código (vbnet) [Seleccionar]
Using waveStream As UnmanagedMemoryStream = My.Resources.ResourceManager.GetStream("Nombre del recurso WAV"),
     player As New SoundPlayer(waveStream)

   player.PlaySync()
End Using


Nota: pero no reproduce archivos MP3, el archivo de recurso tiene que ser en formato WAV.
Nota 2: No te preocupes si programas bajo la tecnología Windows Forms, puedes usar los miembros de WPF igualmente.

Aquí tienes una guía:

Saludos








**Aincrad**

Cita de: Eleкtro en 12 Octubre 2017, 17:47 PM
Código (vbnet) [Seleccionar]
Imports System.Media
Código (vbnet) [Seleccionar]
Using waveStream As UnmanagedMemoryStream = My.Resources.ResourceManager.GetStream("Nombre del recurso WAV"),
    Dim player As New SoundPlayer(waveStream)

   player.PlaySync()
End Using


Nota: pero no reproduce archivos MP3, el archivo de recurso tiene que ser en formato WAV.

convertí el archivo mp3 a wav y lo agregue a resources y puse el code que esta arriba .

pero cuando ejecuto el form, empieza a reproducir la música y no aparece el form hasta dentro de unos 4 seg y despues que aparece el form pa musica se detiene?.

como le hago?

.




Eleкtro

#3
Cita de: **Aincrad** en 12 Octubre 2017, 19:40 PMcuando ejecuto el form, empieza a reproducir la música y no aparece el form hasta dentro de unos 4 seg y despues que aparece el form pa musica se detiene?.

como le hago?

El método SoundPlayer.PlaySync, como su propio nombre indica es sincrónico, es lo que se conoce como una llamada bloqueante. En otras palabras: es así por defecto, la cola de mensajes del thread de la UI se bloqueará hasta que se termine de reproducir la canción. Lo mismo te ocurriría si iterases un búcle infinito antes de cargar la UI... o despues, cuando sea.

¿Solución?, prueba a usar el método SoundPlayer.Play a secas (en teoría es asincrónico), o sino, puedes ejecutar la llamada al método SoundPlayer.PlaySync desde un nuevo thread.


Saludos








**Aincrad**

Gracias ya lo solucione .  ;-)  ;-)  ;-)  ;-)

pd: Si Tengo un formulario sin bordes y le quiero poner un picture box como border.

entonces que código le pongo al picturebox para que haga la funcion de borde. ?  :huh:




Eleкtro

#5
Cita de: **Aincrad** en 12 Octubre 2017, 20:22 PMSi Tengo un formulario sin bordes y le quiero poner un picture box como border.

No, esa no es la manera indicada de intentar simular un borde. De forma natural un control no puede sobresalir (visiblemente hablando) fuera de los límites (bounds) del contenedor padre de dicho control, es decir, el Form.

Sencillamente puedes recurrir a GDI+ para dibujar un borde alrededor de la ventana del Form. Luego puedes capturar cuando el usuario presiona click para responder al mensaje de ventana WM_NCHITTEST en el que puedes "falsificar" el identificador de la parte de la ventana que corresponde a las coordenadas donde se hizo click, y así simular que se presionó click izquierdo sobre una borde barra de título (titlebar) para iniciar la operación de arrastrar/mover la ventana del Form...

EDITO: O bien si lo prefieres puedes hacer eso mismo siguiendo la misma metodología que he descrito arriba pero para que en vez de mover la ventana lo que haga sea iniciar una operación de redimensionar (resize) el Form al presionar click sobre uno de los "bordes", aunque ello requeriría algo más de trabajo de implementación que lo que escribí en este código de aquí abajo.

...¿Y cómo se hace todo eso?, pues así:

Código (vbnet) [Seleccionar]
Public NotInheritable Class Form1 : Inherits Form

   Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
       Me.FormBorderStyle = FormBorderStyle.None
   End Sub

   Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
       ' Asegúrate de escribir un valor de longitud que sea número par, para que encaje correctamente en los offsets.
       Using pen As New Pen(Color.LimeGreen, SystemInformation.FrameBorderSize.Width)
           e.Graphics.DrawRectangle(pen, Me.DisplayRectangle)
       End Using
   End Sub

   Private Sub Form1_MouseDown(sender As Object, e As MouseEventArgs) Handles Me.MouseDown
       If (e.Button = MouseButtons.Left) Then
           NativeMethods.ReleaseCapture()
           NativeMethods.SendMessage(Me.Handle, NativeMethods.WindowsMessages.WM_NCLBUTTONDOWN,
                                     New IntPtr(NativeMethods.NcHitTestFlags.HT_CAPTION), IntPtr.Zero)
       End If
   End Sub

End Class


Código (vbnet) [Seleccionar]
Friend NotInheritable Class NativeMethods

   Private Sub New()
   End Sub

   ' https://msdn.microsoft.com/en-us/library/windows/desktop/ff381405(v=vs.85).aspx
   Friend Enum WindowsMessages As Integer
       WM_NCLBUTTONDOWN = &HA1
   End Enum

   ' https://msdn.microsoft.com/en-us/library/windows/desktop/ms645618(v=vs.85).aspx
   Friend Enum NcHitTestFlags As Integer
       HT_CAPTION = &H2
   End Enum

   ' https://msdn.microsoft.com/en-us/library/windows/desktop/ms646261(v=vs.85).aspx
   <DllImport("user32.dll")>
   Friend Shared Function ReleaseCapture() As Boolean
   End Function

   ' https://msdn.microsoft.com/en-us/library/windows/desktop/ms644950(v=vs.85).aspx
   <DllImport("user32.dll", EntryPoint:="SendMessage", SetLastError:=True)>
   Friend Shared Function SendMessage(
             <MarshalAs(UnmanagedType.SysInt)> ByVal hwnd As IntPtr,
                 <MarshalAs(UnmanagedType.U4)> ByVal msg As WindowsMessages,
             <MarshalAs(UnmanagedType.SysInt)> ByVal wParam As IntPtr,
             <MarshalAs(UnmanagedType.SysInt)> ByVal lParam As IntPtr
   ) As Integer
   End Function

End Class





Citarque código le pongo al picturebox para que haga la funcion de borde. ?

La próxima vez no pidas tanto código así como si esto fuese un servicio gratis de entrega de códigos a domicilio con una base de datos de códigos en oferta para cualquier ocasión especial del año...

En general pedir "códigos" está muy mal visto internacionálmente en el mundillo de la programación..

Trata de buscar un poco antes de preguntar, que son cosas sencillas las que pides y podrías investigar por Google o donde sea y acabar hallando una solución. No te lo van a dar todo siempre hecho.


PD: Lo siento pero tenía que decirlo.

Saludos