2010-04-19 23 views
8

Trong Vista/7, cửa sổ trình bao Windows Explorer sử dụng một loại thanh tiến trình tĩnh đặc biệt để hiển thị không gian đĩa cứng.Tôi làm cách nào để sử dụng thanh tiến trình kiểu đồng hồ?

Với kiểu mặc định, thanh này có màu xanh dương và không hoạt ảnh. Nó cũng chuyển sang màu đỏ khi nó gần đầy (không gian đĩa thấp).

Sử dụng nhắn tin, tôi có thể thông báo cho Windows Forms ProgressBar để cập nhật trạng thái thành Tạm dừng và Lỗi (màu vàng và đỏ) tương ứng với tiến trình.

Trong Windows User Experience Guidelines, nó đặc biệt chỉ ra này "mét" biến thể của Bar Progress:

mẫu Đây không phải là một thanh tiến trình, nhưng nó được thực hiện bằng cách sử dụng những tiến bộ kiểm soát thanh. Mét có độ phân giải riêng biệt để phân biệt chúng với các thanh tiến trình đúng.

Họ nói rằng "được triển khai bằng cách sử dụng kiểm soát thanh tiến trình", vì vậy ... như thế nào? Tôi có thể gửi thông báo gì cho người kiểm soát để nó hoạt động theo cách này?

Tôi đã thấy rằng bạn có thể send messages for setting the bar color, nhưng tài liệu cho biết các cuộc gọi này bị bỏ qua khi kiểu trực quan được bật. Không có gì khác trong tài liệu Windows API cho các điều khiển ProgressBar thô dường như đề xuất một cách để làm điều này. Tôi chỉ bị mắc kẹt làm một thanh vẽ tùy chỉnh? Tôi thực sự muốn sử dụng hệ điều hành bất cứ khi nào có thể để ứng dụng sẽ xuất hiện nhất quán trong các phiên bản hệ điều hành khác nhau. Tôi nhận ra rằng các phiên bản trước Vista có lẽ sẽ không hỗ trợ điều này.

Tôi đang tìm giải pháp Windows Forms, nhưng tôi tự hỏi liệu nó có bị lộ ở tất cả qua Win32 API hay không.

Trả lời

9

Có thể, nhưng không phải thông qua ProgressBar. Win7 cũng không sử dụng PB để vẽ các mét đó, không có tay cầm cửa sổ nào được liên kết với thanh đó. Nó phải được sử dụng bản vẽ tùy chỉnh. Có thể trong WinForms cũng như với lớp VisualStyleRenderer. Tuy nhiên, một điều không giúp được là các phần và trạng thái trực quan yêu cầu không được khai báo, thậm chí không có trong .NET 4.0.

mẫu này tái tạo thanh mét:

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)); 
    } 
    } 
} 

tôi có một phần và nhà nước số từ tập tin tiêu đề vsstyle.h SDK.

+0

Đối với bất kỳ ai quan tâm, bạn có thể tìm vsstyle.h trong% ProgramFiles% \ Microsoft SDK \ Windows \ vx.xx \ Bao gồm nơi vx.xx là bất kỳ phiên bản SDK nào được cài đặt (bạn có thể có một vài phiên bản). http://en.wikipedia.org/wiki/Microsoft_Windows_SDK –

+1

Cũng nên chỉ ra cho bất kỳ ai gặp sự cố khi sao chép thông báo này: chú ý rằng điều này rút ra nền. Nếu bạn có các bảng hoặc bất kỳ vùng chứa nào khác, bạn sẽ muốn trình kết xuất vẽ trên các sự kiện sơn THEIR, chứ không phải biểu mẫu. Nếu không, bảng điều khiển chồng lên nhau và, như bạn nên biết bây giờ, các bảng không thực sự trong suốt, do đó, nó sẽ trông giống như thanh của bạn đã không hiển thị. –

+0

Khi tôi cố gắng chạy điều này, tôi nhận được 'Cho sự kết hợp của Class, Part và State không được định nghĩa bởi kiểu trực quan hiện tại.' trên dòng' renderer.SetParameters ("PROGRESS", 11, 2); '. –

Các vấn đề liên quan