Как я могу использовать индикатор выполнения в стиле метра? - PullRequest
10 голосов
/ 20 апреля 2010

В Vista / 7 окно оболочки Windows Explorer использует специальный вид статического индикатора выполнения для отображения места на жестком диске.

При использовании стилей по умолчанию эта полоса синего цвета и не анимирована. Он также становится красным, когда приближается к заполнению (мало места на диске).

Используя обмен сообщениями, я могу сказать элементу управления Windows Forms ProgressBar обновить его состояние на «Приостановлено» и «Ошибка» (желтый и красный цвета соответственно), которые работают нормально, но они по-прежнему относятся к прогрессу.

В Windows User Guidelines конкретно указывается этот «индикаторный» индикатор выполнения:

Этот шаблон не является индикатором выполнения, но это реализовано с использованием прогресса панель управления. Метры имеют отчетливый смотреть, чтобы отличить их от истинного индикаторы выполнения.

Говорят, что "реализовано с помощью индикатора выполнения", так что ... как? Какое сообщение я могу отправить элементу управления, чтобы он так себя вел?

Я видел, что вы можете отправлять сообщения для установки цвета панели , но в документации говорится, что эти вызовы игнорируются, когда включены визуальные стили. Ничто иное в документации Windows API для необработанных элементов управления ProgressBar, казалось, не предлагало способ сделать это. Я просто застрял, делая собственный нарисованный бар? Я бы очень хотел использовать ОС всякий раз, когда это возможно, чтобы приложение выглядело согласованным для разных версий ОС. Я понимаю, что до-Vista версии, вероятно, не будут поддерживать это.

Я ищу решение для Windows Forms, но мне интересно, выставлено ли оно вообще на всех через Win32 API.

1 Ответ

11 голосов
/ 20 апреля 2010

Можно, но не через ProgressBar. Win7 также не использует PB для рисования этих метров, с окном не связан дескриптор окна. Это должно быть использование пользовательского рисунка. Это возможно и в WinForms с помощью класса VisualStyleRenderer. Однако не помогает то, что требуемые части и состояния визуального стиля не объявляются, даже в .NET 4.0.

Этот образец формы воспроизводит шкалу счетчика:

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.VisualStyles;

namespace WindowsFormsApplication1 {
  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
    }
    VisualStyleRenderer renderer = new VisualStyleRenderer(VisualStyleElement.ProgressBar.Bar.Normal);
    protected override void OnPaint(PaintEventArgs e) {
      renderer.SetParameters("PROGRESS", 11, 2);
      renderer.DrawBackground(e.Graphics, new Rectangle(10, 10, 200, 15));
      renderer.SetParameters("PROGRESS", 5, 4);
      renderer.DrawBackground(e.Graphics, new Rectangle(10, 10, 100, 15));
    }
  }
}

Я получил номера деталей и состояний из заголовочного файла SDK vsstyle.h.

...