2010-04-19 4 views
8

Vista/7에서 Windows 탐색기 셸 창은 특수한 종류의 정적 진행률 표시 줄을 사용하여 하드 드라이브 공간을 표시합니다.미터 스타일 진행률 표시 줄을 사용하려면 어떻게해야합니까?

기본 스타일에서는이 막대가 파란색이며 애니메이션이 적용되지 않습니다. 또한 가득 차있을 때 빨간색으로 변합니다 (디스크 공간 부족).

메시징을 사용하여 Windows Forms ProgressBar 컨트롤에 상태를 Paused 및 Error (각각 노란색과 빨간색)로 업데이트하도록 지시 할 수 있습니다. 이는 정상적으로 작동하지만 여전히 진행 상황에 따라 다릅니다.

이 패턴은 진행 바가 없지만 가 진행 바 컨트롤을 사용하여 구현 다음 Windows User Experience Guidelines에서

, 그것이 구체적으로 진행 바의 "m"변종을 지적한다. 미터는 진한 바 진도 막대와 구별하기 위해 구별되는 모양을 가지고 있습니다.

그들은 "진행률 표시 줄 컨트롤을 사용하여 구현됩니다." 이런 식으로 행동하게하려면 컨트롤에 어떤 메시지를 보낼 수 있습니까?

나는 send messages for setting the bar color을 볼 수 있지만 시각적 스타일을 사용하면이 호출은 무시됩니다. ProgressBar의 원시 컨트롤에 대한 Windows API 설명서에는이 작업을 수행 할 수있는 방법이 제시되지 않았습니다. 나는 맞춤식 막대를 만드는 데 막 붙어 있습니까? 가능할 때마다 항상 OS를 활용하여 응용 프로그램이 다른 OS 버전에서 일관되게 나타나도록하고 싶습니다. Vista 이전 버전은 아마도이 기능을 지원하지 않을 것입니다.

Windows Forms 솔루션을 찾고 있는데, 심지어 에 노출 되어도 Win32 API를 통해이 노출되는지 궁금합니다.

답변

9

가능하지만 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)); 
    } 
    } 
} 

나는 vsstyle.h의 SDK 헤더 파일의 일부와 국가 번호를 가지고 :

이 샘플 양식 미터 줄을 재현합니다.

+0

% ProgramFiles % \ Microsoft SDKs \ Windows \ vx.xx \ Include에서 vsstyle.h를 찾을 수 있습니다. vx.xx는 버전 SDK가 설치되어있는 위치 (여러 개가있을 수 있음)입니다. http://en.wikipedia.org/wiki/Microsoft_Windows_SDK –

+1

또한이 문제를 재현하는 데 어려움이있는 사람에게 알려야합니다. 배경에 그려지는 것을 확인하십시오. 패널이나 기타 컨테이너가있는 경우 렌더러가 양식이 아닌 페인트 이벤트를 그려야합니다. 그렇지 않으면 패널이 겹치고 지금까지 알아야 할 패널이 실제로 투명하지 않으므로 표시 줄이 렌더링되지 않은 것처럼 보입니다. –

+0

이것을 실행하려고하면'renderer.SetParameters ("PROGRESS", 11, 2);'행에 '클래스, 부분 및 상태의 지정된 조합이 현재 비주얼 스타일에 의해 정의되지 않았습니다.'라는 메시지가 표시됩니다. –

관련 문제