Создание мини-приложения представления погоды для 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 градусов

Эскиз с подсказкой

Весь исходный код для этой статьи можно загрузить здесь