2011-02-04 3 views
5

Просто интересно, как показано ниже, прямая линия с меткой рядом с ней. Я попытался найти аналогичный элемент управления для него, но не было ни одного параметра группы, поэтому вместо этого я просто создал GroupBox с высотой 2, которая его реплицирует.Что это за контроль? Групповой ящик или нет!

Но существует ли реальный контроль или настройка для этого? И что называется фактическим контролем?

Internet Options property dialog

ответ

10

Spy++ говорит нам, что это на самом деле два отдельных STATIC controls (аналогично Label в WinForms).

  • Первый - это просто обычный статический текстовый элемент управления, который гласит «Главная страница».

  • Второй имеет набор SS_ETCHEDHORZ style, который заставляет его рисовать как трехмерную линию. К сожалению, возможность устанавливать этот стиль не предоставляется нам изнутри WinForms.

Как вы отметили в вопросе, есть некоторые писаки/обходные пути, которые позволяют нам достичь такого же вида, как и вертикально сжимает GroupBox управления или перекрывая OnPaint метода Label контроля и используя ControlPaint класс для рисования трехмерной границы. Они работают, но я их никогда не любил.

Но вы можете сами установить стиль SS_ETCHEDHORZ, чтобы вы могли точно реплицировать собственный пользовательский интерфейс. Вот небольшой класс, который делает именно это. Добавьте его в свой проект, скомпилируйте, и вы увидите, что новый элемент управления отображается в панели инструментов под названием «HorizontalRule». Используйте его так же, как и любой другой элемент управления!

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. У вашего управления все еще будет старый стиль. –

+0

Технически это правда, но если это просто простая тонкая линия, то для нее не так уж много «стиля», поэтому это не имеет значения. Моя линия последовательно демонстрирует красиво в XP, Vista и Windows 7 также с разными темами. – Peladao

+0

Это очень * возможно, что будущая версия Windows резко изменит стиль этой «простой тонкой линии». Обратите внимание, сколько групповых ящиков изменилось с темы «Классика» на Luna в Windows XP, а затем снова в Aero в Windows Vista. (Еще одна причина, почему использование группового окна не будет работать для дублирования примера в исходном вопросе.) –

Смежные вопросы