2011-02-04 32 views
5

Chỉ tò mò về điều khiển được hiển thị bên dưới, đường thẳng với nhãn bên cạnh. Tôi đã cố gắng để tìm một điều khiển tương tự cho nó nhưng không có cũng không phải bất kỳ thiết lập hộp nhóm, vì vậy thay vào đó tôi chỉ cần thực hiện một GroupBox với chiều cao 2 mà sao chép nó.Điều khiển này là gì? Hộp nhóm hay không!

Nhưng có điều khiển hoặc cài đặt thực tế để thực hiện việc này không? Và kiểm soát thực tế được gọi là gì?

Internet Options property dialog

Trả lời

10

Spy++ cho chúng tôi biết đó thực sự là hai riêng biệt STATIC controls (tương tự như Label trong WinForms).

  • Đầu tiên chỉ đơn giản là điều khiển văn bản tĩnh thông thường có nội dung là "Trang chủ".

  • Cái thứ hai có bộ SS_ETCHEDHORZ style, làm cho nó vẽ thành đường 3D. Thật không may, khả năng thiết lập phong cách này không phải là tiếp xúc với chúng tôi từ bên trong WinForms.

Như bạn lưu ý trong câu hỏi, có một số hacks/cách giải quyết đó cho phép chúng tôi để đạt được một cái nhìn tương tự, như theo chiều dọc nén một điều khiển GroupBox, hoặc trọng phương pháp OnPaint của một điều khiển Label và sử dụng lớp ControlPaint để vẽ đường viền 3D. Họ làm việc, nhưng tôi chưa bao giờ thích chúng.

Nhưng bạn có thể thực sự tự thiết lập kiểu SS_ETCHEDHORZ để bạn có thể sao chép chính xác giao diện người dùng gốc. Đây là một lớp nhỏ thực hiện chính xác điều đó. Thêm nó vào dự án của bạn, biên dịch, và bạn sẽ thấy một điều khiển mới xuất hiện trong hộp công cụ của bạn được gọi là "HorizontalRule". Sử dụng nó giống như bạn sẽ kiểm soát bất kỳ khác!

public class HorizontalRule : Control 
{ 
    private const int FixedHeight = 2; 

    private const int WS_CHILD  = 0x40000000; 
    private const int WS_VISIBLE = 0x10000000; 
    private const int SS_ETCHEDHORZ = 0x00000010; 
    private const int SS_ETCHEDVERT = 0x00000011; 

    protected override CreateParams CreateParams 
    { 
     get 
     { 
      CreateParams cp = base.CreateParams; 
      cp.ClassName = "STATIC"; 
      cp.Style = WS_CHILD | SS_ETCHEDHORZ; 
      if (this.Visible) 
      { 
       cp.Style |= WS_VISIBLE; 
      } 
      return cp; 
     } 
    } 

    protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified) 
    { 
     height = FixedHeight; 
     base.SetBoundsCore(x, y, width, height, specified); 
    } 
} 

Bạn cũng có thể tìm thêm thông tin chi tiết và mã mẫu bổ sung here on CodeProject.

0

tôi đã cùng một vấn đề một vài năm trước đây và kết thúc chỉ vẽ một đường cho mục đích này. Trong thực tế, tôi thậm chí còn sử dụng một hình ảnh đường cố định có chiều rộng đủ dài để nó có thể được sử dụng trong mọi trường hợp bằng cách hiển thị phần (chiều rộng) yêu cầu của hình ảnh.

Giải pháp này đã hoạt động tốt cho tôi kể từ đó.

+1

Sử dụng hình ảnh sẽ là vấn đề nếu kiểu điều khiển thay đổi trong phiên bản Windows sau này. Kiểm soát của bạn sẽ vẫn có kiểu cũ. –

+0

Về mặt kỹ thuật, đó là sự thật, nhưng nếu nó chỉ là một dòng mỏng đơn giản thì không có nhiều "phong cách" với nó để nó không thành vấn đề. Dòng của tôi luôn được hiển thị độc đáo trong XP, Vista và Windows 7 cũng với các chủ đề khác nhau. – Peladao

+0

Đó là * rất có thể là một phiên bản tương lai của Windows thay đổi đáng kể phong cách của "dòng mỏng đơn giản" đó. Lưu ý có bao nhiêu hộp nhóm đã thay đổi từ chủ đề "Cổ điển" sang Luna trong Windows XP, và sau đó lại trong Aero trong Windows Vista. (Một lý do khác khiến việc sử dụng hộp nhóm sẽ không hoạt động để sao chép ví dụ trong câu hỏi ban đầu.) –

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