Clique aqui para instalar o Silverlight*
BrasilAlterar|Todos os sites da Microsoft
MSDN
|Developer Centers|Biblioteca|Downloads|Como Comprar|Assinaturas MSDN
     
 


Rádio Gadget: Um exemplo Passo a Passo

Criaremos um Gadget que ofereça a possibilidade de escutar rádio via Internet e permita ao usuário configurar ao menos cinco estações de rádio favoritas.

Recordaremos os 5 passos definidos anteriormente.

• Passo 1: Criar o diretório que conterá os arquivos de desenvolvimento do Gadget

• Passo 2: Criar o arquivo XML para o manifesto do Gadget

• Passo 3: Criar a interface gráfica do Gadget

• Passo 4: Programar a funcionalidade desejada

• Passo 5: Testar, Depurar e Instalar o Gadget no Windows Sidebar



Passo 1: Criar o diretório que conterá os arquivos de desenvolvimento do Gadget

Tendo acesso ao diretório de Gadgets da maneira especificada, criaremos o diretório Radio.gadget. Dentro do mesmo, para distribuir ordenadamente os arquivos que dispõem o Gadget, criaremos os sub diretórios css, js e imagens.


Passo 2: Criar o arquivo XML para o manifesto do Gadget

Com o editor de código que decidimos utilizar, criamos um arquivo XML manifesto chamado gadget.xml. Este arquivo deve ser gerado na raiz do diretório Radio.Gadget que criamos no passo anterior.

Gadget.xml deverá possuir a seguinte informação:



<?xml version="1.0" encoding="utf-8" ?>
<gadget>
<name>Radio</name>
<namespace>Microsoft.Windows</namespace>
<version>1.0.0.1</version>
<author name="">
<info url="www.microsoftgadgets.com" />
<logo src="imagenes/logo.png" />
</author>
<copyright>&#169; 2006</copyright>
<description>Escute rádio a partir de sua área de trabalho do Windows Vista.</description>
<icons>
<icon src="imagenes/icono.png" />
</icons>
<hosts>
<host name="sidebar">
<base type="HTML" apiVersion="1.0.0" src="Radio.html" />
<permissions>Full</permissions>
<platform minPlatformVersion="0.1" />
</host>
</hosts>
</gadget>

O arquivo deve estar com codificação UTF-8.

Passo 3: Criar a interface gráfica do Gadget

Este é o momento de criar a interface visual com a qual o usuário terá acesso às funcionalidades e configurações do Gadget que está sendo desenvolvido.

Criar a tela principal do Gadget

Na raiz do diretório Radio.gadget será criado um arquivo chamado Radio.html que oferecerá a principal funcionalidade ao usuário: escutar sua rádio favorita.

Na seção <head> da página Radio.html se fará referência ao arquivo que manipula a lógica da aplicação (logica.js) e ao arquivo que armazena suas características visuais (style.css). Estes arquivos serão analizados em detalhes mais a frente.

<html>
<head>
<title>Rádio</title>
<script language="javascript" src="js/logica.js" type="text/javascript"></script>
<script for="mPlayer" event="playstatechange(newstate)">CambioEstado(newstate);</script>
<link rel="stylesheet" type="text/css" href="css/style.css">
</head>
...

Ao ser disparado o evento playstatechange do objeto mPlayer que representa o Windows Media Placer em nossa página, será executada a função CambioEstado armazenada no arquivo logica.js

Na página Radio.html também será escrito código para representar os botões que permitam armazenar as rádios favoritas, subir e baixar o volume e reproduzir ou parar a transmissão. Da mesma forma será necessário colocar o objeto do Windows Media Player para obter o serviço requerido.


<body>
<g:background id="fondoDinamico" />
<div>
<div id="favoritos" style="position:absolute; left:8; top:65.5;">
<img id="btn01" src="imagenes/btn01.png"
onmouseenter="btn01.src='imagenes/btn01Hover.png'"
onmouseleave="btn01.src='imagenes/btn01.png'"
onclick="Sintonizar('1')">
<img id="btn02" src="imagenes/btn02.png"
onmouseenter="btn02.src='imagenes/btn02Hover.png'"
onmouseleave="btn02.src='imagenes/btn02.png'"
onclick="Sintonizar('2')">
<img id="btn03" src="imagenes/btn03.png"
onmouseenter="btn03.src='imagenes/btn03Hover.png'"
onmouseleave="btn03.src='imagenes/btn03.png'"
onclick="Sintonizar('3')">
<img id="btn04" src="imagenes/btn04.png"
onmouseenter="btn04.src='imagenes/btn04Hover.png'"
onmouseleave="btn04.src='imagenes/btn04.png'"
onclick="Sintonizar('4')">
<img id="btn05" src="imagenes/btn05.png"
onmouseenter="btn05.src='imagenes/btn05Hover.png'"
onmouseleave="btn05.src='imagenes/btn05.png'"
onclick="Sintonizar('5')">
</div>
<div id="control" style="position:absolute; left:7; top:8;">
<img id="btnPrincipal" src="imagenes/play.png" alt="Reproducir"
onmousedown="btnPrincipal.src='imagenes/playDown.png'"
onmouseup="btnPrincipal.src='imagenes/playHover.png'"
onmouseenter="btnPrincipal.src='imagenes/playHover.png'"
onmouseleave="btnPrincipal.src='imagenes/play.png'"
onclick="RadioPlay()">
</div>
<div id="volumenMas" style="position:absolute; right:9; top:7;">
<img id="btn" src="imagenes/Mas.png" alt="Volumen (+)"
onclick="MasVolumen()">
</div>
<div id="volumenMenos" style="position:absolute; right:9; top:25;">
<img id="btn" src="imagenes/Menos.png" alt="Volumen (-)"
onclick="MenosVolumen()">
</div>
<div id="texto" style="position:absolute; right:12; top:49; font-size:12;">
Listo
</div>
</div>

<OBJECT id="mPlayer" width="0" height="0"
style="position:absolute; left:0;top:0;"
CLASSID="CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6"
type="application/x-oleobject">
<PARAM NAME="SendPlayStateChangeEvents" VALUE="True">
<PARAM NAME="AutoStart" VALUE="False">
<PARAM name="uiMode" value="invisible">
</OBJECT>
</body>
</html>


Criar a tela de Configuração do Gadget

Na raiz do diretório Radio.gadget será criado um arquivo chamado Settings.html. Este arquivo permitirá ao usuário configurar cada uma de suas rádios favoritas.

Neste arquivo definiremos todas as configurações de nosso gadget. Basicamente, usaremos 2 métodos:

• variableName = System.Gadget.Settings.read("variableName") Para ler configurações armazenadas
•System.Gadget.Settings.write("variableName", variableName) Para escrever uma dada configuração


<html>
<head>
<style>
body
{
width:350;
height:320;
}
</style>
<script>
//Função que é executada ao abrir a janela de configuração
function init()
{
for(i = 1; i <= 5; i = i + 1)
{
var texto = "NombreRadio_" + i.toString();
if(System.Gadget.Settings.read(texto) != "")
cboRadio.options[i-1].text = System.Gadget.Settings.read(texto);
else
cboRadio.options[i-1].text = "Favorito " + i.toString();

texto = "MMS_" + i.toString();
cboRadio.options[i-1].value = System.Gadget.Settings.read(texto);
}

CambioSeleccion();
}
function CambioSeleccion()
{
var indice = cboRadio.selectedIndex + 1;
txtNombreRadio.value = cboRadio.options[cboRadio.selectedIndex].text;
txtMMSRadio.value = cboRadio.options[cboRadio.selectedIndex].value;
txtImagen.value = System.Gadget.Settings.read("Imagen_" + indice.toString());
}
function Guardar()
{
var indice = cboRadio.selectedIndex + 1;
System.Gadget.Settings.write("NombreRadio_" + indice.toString(), txtNombreRadio.value);
System.Gadget.Settings.write("MMS_" + indice.toString(), txtMMSRadio.value);
System.Gadget.Settings.write("Imagen_" + indice.toString(), txtImagen.value);

init();
cboRadio.selectedIndex = indice - 1;
}
//Com System.Shell.chooseFile abro a janela para explorar e selecionar os arquivos
function SeleccionarImagen()
{
var tiposArchivos = "JPEG File:*.jpg:BMP File:*.bmp:PNG File:*.png:GIF File:*.gif:All Files:*.*::";
var oShellItem = System.Shell.chooseFile(true, tiposArchivos, "c:\\", "");
if(oShellItem)
{
txtImagen.value = oShellItem.path;
}
}

//Aqui, especifico que método será usado para o evento onSettingsClosing, ou seja, logo antes que se feche a janela de configuração.
System.Gadget.onSettingsClosing = SettingsClosing;
function SettingsClosing(event)
{
if (event.closeAction == event.Action.commit)
{
}
event.cancel = false;
}
</script>
</head>
<body onload="init()">
<span id="mySpan" style="font-family: Tahoma; font-size: 10pt;">
.Seleccione radio:<br>
<select name="cboRadio" id="cboRadio" style="width: 230;" onChange="CambioSeleccion()">
<option value="">
<option value="">
<option value="">
<option value="">
<option value="">
</select>
</span>

<div style="font-family: Tahoma; font-size: 10pt; position:absolute; left:20; top:80;">
.Estación:
<div><input id="txtNombreRadio" size="30"></div>
</div>
<div style="font-family: Tahoma; font-size: 10pt; position:absolute; left:20; top:120;">
.URL:
<div><input id="txtMMSRadio" size="30"></div>
</div>
<div style="font-family: Tahoma; font-size: 10pt; position:absolute; left:20; top:160;">
.Imagen:
<div>
<input id="txtImagen" size="30">
<input type="button" onclick="SeleccionarImagen()" name="btnSeleccionar"
id="btnSeleccionar" value="...">
</div>
<div style="position:absolute; top:50;">
<input type="button" onclick="Guardar()" name="btnGuardar" id="btnGuardar" value="Guardar">
</div>
<div style="position:absolute; top:120;">
+ Radios Online ->
<a href="http://www.windowsmedia.com/radiotuner/Myradio.asp">
<img src="imagenes/logoWindowsRadio.png" border="0"
style="position:absolute; top:-8;"
alt="Sintonizador de radio de WindowsMedia">
</a>
</div>
</div>
</body>
</html>



Manter a ordem entre seus arquivos

Na folha de estilo, armazenada em css\style.css serão definidas as dimensões da interface do gadget (Radio.HTML), as margens e a imagem de fundo inicial.

Body
{
width:135px;
height:100px;
margin-left: 0px;
margin-top: 0px;
margin-right: 0px;
margin-bottom: 0px;
background-image:url('../imagenes/fondo.png');
}

Colocamos os ícones e imagens que vem com este Passo a Passo (ou podemos modificá-las por outras) em uma dos subdiretórios que criamos no ponto 3 (imagens).

Passo 4: Programar a funcionalidade desejada

A lógica do gadget estará no arquivo js\logica.js, cujo código é o seguinte:

var nombreRadioActual = "";
var mmsRadioActual = "";
var imagenActual = "imagenes/fondo.png";

//Método que é executado ao abrir o gadget
window.onload = function()
{
//Especifico que método será executado quando é terminado de fechar a janela de configuração
System.Gadget.onSettingsClosed = SettingsClosed;
//Especifico como se chama o arquivo de configuração (é ele que é ativado ao clicar com o botào direito sobre o gadget e é selecionada a opção Options)
System.Gadget.settingsUI = "Settings.html";
}
function SettingsClosed()
{
btn01.alt = System.Gadget.Settings.read("NombreRadio_1");
btn02.alt = System.Gadget.Settings.read("NombreRadio_2");
btn03.alt = System.Gadget.Settings.read("NombreRadio_3");
btn04.alt = System.Gadget.Settings.read("NombreRadio_4");
btn05.alt = System.Gadget.Settings.read("NombreRadio_5");
}
function RadioPlay()
{
if(mmsRadioActual != "")
{
btnPrincipal.src = "imagenes/stop.png";
btnPrincipal.alt = "Detener";
btnPrincipal.onmousedown = function(){btnPrincipal.src="imagenes/stopDown.png"};
btnPrincipal.onmouseup = function(){btnPrincipal.src="imagenes/stopHover.png"};
btnPrincipal.onmouseenter = function(){btnPrincipal.src="imagenes/stopHover.png"};
btnPrincipal.onmouseleave = function(){btnPrincipal.src="imagenes/stop.png"};
btnPrincipal.onclick = function(){RadioStop()};

mPlayer.url = mmsRadioActual;
mPlayer.controls.Play();
}
else
{
texto.innerHTML = "(Defina URL)";
}
}
function RadioStop()
{
btnPrincipal.src = "imagenes/play.png";
btnPrincipal.alt = "Reproducir";
btnPrincipal.onmousedown = function(){btnPrincipal.src="imagenes/playDown.png"};
btnPrincipal.onmouseup = function(){btnPrincipal.src="imagenes/playHover.png"};
btnPrincipal.onmouseenter = function(){btnPrincipal.src="imagenes/playHover.png"};
btnPrincipal.onmouseleave = function(){btnPrincipal.src="imagenes/play.png"};
btnPrincipal.onclick = function(){RadioPlay()};

fondoDinamico.src = "../imagenes/fondo.png";

mPlayer.controls.Stop();
}
function Sintonizar(numFavorito)
{
RadioStop();

switch(numFavorito)
{
case('1'):
btn01.src = "imagenes/btn01Hover.png";
btn01.onmouseleave = function(){btn01.src="imagenes/btn01Hover.png"};
btn02.src = "imagenes/btn02.png";
btn02.onmouseleave = function(){btn02.src="imagenes/btn02.png"};
btn03.src = "imagenes/btn03.png";
btn03.onmouseleave = function(){btn03.src="imagenes/btn03.png"};
btn04.src = "imagenes/btn04.png";
btn04.onmouseleave = function(){btn04.src="imagenes/btn04.png"};
btn05.src = "imagenes/btn05.png";
btn05.onmouseleave = function(){btn05.src="imagenes/btn05.png"};
break;
case('2'):
btn01.src = "imagenes/btn01.png";
btn01.onmouseleave = function(){btn01.src="imagenes/btn01.png"};
btn02.src = "imagenes/btn02Hover.png";
btn02.onmouseleave = function(){btn02.src="imagenes/btn02Hover.png"};
btn03.src = "imagenes/btn03.png";
btn03.onmouseleave = function(){btn03.src="imagenes/btn03.png"};
btn04.src = "imagenes/btn04.png";
btn04.onmouseleave = function(){btn04.src="imagenes/btn04.png"};
btn05.src = "imagenes/btn05.png";
btn05.onmouseleave = function(){btn05.src="imagenes/btn05.png"};
break;
case('3'):
btn01.src = "imagenes/btn01.png";
btn01.onmouseleave = function(){btn01.src="imagenes/btn01.png"};
btn02.src = "imagenes/btn02.png";
btn02.onmouseleave = function(){btn02.src="imagenes/btn02.png"};
btn03.src = "imagenes/btn03Hover.png";
btn03.onmouseleave = function(){btn03.src="imagenes/btn03Hover.png"};
btn04.src = "imagenes/btn04.png";
btn04.onmouseleave = function(){btn04.src="imagenes/btn04.png"};
btn05.src = "imagenes/btn05.png";
btn05.onmouseleave = function(){btn05.src="imagenes/btn05.png"};
break;
case('4'):
btn01.src = "imagenes/btn01.png";
btn01.onmouseleave = function(){btn01.src="imagenes/btn01.png"};
btn02.src = "imagenes/btn02.png";
btn02.onmouseleave = function(){btn02.src="imagenes/btn02.png"};
btn03.src = "imagenes/btn03.png";
btn03.onmouseleave = function(){btn03.src="imagenes/btn03.png"};
btn04.src = "imagenes/btn04Hover.png";
btn04.onmouseleave = function(){btn04.src="imagenes/btn04Hover.png"};
btn05.src = "imagenes/btn05.png";
btn05.onmouseleave = function(){btn05.src="imagenes/btn05.png"};
break;
case('5'):
btn01.src = "imagenes/btn01.png";
btn01.onmouseleave = function(){btn01.src="imagenes/btn01.png"};
btn02.src = "imagenes/btn02.png";
btn02.onmouseleave = function(){btn03.src="imagenes/btn02.png"};
btn03.src = "imagenes/btn03.png";
btn03.onmouseleave = function(){btn03.src="imagenes/btn03.png"};
btn04.src = "imagenes/btn04.png";
btn04.onmouseleave = function(){btn04.src="imagenes/btn04.png"};
btn05.src = "imagenes/btn05Hover.png";
btn05.onmouseleave = function(){btn05.src="imagenes/btn05Hover.png"};
break;
}

nombreRadioActual = System.Gadget.Settings.read("NombreRadio_" + numFavorito);
mmsRadioActual = System.Gadget.Settings.read("MMS_" + numFavorito);
imagenActual = System.Gadget.Settings.read("Imagen_" + numFavorito);

if(mmsRadioActual == "")
{
nombreRadioActual = "";
texto.innerHTML = "(disponible)";
}
else
{
texto.innerHTML = nombreRadioActual;
fondoDinamico.src = imagenActual;
}
}
function MasVolumen()
{
now_vol = mPlayer.settings.volume;
now_vol = now_vol + 10;
mPlayer.settings.volume = now_vol;
}
function MenosVolumen()
{
now_vol = mPlayer.settings.volume;
now_vol = now_vol - 10;
mPlayer.settings.volume = now_vol;
}
//Evento do controle do Windows Media que é executado cada vez que se muda o estado dele.
function CambioEstado(newstate)
{
switch (newstate)
{
case 1: //Stopped
texto.innerHTML = "Detenido";
break;
case 2: //Paused
texto.innerHTML = "Pausado";
break;
case 3: //Playing
texto.innerHTML = nombreRadioActual;
break;
case 6: //Buffering
texto.innerHTML = "Almacenando...";
break;
case 7: //Waiting
texto.innerHTML = "Espere...";
break;
case 8: //Media Ended
texto.innerHTML = "Fin";
break;
case 9: //Transitioning
texto.innerHTML = "Conectando...";
break;
case 10: //Ready
texto.innerHTML = "Listo";
break;
}
}



Passo 5: Testar, Depurar e Instalar o Gadget no Windows Sidebar

Já temos o Gadget finalizado e pronto para instalar! Para poder vê-lo em funcionamento, uma vez anexado ao Windows Sidebar, simplesmente clicamos com o botão direito sobre ele e selecionamos Options. Será aberto uma janela que contém o arquivo settings.html criado no ponto 3 (Criar a janela de Configuração do Gadget) para que carreguemos nossas rádios favoritas.

 

REFERÊNCIAS

Windows Sidebar Reference
Gadget Development Overview
Using Atlas to make web services calls from Sidebar Gadget
HTML and Script development
Windows Vista – Windows Sidebar and Gadgets


DESAFIO GADGET

 
     

©2009 Microsoft Corporation. Todos os direitos reservados. Entre em contato |Nota Legal |Marcas comerciais |Política de Privacidade
Microsoft