2011-02-04 100 views
5

只要對下面顯示的控件感到好奇,那就是旁邊有標籤的直線。我試圖爲它找到一個類似的控件,但沒有任何組件框設置,所以我只是創建了一個高度爲2的GroupBox來複制它。這是什麼控制?組盒或不!

但是,有沒有一個實際的控制或設置來做到這一點?實際的控制是什麼?

Internet Options property dialog

回答

10

Spy++告訴我們這些實際上是兩個單獨的STATIC controls(類似於WinForms中的Label)。

  • 第一個只是一個常規的靜態文本控件,說「主頁」。

  • 第二個設置爲SS_ETCHEDHORZ style,這使得它繪製爲3D線。不幸的是,設置這種風格的能力沒有在WinForms中暴露給我們。

正如你在這個問題指出,有一些黑客/變通方法,使我們能夠實現類似的外觀,像垂直壓縮GroupBox控制,或覆蓋一個Label控制的OnPaint方法和使用ControlPaint類繪製一個3D邊框。他們工作,但我從來不喜歡他們。

但是你可以實際上自己設置SS_ETCHEDHORZ樣式,以便您可以精確複製原生UI。這是一個小班,完全是這樣。將它添加到您的項目中,進行編譯,您應該看到一個新的控件出現在您的工具箱中,名爲「Horizo​​ntalRule」。像使用其他任何控件一樣使用它!

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

您還可以找到更多詳細信息和附加示例代碼here on CodeProject

0

我幾年前有同樣的問題,最終只是擬定的目的的線。

事實上,我甚至使用了足夠長的寬度的一個固定線圖像,以便通過顯示圖像所需的部分(寬度)可以用於所有情況。

此解決方案對我來說工作得很好。

+1

如果未來版本的Windows中控件的樣式發生更改,則使用圖像將會出現問題。你的控制仍然會有舊的風格。 – 2011-02-04 12:05:43