Создание мини-приложения представления погоды для Windows 7
Автор: Шобан Кумар (Shoban Kumar) 10.02.2010, в категории "Windows Forms 2.0"
В этой статье мы увидим, как создать мини-приложение представления погоды для Windows 7, использующее интерфейс Yahoo Weather API для получения данных о погоде. Это приложение также будет обладать некоторыми новейшими восхитительными свойствами Windows 7, такими как панель эскизов и индикатор выполнения.
Для добавление в приложения возможностей Windows 7 нам понадобится пакет Windows API Codepack. Загрузите Пакет кода интерфейса Windows API и извлеките содержимое в выбранную папку. Загруженный пакет содержит примеры и файлы, которые мы будем использовать в нашем проекте.
Ниже приведен снимок экрана разрабатываемого приложения.
Давайте начнем.
Шаг 1. Запустите Visual Studio и создайте новый проект приложения Windows Forms.
Примечание. Убедитесь что версия .net framework выбрана как 3.5
Шаг 2. Щелкните правой кнопкой мыши "Решение > Добавить > Существующий проект" и перейдите в папку, в которой был развернут пакет кода Windows API. Откройте папку "WindowsAPICodePack", а затем добавьте в свое решение следующие проекты.
- "Core", находящийся в папке "core"
- "Shell", находящийся в папке "shell"
Шаг 3. Теперь щелкните правой кнопкой мыши новый проект, созданный в шаге 1, и добавьте ссылки на указанные выше проекты. В результирующем окне выберите вкладку "Проекты", и на ней появится список проектов, уже добавленных в решение. Нужно выбрать оба проекта и нажать кнопку ОК.
Шаг 4. Добавьте в форму следующие элементы управления
- Форматированный текст: RTTemp. Этот элемент управления будет использоваться для отображения температуры.
- Форматированный текст: RTWeatherType. Этот элемент управления будет использоваться для отображения типа погоды.
- Картинка: weatherImage
Шаг 5. Импортируйте следующие пространства имен
- Microsoft.WindowsAPICodePack.Shell;
- Microsoft.WindowsAPICodePack.Taskbar;
- System.Xml;
- System.Xml.XPath;
Шаг 6. Yahoo предоставляет интерфейс API для погода, использование которого позволит получать отчет о погоде в конкретном месте. Чтобы получить данные о погоде в конкретном месте понадобится идентификатор WOEID (Where on Earth Identification) местонахождения на Земле этого места. Чтобы найти WOEID конкретного места, перейдите на веб-сайт http://weather.yahoo.com и найдите нужное место. WOEID места можно найти для URL-адреса. Ниже URL-адрес 2295411 — это WOEID для Мумбаи (Бомбей)
Шаг 7. Согласно странице интерфейса Yahoo Weather API
RSS-канал Weather (Погода) позволяет получать текущие сведения о погоде для местонахождения пользователя.
Мы будем использовать этот RSS-канал (XML-файл), чтобы показать данные о погоде в нужном месте.
Шаг 8. Ниже приведены глобальные переменные, которые будут использоваться в приложении.
C#
string[] strLocationID = { "2295411", "615702", "44418", "2295424", "2295426" };
string[] strLocations = { "Mumbai", "Paris", "London", "Chennai", "Trivandrum" };
int currentLocation = 0;
private ThumbnailToolbarButton buttonNext;
private ThumbnailToolbarButton buttonPrevious;
TaskbarManager tbManager = TaskbarManager.Instance;
VB.NET
Private strLocationID As String() = {"2295411", "615702", "44418", "2295424", "2295426"}
Private strLocations As String() = {"Mumbai", "Paris", "London", "Chennai", "Trivandrum"}
Private currentLocation As Integer = 0
Private buttonNext As ThumbnailToolbarButton
Private buttonPrevious As ThumbnailToolbarButton
Private tbManager As TaskbarManager = TaskbarManager.Instance
Приведенный выше код содержит список мест и их WOEID. У нас также есть 2 кнопки "ThumbnailToolbarButtons", которые будут использоваться для изменения местонахождения.
Шаг 9. Приведенный ниже код извлекает отчет о погоде в конкретном месте. Мы будем использовать текущее местонахождение, чтобы отследить данные о местонахождении.
C#
private void GetWeatherReport(int locationId)
{
this.Text = strLocations[locationId];
XPathDocument doc = new XPathDocument("http://weather.yahooapis.com/forecastrss?w=" + strLocationID[locationId] + "&u=c");
XPathNavigator nav = doc.CreateNavigator();
XmlNamespaceManager ns = new XmlNamespaceManager(nav.NameTable);
ns.AddNamespace("yweather", "http://xml.weather.yahoo.com/ns/rss/1.0");
XPathNodeIterator nodes = nav.Select("/rss/channel/item/yweather:condition", ns);
while (nodes.MoveNext())
{
XPathNavigator node = nodes.Current;
RTTemp.Text = node.GetAttribute("temp", ns.DefaultNamespace).ToString() + "°C";
RTWeatherType.Text = node.GetAttribute("text", ns.DefaultNamespace).ToString();
weatherImage.ImageLocation = "http://l.yimg.com/a/i/us/we/52/" + node.GetAttribute("code", ns.DefaultNamespace).ToString() + ".gif";
SetProgressBarStyle(Convert.ToInt16(node.GetAttribute("temp", ns.DefaultNamespace)));
}
}
VB.NET
Sub GetWeatherReport(ByVal locationId As Integer)
Me.Text = strLocations(locationId)
Dim doc As New XPathDocument("http://weather.yahooapis.com/forecastrss?w=" & strLocationID(locationId) & "&u=c")
Dim nav As XPathNavigator = doc.CreateNavigator()
Dim ns As New XmlNamespaceManager(nav.NameTable)
ns.AddNamespace("yweather", "http://xml.weather.yahoo.com/ns/rss/1.0")
Dim nodes As XPathNodeIterator = nav.[Select]("/rss/channel/item/yweather:condition", ns)
While (nodes.MoveNext())
Dim node As XPathNavigator = nodes.Current
RTTemp.Text = node.GetAttribute("temp", ns.DefaultNamespace).ToString() & "°C"
RTWeatherType.Text = node.GetAttribute("text", ns.DefaultNamespace).ToString()
weatherImage.ImageLocation = "http://l.yimg.com/a/i/us/we/52/" & node.GetAttribute("code", ns.DefaultNamespace).ToString() & ".gif"
SetProgressBarStyle(Convert.ToInt16(node.GetAttribute("temp", ns.DefaultNamespace)))
End While
End Sub
В приведенном выше коде мы извлекаем данные о погоде в нужном месте, а затем устанавливаем стиль индикатора выполнения в зависимости от температуры. В этой статье не рассказывается об XML-ответе от службы погоды Yahoo. Дополнительные сведения см. на странице http://developer.yahoo.com/weather/.
Шаг 10. Теперь в приведенном ниже коде мы определяем стиль индикатора выполнения и значение, используя "SetProgressValue" и "SetProgressState". В Windows 7 есть ряд восхитительных возможностей, в том числе отображение выполнения в панели задач. Цвет индикатора выполнения меняется в зависимости от текущего состояния индикатора выполнения.
C#
private void SetProgressBarStyle(int weather)
{
tbManager.SetProgressValue(50, 100);
if (weather <= 10)
{
tbManager.SetProgressState(TaskbarProgressBarState.Normal);
}
if (weather >= 20)
{
tbManager.SetProgressState(TaskbarProgressBarState.Paused);
}
if (weather >= 30)
{
tbManager.SetProgressState(TaskbarProgressBarState.Error);
}
}
VB.NET
Private Sub SetProgressBarStyle(ByVal weather As Integer)
tbManager.SetProgressValue(50, 100)
If weather <= 10 Then
tbManager.SetProgressState(TaskbarProgressBarState.Normal)
End If
If weather >= 20 Then
tbManager.SetProgressState(TaskbarProgressBarState.Paused)
End If
If weather >= 30 Then
tbManager.SetProgressState(TaskbarProgressBarState.[Error])
End If
End Sub
Стиль индикатора выполнения устанавливается в зависимости от температуры.
- TaskbarProgressBarState.Normal. Показывается обычный индикатор выполнения
- TaskbarProgressBarState.Paused. Отображается индикатор выполнения желтого цвета
- TaskbarProgressBarState.Error. Отображается индикатор выполнения красного цвета.
Шаг 11. Добавьте следующий код в событие Shown формы.
C#
private void Form1_Shown(object sender, EventArgs e)
{
buttonNext = new ThumbnailToolbarButton(Properties.Resources.nextArrow, "Next Location");
buttonNext.Enabled = true;
buttonNext.Click += new EventHandler<ThumbnailButtonClickedEventArgs>(buttonNext_Click);
buttonPrevious = new ThumbnailToolbarButton(Properties.Resources.prevArrow, "Previous Location");
buttonPrevious.Enabled = true;
buttonPrevious.Click += new EventHandler<ThumbnailButtonClickedEventArgs>(buttonPrevious_Click);
TaskbarManager.Instance.ThumbnailToolbars.AddButtons(this.Handle, buttonPrevious, buttonNext);
//TaskbarManager.Instance.TabbedThumbnail.SetThumbnailClip(this.Handle, new Rectangle(weatherImage.Location, weatherImage.Size));
GetWeatherReport(currentLocation);
}
VB.NET
Private Sub Form1_Shown(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Shown
buttonNext = New ThumbnailToolbarButton(My.Resources.nextArrow, "Next Location")
buttonNext.Enabled = True
AddHandler buttonNext.Click, AddressOf buttonNext_Click
buttonPrevious = New ThumbnailToolbarButton(My.Resources.prevArrow, "Previous Location")
buttonPrevious.Enabled = True
AddHandler buttonPrevious.Click, AddressOf buttonPrevious_Click
TaskbarManager.Instance.ThumbnailToolbars.AddButtons(Me.Handle, buttonPrevious, buttonNext)
GetWeatherReport(currentLocation)
End Sub
В приведенном выше коде мы создали две кнопки эскизов и определили их свойства. "ThumbnailToolbarButton"принимает два аргумента. Первая является значком кнопки, а вторая — это отображаемая подсказка. Мы также добавили для этих кнопок обработчик события клиента. После создания кнопок мы добавляем их в экземпляр панели задач, используя
TaskbarManager.Instance.ThumbnailToolbars.AddButtons(this.Handle, buttonPrevious, buttonNext)
Шаг 12. Следующий код определяет событие на стороне клиента для кнопок панели задач эскизов.
C#
void buttonNext_Click(object sender, EventArgs e)
{
if ((currentLocation + 1) < strLocationID.Length)
{
currentLocation += 1;
GetWeatherReport(currentLocation);
}
}
void buttonPrevious_Click(object sender, EventArgs e)
{
if ((currentLocation - 1) >= 0)
{
currentLocation -= 1;
GetWeatherReport(currentLocation);
}
}
VB.NET
Private Sub buttonNext_Click(ByVal sender As Object, ByVal e As EventArgs)
If (currentLocation + 1) < strLocationID.Length Then
currentLocation += 1
GetWeatherReport(currentLocation)
End If
End Sub
Private Sub buttonPrevious_Click(ByVal sender As Object, ByVal e As EventArgs)
If (currentLocation - 1) >= 0 Then
currentLocation -= 1
GetWeatherReport(currentLocation)
End If
End Sub
Это все. Сохраните и запустите свое приложение. Ниже приведены несколько снимков экранов мини-приложения представления погоды в действии!
Эскиз "горячего" места
Эскиз "холодного" места
Эскиз места с температурой между 10 и 20 градусов
Эскиз с подсказкой
Весь исходный код для этой статьи можно загрузить здесь