Sunteți pe pagina 1din 4

Agregando Sonidos a nuestra aplicacion

Posted By admin On Noviembre 22, 2007 @ 3:28 am In FoxPro General | No Comments

(No Ratings Yet)

Nuevamente exponiendoles otro comentario sobre como hacer aplicaciones mas atractivas.

Este es el problema: Uno de mis sistemas es para un Video, y todo funciona bien desde hace mucho,
pero, en ocasiones la dueña me dice que escucha un sonido (cuando un dato no esta bien tecleado, o
cuando termina la impresion o simplemente a ver un mensaje en pantalla -MESSAGEBOX) y no sabe
porque hace eso la computadora. Dice, “a veces lo escucho y a veces no, y no se si esta bien o que
pasa.” Claro que no pasa nada, ya que segun los eventos de Windows, dicho sonido (ding.wav) esta
asociado con las ventanas, al maximizar, minimizar, etc. Para ello pense en que la mejor manera era
dotar a mi sistema de sonidos que indicaran ciertas funciones (al igual que los iconos), por ejemplo, el
mensaje de error, la impresion, cuando no se encuentra un dato, cuando se graba. Mi primer
pensamiento fue crear una rutina para que desde que instale mi aplicacion modifique el registro de
Windows y asigne los sonidos que yo quiera a los eventos de Windows (tal como lo hacen los Temas).
Busque aqui en PortalFox alguna API, y en Universal Thread. No encontre nada. Asi que busque y en
news2news.com encontre muchas mas rutinas API entre ellas: messagebeep y sndPlaySound

Nota de PortalFox: Estas funciones API si estan en este portal: [1] Cómo ejecutar el sonido
predeterminado del sistema [2] Cómo ejecutar un archivo .WAV desde VFP mediante la API [3]
Algunas funciones de la API de Windows

*************************************************
* MESSAGEBEEP()
*
#DEFINE MB_OK 0
#DEFINE MB_OKCANCEL 1
#DEFINE MB_ICONHAND 16
#DEFINE MB_ICONQUESTION 32
#DEFINE MB_ICONEXCLAMATION 48
#DEFINE MB_ICONASTERISK 64
#DEFINE MB_ICONMASK 240

DECLARE INTEGER MessageBeep IN "user32" INTEGER wType

? MessageBeep (MB_ICONEXCLAMATION)
***********************************************

Esta funcion ejecuta el sonido asignado por defecto al aparecer la ventana de mensajes. Los toma
directamente del registro de Windows.

***********************************************
DO decl
#DEFINE SND_SYNC 0
#DEFINE SND_ASYNC 1
#DEFINE SND_NODEFAULT 2
#DEFINE SND_MEMORY 4
#DEFINE SND_LOOP 8
#DEFINE SND_NOSTOP 16

*= sndPlaySound ("c:windowsmediatada.wav",;
SND_ASYNC + SND_NODEFAULT)

*= sndPlaySound ("c:windowsmediachimes.wav",;
SND_SYNC + SND_NODEFAULT)

*= sndPlaySound ("c:windowsmediachord.wav",;
SND_SYNC + SND_NODEFAULT)

*= sndPlaySound ("c:windowsmedianotify.wav",;
SND_SYNC + SND_NODEFAULT + SND_NOSTOP)

*= sndPlaySound ("c:program filesicqicqgreet.wav",;


SND_ASYNC)
=messagebox('demo' )

PROCEDURE decl
DECLARE INTEGER sndPlaySound IN winmm;
STRING lpszSound, INTEGER fuSound

*************************************************

Y esta otra permite ejecutar cualquier sonido tipo WAV (no funciona con MIDI, ya lo probe) y si es
Snd_async (1), permite regresar inmediatamente a la aplicacion. Noten en el ejemplo
=MESSAGEBOX(’DEMO’) el cual no genera su propio sonido porque primero viene la funcion. Asi,
puedo asignar mis propios sonidos justo antes de mostrar una ventana de mensaje o al pulsar un boton de
comando o cualquier otro que se me ocurra. Ahora bien, no son las unicas opciones. Como tengo la
libreria FOCUS.FLL (www.fastwrite.com), el cual contiene muchisimas funciones muy utiles, viene ya
esta misma funcion asi:

***********************************************
set library to focus
*SND_AppEvent() : Plays a waveform identified
* by an entry in the registry.
*SND_asterisk() : Plays a waveform identified
* by an entry in the registry (iconasterisk)
*SND_error() : Plays a waveform identified by
* an entry in the registry (iconhand)
*SND_exclamation() : Plays a waveform
* identified by an entry in the registry
* (iconexclamation)
*SND_LastVersion() : Returns the file stamp of
* SND functions.
*SND_OK() : Plays a waveform identified by an
* entry in the registry (iconok)
*SND_play() : Plays a waveform sound specified
* by a filename.
*SND_repeat() : Repeats the last
* waveform that was played.
*SND_Standard() : Standard beep using the
* computer speaker.
*SND_Stop() : Stops playing of any wave file.
*SND_vers() : Returns the FOCUS Sound version.
*SND_AppEvent( "FOCUS","FOCUSLoading" )
*SND_Error()

=messagebox( 'demo' )
***************************************************

Lo interesante es que combina las dos funciones mencionadas anteriormente con comandos mas simples
a mi juicio. Ademas, con SND_PLAY() permite hacer que se ejecute cualquier sonido: Entonces,
simplemente cargo mi libreria FOCUS.FLL al inicio de mi aplicacion en mi programa inicial:

SET LIBRARY TO FOCUS

Y despues en mis programas, formas, clases, etc. simplemente coloco: snd_play(’ncompute.wav’, 1) Y


listo.

El unico problema es que si se tiene la version shareware, posiblemente al cargar la libreria FOCUS al
inicio mostrar una pantalla diciendo que es version share. Cuesta como 40.00 dlls. Pero aun hay mas.

Otra forma es con los excelentes controles de dbi-tech (www.dbi-tech.com). Un control ActiveX
llamado ctWave, se coloca en el formulario, y se le asigna la propiedad: playwave. ctwave.playwave =
‘demo.wav’ Y listo. Hace casi las mismas funciones. El problema con el control es registrarlo claro, y
haberlo comprado (en su sitio web esta la version shareware…)

Resumiendo:

Podemos usar las API de Windows.

Podemos usar la libraria FOCUS.FLL

Podemos usar control ActiveX

ACTUALIZACION 2008 en adelante


Desgraciadamente, la librería FOCUS.FLL que contenia numeras y utiles funciones
ha dejado de existir, precisamente porque VFP puede incorporar muchas de las funciones
API del propio Windows o mediante WSI.
De tal forma que los desarrolladores abandonaron el proyecto.

Para tal efecto, uso en su lugar la siguiente funcion:


*------------------------------------------------
FUNCTION _PlayWave(lcWaveFile,lnPlayType)
*------------------------------------------------
* Ejecuta un archivo .WAV
* USO: _PlayWave( [,])
* Arch_WAV = Ruta completa del archivo .WAV
* Tipo_Ejecucion = 1 - Ejecución en background (default)
* 0 - La aplicación espera la ejecución
* 2 - Si el archivo no existe, no ejecuta el default
* 4 - Apaga el sonido que se está ejecutando
* 8 - Continuado
* RETORNA: .T. Si el sonido fue ejecutado
*------------------------------------------------
lnPlayType = IIF(TYPE("lnPlayType")="N",lnPlayType,1)
DECLARE INTEGER PlaySound ;
IN WINMM.dll ;
STRING cWave, ;
INTEGER nModule, ;
INTEGER nType
RETURN IIF(PlaySound(lcWaveFile,0,lnPlayType) = 1, .T., .F.)
ENDFUNC

Esta, utiliza la apli directa de Windows para ejecutar cualquier sonido en mp3 o
wav. Asi, dentro del programa, queda casi exactamente como la funcion de FOCUS
descrita anteriormente:

=_playwave(“click.wav”)

Espero que les sirvan estas opiniones. Suerte.

Article printed from IDSFoxPro Blog: http://foxpro.idsystemsmx.com/wordpress

URL to article: http://foxpro.idsystemsmx.com/wordpress/?p=5

URLs in this post:


[1] Cómo ejecutar el sonido predeterminado del sistema: http://www.portalfox.com/article.php?
sid=10
[2] Cómo ejecutar un archivo .WAV desde VFP mediante la API:
http://www.portalfox.com/article.php?sid=5
[3] Algunas funciones de la API de Windows: http://www.portalfox.com/article.php?sid=228
[4] Image: http://foxpro.idsystemsmx.com/wordpress/?p=5&print=1