Vb net как синхронизировать прокрутку панелей splitcontainer
Перейти к содержимому

Vb net как синхронизировать прокрутку панелей splitcontainer

  • автор:

Vb net как синхронизировать прокрутку панелей splitcontainer

Для ввода и редактирования текста предназначены текстовые поля — элемент TextBox. Так же как и у элемента Label текст элемента TextBox можно установить или получить с помощью свойства Text.

По умолчанию при переносе элемента с панели инструментов создается однострочное текстовое поле. Для отображения больших объемов информации в текстовом поле нужно использовать его свойства Multiline и ScrollBars . При установке для свойства Multiline значения true, все избыточные символы, которые выходят за границы поля, будут переноситься на новую строку.

Кроме того, можно сделать прокрутку текстового поля, установив для его свойства ScrollBars одно из значений:

Элемент TextBox в Windows Forms

  • None : без прокруток (по умолчанию)
  • Horizontal : создает горизонтальную прокрутку при длине строки, превышающей ширину текстового поля
  • Vertical : создает вертикальную прокрутку, если строки не помещаются в текстовом поле
  • Both : создает вертикальную и горизонтальную прокрутку

Автозаполнение текстового поля

Элемент TextBox обладает достаточными возможностями для создания автозаполняемого поля. Для этого нам надо привязать свойство AutoCompleteCustomSource элемента TextBox к некоторой коллекции, из которой берутся данные для заполнения поля.

Итак, добавим на форму текстовое поле и пропишем в код события загрузки следующие строки:

public partial class Form1 : Form < public Form1() < InitializeComponent(); AutoCompleteStringCollection source = new AutoCompleteStringCollection() < "Кузнецов", "Иванов", "Петров", "Кустов" >; textBox1.AutoCompleteCustomSource = source; textBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend; textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource; > >

Автозаполнение текстового поля

Режим автодополнения, представленный свойством AutoCompleteMode , имеет несколько возможных значений:

  • None : отсутствие автодополнения
  • Suggest : предлагает варианты для ввода, но не дополняет
  • Append : дополняет введенное значение до строки из списка, но не предлагает варианты для выбора
  • SuggestAppend : одновременно и предлагает варианты для автодополнения, и дополняет введенное пользователем значение

Перенос по словам

Чтобы текст в элементе TextBox переносился по словам, надо установить свойство WordWrap равным true . То есть если одно слово не умещается на строке, то но переносится на следующую. Данное свойство будет работать только для многострочных текстовых полей.

Ввод пароля

Также данный элемент имеет свойства, которые позволяют сделать из него поле для ввода пароля. Так, для этого надо использовать PasswordChar и UseSystemPasswordChar .

Свойство PasswordChar по умолчанию не имеет значение, если мы установим в качестве него какой-нибудь символ, то этот символ будут отображаться при вводе любых символов в текстовое поле.

Свойство UseSystemPasswordChar имеет похожее действие. Если мы установим его значение в true , то вместо введенных символов в текстовом поле будет отображаться знак пароля, принятый в системе, например, точка.

Событие TextChanged

Из всех событий элемента TextBox следует отметить событие TextChanged , которое срабатывает при изменении текста в элементе. Например, поместим на форму кроме текстового поля метку и сделаем так, чтобы при изменении текста в текстовом поле также менялся текст на метке:

public partial class Form1 : Form < public Form1() < InitializeComponent(); textBox1.TextChanged += textBox1_TextChanged; >private void textBox1_TextChanged(object sender, EventArgs e) < label1.Text = textBox1.Text; >>

Vb net как синхронизировать прокрутку панелей splitcontainer

Элемент GridSplitter помогает создавать интерфейсы наподобие элемента SplitContainer в WinForms, только более функциональные. Он представляет собой некоторый разделитель между столбцами или строками, путем сдвига которого можно регулировать ширину столбцов и высоту строк. В качестве примера можно привести стандартный интерфейс проводника в Windows, где разделительная полоса отделяет древовидный список папок от панели со списком файлов. Например,

Элемент GridSplitter в WPF

Двигая центральную линию, разделяющую правую и левую части, мы можем устанавливать их ширину.

Итак, чтобы использовать элемент GridSplitter, нам надо поместить его в ячейку в Gride. По сути это обычный элемент, такой же, как кнопка. Как выше, у нас три ячейки (так как три столбца и одна строка), и GridSplitter помещен во вторую ячейку. Обычно строка или столбец, в которые помещают элемент, имеет для свойств Height или Width значение Auto .

Если у нас несколько строк, и мы хотим, чтобы разделитель распространялся на несколько строк, то мы можем задать свойство Grid.RowSpan :

В случае, если мы задаем горизонтальный разделитель, то тогда соответственно надо использовать свойство Grid.ColumnSpan

Затем нам надо настроить свойства. Во-первых, надо настроить ширину (Width) для вертикальных сплитеров и высоту (Height) для горизонтальных. Если не задать соответствующее свойство, то сплитер мы не увидим, так как он изначально очень мал.

Затем нам надо задать выравнивание. Если мы хотим, что сплитер заполнял всю высоту доступной области (то есть если у нас вертикальный сплитер), то нам надо установить для свойства VerticalAlignment значение Stretch .

Если же у нас горизонтальный сплитер, то надо установить свойство HorizontalAlignment в Stretch

Также в примере выше используется свойство ShowsPreview . Если оно равно False, то изменение границ кнопок будет происходить сразу же при перемещении сплитера. Если же оно равно True, тогда изменение границ будет происходить только после того, как перемещение сплитера завершится, и при перемещении сплиттера мы увидим его проекцию.

В отличие от элемента SplitContainer в WinForms, в WPF можно установить различное количество динамически регулируемых частей окна. Немного усовершенствуем предыдущий пример:

        Левая панель  Правая панель  Нижняя панель   

Здесь у нас сразу два сплитера: один между двумя верхними и нижней панелями, а второй — между правой и левой панелями.

Vb net как синхронизировать прокрутку панелей splitcontainer

Примечание: Данная статья публикуется
с небольшими сокращениями,
дополнениями и исправлениями.
Оригинал статьи находится на сайте http://www.rsdn.ru/article/dotnet/winforms2.xml

Автор: Олег Михайлик

Введение

В новой версии Visual Studio .NET 2005 ожидается несколько коренных изменений. Чтобы узнать, чем же в новой версии можно будет «скрасить» свои будни, я исследовал библиотеку System.Windows.Forms.dll (в предварительной версии Community Technical Preview). Изменений в WinForms нашлось немало — наберётся где-то на небольшой праздник.

Новые концепции и новые контролы

Здесь, например, стоит упомянуть развитие понятия Layout, усовершенствование связывания (DataBinding), расширенную поддержку тем XP и другие изменения.

Усовершенствования в контролах

В этом разделе — как крупные, так и небольшие, но полезные доработки существующих контролов. Практически во всех контролах так или иначе детализированы свойства, добавлены новые функции. Например, большинство контролов в новой версии поддерживают режим OwnerDraw.

Поддержка ActiveX

Два действительно новых контрола, WebBrowser и ActiveDocumentHost, относятся к взаимодействию с умирающим миром ActiveX. В новой версии вы сможете расположить на форме HTML-страницу или OLE-документ одним-двумя щелчками мыши.

Частные доработки библиотеки WinForms

Здесь достойны упоминания добавление новых методов в классе Application, двойная буферизация и многое другое.

Темы Windows XP

Есть две новости — плохая и хорошая. Плохая: в новой версии придётся выбросить на помойку все полюбившиеся приёмы, при помощи которых вы приучали контролы к темам Windows XP.

Вы привыкли устанавливать FlatStyle в значение System? Теперь это бесполезное занятие.

А вот хорошая новость: теперь все контролы автоматически — врождённо — поддерживают темы Windows XP. Вам не понадобятся ваши устаревшие приёмчики, потому что темы работают и без этой самодеятельности!

Обидно, да? Нет, это ещё рано делать выводы. Подумайте вот над какой функцией.

Включить/выключить поддержку тем теперь можно прямо на ходу, во время работы приложения. Не верится? Ничего, это еще не все.

Любители спецэффектов могут включать-выключать темы отдельно для клиентской и неклиентской части окна. Грубо говоря, клиентская часть окна — это кнопочки и всякие чек-боксики. А неклиентская часть — скроллбар и заголовок формы. А вот как это выглядит:

Переключение тем производится установкой свойства VisualStylesState в объекте Application. На рисунках можно увидеть особенности каждого режима: каждая кнопка устанавливает своё значение VisualStylesState.

Внутренний механизм отрисовки контролов немного переделан для использования тем. Для каждого стандартного контрола, например, Button введён специальный класс-рендерер, ответственный за отрисовку этого контрола. Для Button это ButtonRenderer. Пока по документации не очень ясно, как можно ещё использовать такой Renderer, и даёт ли этот механизм какие-то дополнительные бонусы, кроме собственно поддержки тем.

Плюс к тому, добавлено новое пространство имён, System.Windows.Forms.VisualStyles. Здесь можно найти порядка сотни перечислений (enum), которые, по-видимому, используются внутри логики рисования. Эти перечисления указывают такие особенности, как вдавленное/приподнятое отображение, всяческие градиенты, эффекты размытых теней и пр. Прямого применения для этой информации я не вижу. Возможно, в окончательной версии .NET Framework все перечисления из VisualStyles будут скрыты (internal).

Взаимное расположение (Layout)

В новой версии .NET Framework контролы WinForms приобретут некоторые свойства HTML-контролов – например, Padding, Margin и AutoSize.

Padding и Margin

В классе Control (а значит во всех контролах) введены два новых свойства. Те, кто знаком со стилями HTML/CSS уже поняли, для чего это используется. Это отступы — внутри и снаружи контрола.

Padding задаёт внутренний «отступ», как бы «поля». Примерно вот так:

Margin должен задавать такие же расстояние между контролом и его соседями. К сожалению, пока это свойство работает только в Design-Time, например, при перетаскивании контрола на форме.

Свойства Padding и Margin, как видно из рисунка, будут работать не только для плоских контролов-контейнеров вроде Panel, но и для любых контролов, содержащих «контент». В том числе для Button, Label и др.

FlowLayoutPanel, TableLayoutPanel

Два новых контрола-контейнера предназначены для автоматического расположения контролов. FlowLayoutPanel располагает контролы один за другим: слева направо и сверху вниз. TableLayoutPanel располагает контролы в колонки, образуя ячейки некой виртуальной таблицы.

Таким образом, если вы начнёте помещать какие-нибудь кнопки и надписи в FlowLayoutPanel, они автоматически выстроятся в рядочек.

Вещь явно полезная, но сценарий использования в реальной жизни привести не могу. Придумайте сами, зачем это нужно.

SplitContainer

Этот, безусловно, полезный контрол — один из примеров того, как в новой версии Visual Studio поставлена работа над повышением производительности труда. SplitContainer представляет собой две панели и сплиттер-разделитель «в одном флаконе».

Казалось бы, сделать такую комбинацию из Panel и Splitter можно за пару минут. Но почему не сберечь эти пару минут и не избавить людей от рутины?

Сам контрол устроен несложно. При изменении размеров окна положение сплиттера может измениться пропорционально, или одна из панелей будет «зафиксирована», а вторая начнёт «растягиваться». Можно также скрыть одну из панелей.

А контролы-панели доступны через свойства Panel1 и Panel2. Почему не PanelLeft и PanelRight? Да потому, что SplitContainer может быть разделен как по вертикали, так и по горизонтали.

Связывание (DataBinding)

Изменения в DataBinding пока не приняли законченных очертаний, их функциональность ещё недостаточно документирована. Опишу только направления разработок.

generic-коллекции

Очевидно, с появлением generic-интерфейсов и generic-коллекций, DataBinding должен быть доработан для их поддержки. И здесь есть один головоломный момент.

Обычное «старое» связывание работает с помощью интерфейса IList. Например, какой-нибудь ListBox может отобразить элементы любого списка IList как строки. Это возможно потому, что все объекты, реализующие IList, можно привести к одному общему интерфейсу.

Но объекты, реализующие IList невозможно привести к общему интерфейсу. У одного класса это может быть IList, у другого – IList, и эти интерфейсы несовместимы! Мало того, один и тот же класс может реализовать и IList, и IList, и IList. Какой же интерфейс тогда нужно использовать для отображения в контроле?

Очевидно, ребята из Микрософта как-то справятся с этой ситуацией, но документация пока этого не проясняет.

XML-источники

Одним из основных «направлений удара» в новом .NET Framework 2.0 будет работа с XML, долгожданный System.XML v2.0. Скорость работы с XML-данными возрастёт значительно, добавится поддержка последних стандартов, новых методов обработки — и многое другое. Со стороны WinForms эту инициативу обещает поддержать возможность прямого DataBinding’а между XML-данными и контролами.

Изменения в ADO.NET

В новом ADO.NET в придачу к DataTable появится класс DbTable. Это и другие смежные изменения позволят (по крайней мере, это анонсировалось) автоматизировать получение и отправку данных между клиентом и сервером. Там, где сейчас нужно создавать DataAdapter, вручную вызывать метод Fill, — теперь можно будет просто настроить некоторые связи в дизайнере, и данные будут доставляться автоматически.

Для этого должна быть доработана как ADO.NET, так и WinForms-составляющая.

Гриды

В первой версии .NET Framework компания Микрософт предлагала только один контрол для отображения табличных данных, DataGrid. Почему один? Меньше — не имело смысла. Видимо, аналитики сочли этот контрол подходящим решением на все случаи жизни.

Итак, потребность в новом табличном контроле, решающем проблемы DataGrid, будет удовлетворена с выходом новой версии .NET Framework.

Впрочем, в Visual Studio Codename Widbey (PDC build) был похожий контрол с названием Table. Так сказать, бедный родственник нашего перспективного вундеркинда GridView. Он был помечен атрибутом Obsolete и объявлен устаревшим ещё в альфа-версии.

В теперешней предварительной версии Visual Studio 2005 CTP тоже есть свой «бедный родственник». Некий DataGridView — то ли это действительно возможное действующее лицо, то ли такой же мимолётный фантом, как и почивший Table.

Складывается впечатление, что поветрие повального гридостроительства не обошло стороной даже разработчиков из Микрософта. Ну что ж, пока побеждает команда GridView. Интерестно, какой приз у них назначен победителю?

DataNavigator

Этот контрол легко может вызвать приступ дежа-вю у знатоков Дельфи. Функция DataNavigator — управлять позицией и состоянием «курсора» коллекций и таблиц. Сейчас точные свойства и внешний вид этого контрола ещё не устоялся, поэтому я не буду его детально описывать. Предполагается, что контрол будет представлять собой набор кнопок типа «Вперёд», «Назад», «Добавить», «Удалить».

DataContainer

Рассказать об этом контроле проще всего на простом примере.

Я пишу программы для торговли, и в таких программах почти всегда требуется отображать форму-карточку товара: название, цена, и другие свойства. Это обычный подход. Если вы пишете учёт кадров, у вас будет карточка сотрудника. Автоматизация производства — карточка узла или детали.

Как мы обычно делаем такие формы-карточки? Очень просто: берём контролы — Label, TextBox, ComboBox — и кладём их на форму в каком-то порядке по вкусу. Но на самом деле это работа интересна только первые два часа.

DataContainer создан, чтобы выполнить эту скучную работу за вас. Вы указываете источник данных, назначаете стиль, после чего DataContainer создаёт набор полей и располагает его в более-менее прилизанном порядке.

Панели меню, кнопок и статуса

Что каждый программист-новичок начинает делать после создания объёмных Label с эффектом тени? Конечно, тулбары в стиле Office XP и Office 2003. Теперь новичкам придётся мастерить другие велосипеды, потому что в .NET Framework 2.0 будут входить готовые классы ToolStrip, MenuStrip и StatusStrip. Впрочем, точные названия могут ещё поменяться: в предыдущей версии тот же ToolStrip назывался WinBar.

Внешний вид панелек один в один похож на Office 2003. Впрочем, можно переключить его на более унылый и стандартный, если ваш клиент страстно привержен Windows 98.

Я не буду описывать детально свойства и особенности этих классов, скорее всего это ещё большой «subject to change». Приведу только картинки, думаю, это даст достаточное представление:

Звук

Классам SoundPlayer, SystemSound, SystemSounds просто на роду написано производить звуки. Этим они и занимаются по воле породившего их Микрософта. SoundPlayer может проигрывать любые WAV-файлы, но не подерживает остальные форматы — MIDI, MP3, WMA.

SystemSounds содержит набор системных звуков (SystemSound), примерно так же, как класс Brushes содержит набор кистей Brush.

Каждый отдельный системный звук — экземпляр класса SystemSound, который можно проиграть при помощи метода Play. Одновременно может играть только один системный звук И только один SoundPlayer.

Для проигрывания классу SoundPlayer задаётся или путь к файлу, или бинарный поток, Stream. Что это даёт? Поясняю на пальцах: мы сможем встроить звук в своё приложение как ресурс, и в нужный момент проиграть этот звук в SoundPlayer. Причём это может быть звук, сжатый кодеком MP3 или ему подобным.

Усовершенствования в контролах

Изображения

Несколько общих усовершенствований, связанных с изображениями, они касаются большинства контролов.

Фоновое изображение

В .NET Framework v1.0 и v1.1 фоновое изображение BackgroundImage всегда отображалось в режиме «Tile», то есть заполняло весь фон с повторением. Теперь можно выбрать способ заполнения для фона: Tile, Center, Stretch и Zoom. Чтобы не путаться: Zoom производит пропорциональное масштабирование по обеим координатам, а Stretch растягивает изображение по размерам контрола.

ImageList

Для получения иконки из ImageList в .NET Framework использовались индексы. В этом есть своё неудобство: когда прописываешь индекс нужной иконки в коде, легко спутать число 18 и 19. А если в ImageList потом добавится иконка? А если, не дай бог, придётся удалить иконку? Индексы «поедут» и будут отображаться не те иконки, которые задуманы.

Поэтому в новой версии введены строковые ключи для доступа к иконкам. То есть, иконку можно получить не только по индексу в списке, но и по ключу-имени. Ключ задаётся произвольно при заполнении ImageList.

Соответственно, в тех объектах, которые раньше ссылались на индекс иконки в ImageList, появились свойства ImageKey, ссылающиеся на строковый ключ иконки. Например, свойство ListViewItem.ImageKey — аналог ListViewItem.ImageIndex.

Улучшился дизайнер ImageList-а, теперь он позволяет добавлять за один прием любое количество картинок, а не одну, как раньше.

ImageTextRelation

Иногда в контроле требуется отобразить одновременно надпись и небольшую иконку. Это может быть, например, кнопка с картинкой — Button. Или ссылка — LinkLabel. Для отображения иконки над, под или справа-слева от текста, заведено новое свойство. В принципе, похожего вида можно было добиться и раньше, но теперь стало куда аккуратнее.

PictureBox

Дополнения в PictureBox позволяют загружать и отображать изображение асинхронно. В свойстве ImageLocation указывается адрес картинки, и она начинает загружаться (с локального диска, по сети или с указанного URL) в фоновом режиме.

Пока картинка загружается, отображается иконка-заместитель, как в InternetExplorer. После окончания загрузки эта иконка сменяется самой картинкой. Если загрузка не завершилась успешно, отображается соответствующая иконка.

Иконки-заметстители задаются свойствами InitialImage и ErrorImage, а по умолчанию выбраны такие же иконки, как в IE.

Можно запретить этот механизм асинхронной загрузки изображения — тогда после установки ImageLocation контрол будет загружать картинку синхронно, блокируя пользовательский интерфейс.

Если не использовать свойство ImageLocation, PictureBox работает, как и раньше — отображает картинку из свойства Image.

Form

События FormClosing, FormClosed

Эти события дополнительно показывают причину закрытия формы: нажатие «крестика», закрытие по Alt+F4, закрытие через Task Manager.

Flash, StopFlash

Мигание заголовка формы — в панели задач и самого заголовка окна.

RestoreBounds

Когда форма свёрнута (минимизирована), её предыдущие, до минимизации, размеры теперь будут доступны в свойстве RestoreBounds.

AutoComplete

Классы EditBox и ComboBox в новой версии поддерживают функцию AutoComplete. При этом можно выбрать «источник» вариантов для AutoComplete — каталоги/файлы, просмотренные адреса из кеша веб-страниц или созданный вручную набор значений.

Button

Добавлены специфические свойства, отвечающие за Flat-режим отображения. Это BorderColor, BorderSize и MouseOverBackColor. Впрочем, Flat-режим теряет свою привлекательность с приходом автоматической поддержки тем Windows XP.

ListView, TreeView

OwnerDraw

В режиме OwnerDraw контрол отрисовывает все элементы путём вызова специального события. При этом программист должен больше потрудиться, но за это он получает большие визуальные возможности. Например, это позволяет в табличном виде ListView рисовать значение какого-нибудь показателя в отдельной ячейке в виде «градусника». Или выделять текущий элемент не цветом Highlight, а красивым переливающимся градиентом. Режим OwnerDraw в .NET v2.0 поддерживают и ListView, и TreeView.

Всплывающие подсказки

В первой версии .NET Framework всплывающие подсказки можно было указать только для всего контрола ListView или TreeView в целом. Теперь каждый элемент имеет свою отдельную всплывающую подсказку, что совершенно логично.

Виртуальный режим ListView

Для отображения элементов в контроле ListView нужно заполнить коллекцию Items объектами ListViewItem. Иногда список отображаемых элементов может заполняться из базы данных, при этом элементов в таблице может быть много. С увеличением количества до сотен, тысяч и более, механизм заполнения через ListViewItem становится действительно очень медленным.

В новой версии .NET Framework у контрола ListView появился новый альтернативный способ отображения элементов, так называемый виртуальный режим. При переходе в виртуальный режим контрол перестаёт хранить в себе набор элементов. Теперь контрол только обращается к своим событиям за получением данных строк.

ToolTip

Для компонента-всплывающей подсказки добавлена возможность произвольной отрисовки, то есть OwnerDraw. Вы можете отображать в подсказке к любому контролу специфическую картинку, или график, или что вообще придёт в голову — используя все средства System.Drawing.

Кроме того, теперь ToolTip поддерживает вид «баллона».

Menu

Изменения в классах MainMenu, ContextMenu и MenuItem затрагивают одну функцию — отображение иконок в пунктах меню. Впрочем, с выпуском новой версии Микрософт настоятельно советует переходить к новому классу MenuStrip вместо MainMenu. Внешний вид и возможности MenuStrip действительно лучше старого MainMenu.

ListBox

Одно небольшое изменение — возможность настройки отступов позиций табуляции. Если вы не используете ListBox для создания таблиц, это вас не очень заинтересует. Хотя на самом деле тут есть один интересный момент.

Для хранения отступов табуляции (то есть чисел) используется внутренний класс ListBox.IntegerCollection. Это коллекция элементов типа int, другими словами — коллекция ValueType. Как известно, самым нашумевшим изменением в .NET Framework 2.0 стали generic-и, и одним из их преимуществ считается способность создавать типизированные коллекции классов ValueType. Логично было бы предположить, что для хранения IntegerCollection будет использоваться какой-нибудь generic-класс, например, List,.

На самом деле никаких generic-ов в этом случае разработчики не применили. Ну что ж, им виднее.

MaskedEditBox

Как и SplitContainer, этот контрол наверняка окажется полезным каждому разработчику. В то же время он совершенно не претендует на революционность.

Уже из названия понятно, что это доработанный EditBox для ввода и контроля форматированных данных (это могут быть даты, телефоны, идентификационные коды и т.п). Контрол сделан на совесть, разработчики продумали кучу тонких деталей. Например, есть такие свойства:

  • BeepOnError – при вводе неверного символа контрол будет пищать.
  • Culture – для форматов даты, времени можно указать конкретную культуру.
  • PromptChar – символ-заполнитель для отображения требуемых позиций.

Основным же свойством является Mask — формат заполнения. Для упрощения заполнения маски в дизайнере предлагаются некоторые часто используемые форматы. Правда, тут Микрософт отошёл от своего стремления к глобализации — среди форматов предлагаются в основном разнообразные афроамериканские ZIP-коды и подобная незатейливая политкорректность. Хитом продаж станет, конечно, формат «Time: European/Military». Как видно, «на той стороне Земли» Европа считается главным милитаристом.

Свойство Tag

В новой версии свойство Tag есть не только у компонентов. Оно добавлено и во множество других объектов.

Поддержка ActiveX

ActiveDocumentContainer

Этот контрол позволит расположить на форме любой OLE-документ. До появления .NET Framework такая функциональность считалась сама собой разумеющейся. Visual Basic и Delphi поддерживали подобные контролы чуть ли не с первой версии. Хотя нет, всё-таки со второй. Ну что ж, .NET Framework тоже будет иметь такой контрол во второй версии.

Поддерживается стандартный букет функций: редактирование in-place, загрузка из файла и т.п. Мода на OLE-объекты уже давно прошла, но для некоторых специфических задач контрол действительно будет полезен.

WebBrowser

Этот контрол тоже скорее восполнение старых недоделок, чем что-то революционно новое. В первой версии .NET Framework путём несложных манипуляций можно было положить на форму элемент AxWebBrowser. При этом в раздел References проекта автоматически добавлялись две ссылки. Иногда это сопровождалось забавными сбоями.

Теперь потребность в самодельных велосипедных WebBrowser-контролах отпала, Микрософт даёт нам готовый, так сказать, авторизированный WebBrowser. Этот контрол, конечно же, является обёрткой над MSHTML.dll, то есть предоставляет доступ к стандартному ядру рендеринга Internet Explorer. Ни о каком managed HTML browser речь не идёт.

Интересной и удобной особенностью WebBrowser является доступ к содержимому загруженных страниц. Чтобы не создавать зависимости от библиотеки Microsoft.mshtml.dll, был сделан небольшой набор классов-оберток, таких как HtmlDocument, HtmlWindow и т.п. Они предоставляют урезанную и упрощённую функциональность обычного DHTML DOM. Кроме того, для каждого такого объекта можно получить и его полный вариант, соответствующий RCW-объект из библиотеки Microsoft.mshtml.

Частные доработки библиотеки WinForms

Дополнения в классе Application

OpenForms

В форумах часто спрашивают, как перебрать все открытые на экране формы. Видимо, эти вопросы дошли до нужных ушей и в новой версии на этот вопрос появится ответ. Application.OpenForms.

Restart

Этот метод запускает новый процесс с теми же аргументами, что и текущий (System.Diagnostics.Process) и закрывает текущее приложение (Application.Exit). Вопрос — зачем это нужно?

Я думаю, этот метод нужен для новой технологии установки распространения приложений ClickOnce. Как известно, ClickOnce позволит приложениям автоматически обновляться через интернет или локальную сеть. Когда обновления будут скачаны, очевидно, приложение должно быть перезагружено для запуска новой версии. Здесь и пригодится Application.Restart.

И ещё одна поучительная особенность реализации этого метода. Программист из Микрософт, который написал код этого метода, был непростой малый. Чтобы собрать строки-аргументы нового процесса в одну целую строку, как того требует класс Process, он использовал StringBuilder.

Такой подход рекомендуют лучшие собаководы, но парень на этом не остановился. Хотя, возможно, это была девушка. Тогда я снимаю шляпу перед женской логикой. Итак, кто бы это ни был, он при инициализации StringBuilder рассчитал примерный требуемый размер — из расчёта 16 байт на один аргумент.

UseWaitCursor

Когда программа затевает длительную операцию, хорошим тоном считается отображение курсора-песочных часов. Свойство Application.UseWaitCursor позволяет глобально установить для всех контролов такой курсор.

PowerState

В новой версии .NET Framework появится ряд свойств и событий, позволяющих как отслеживать, так и вызывать состояния компьютера Suspend и Hibernate. Кроме того, при работе с мобильной техникой можно будет реагировать на степень разрядки батарей.

RTL

Right To Left — это способ, которым выражают свои мысли два народа-антагониста. Арабы и евреи пишут «в другую сторону». В новой версии WinForms можно будет учитывать эту особенность и соответственно изменять положение внешний вид каких-нибудь контролов.

SystemInformation

Подробности оформления

Можно в целом описать эти новые свойства так. В операционных системах Windows XP и Windows 2003 Server есть настройка внешнего вида. Можно включить/выключить анимацию меню, тени, прозрачность иконок и т.п. И вот эти и другие похожие настройки и отражаются в новых свойствах класса SystemInformation:

  • Animation/Shadow/Fade/FlatMenu Enabled
  • MouseHover/Speed/Wheel и т.д.
  • BorderMultiplierFactor, FocusThickness
  • CaretBlinkTime, CaretWidth
  • FontSmoothingContrast/Type
  • IconSpacing

TerminalServerSession

Во времена Windows NT функциональность терминального доступа поставлялась за отдельную плату. Очень и очень отдельную плату. Но со временем эта возможность появилась даже в базовых версиях серверных ОС. А начиная с Windows XP терминальные функции окончательно ассимилировались во всю линейку операционных систем Windows.

Неудивительно, что новая версия .NET Framework даёт возможность определить факт работы «под терминалом». Кстати, Микрософт советует в этом случае отключать в программе «красивости» и «рюшечки» — для улучшения производительности.

Вполне вероятно, в .NET Framework 2.0 появятся и другие, более глубокие функции управления терминальными сессиями.

Clipboard

В классе Clipboard появились функции, упрощающие копирование и вставку текста, изображений, аудио-потоков. Это всего лишь упрощение, не более — то же самое можно было сделать и раньше, всего на одну строчку сложнее.

Keyboard

Control.IsKeyLocked

Сначала я подумал, что эта функция позволит определить состояние нажатия любой клавиши. Но эксперименты показали, что IsKeyLocked работает только с клавишами-модификаторами типа CapsLock, NumLock и т.п. Вообще-то для этого есть свойство ModifierKeys. По крайней мере вас теперь этот двусмысленный метод не обманет.

Новые клавиши в Keys

Добавились клавиши Oem1-Oem7, Oem102. Странно, что в первой версии была только клавиша Oem8.

Мышь

Кроме Click и DoubleClick появились события MouseClick и MouseDoubleClick (события Click и DoubleClick не позволяют получить координаты мыши в момент щелчка).

Асинхронность

Метод Invoke для асинхронного вызова теперь понимает переменный список аргументов. Добавился только модификатор params.

DoubleBuffer

Двойная буферизация реализована в .NET Framework первой версии. Для этого используется метод SetStyle и флажок DoubleBuffer. В новой версии, кажется, этот механизм дополнительно оптимизирован.

Фактически, флаг DoubleBuffer помечен как нежелательный, Obsolete, и заменён OptimizeDoubleBuffer. Также добавлено свойство DoubleBuffered (оно всего лишь устанавливает/снимает тот же самый флажок OptimizeDoubleBuffered).

В чём заключается эта оптимизация, мне неизвестно. Наверняка мы увидим эту информацию в документации к финальной версии Visual Studio 2005.

Также следует знать, что в библиотеке System.Drawing.dll появился новый класс BufferedGraphics. Как следует из названия, он участвует в буферизации отрисовки контролов. Вообще, новшества System.Drawing не ограничиваются только BufferedGraphics. Например, теперь эта библиотека содержит возможность рисования не только при помощи GDI+, но и при помощи GDI — более старого, но (теоретически) более быстрого API. Если же вернуться к BufferedGraphics, то этот класс использует оба API.

Безопасность

Метод WndProc всех контролов теперь помечен атрибутом безопасности, требующим специальных привилегий для перегрузки. Ранее такой атрибут был только у базового класса Control. Видимо, это сочли не совсем правильным с точки зрения безопасности.

Очень похоже на то, что утилиту FxCop теперь масштабно применяют в Микрософте при разработке на всех уровнях, в том числе и в FCL.

Изменение размера

При изменении размера вызываются два дополнительных метода: ResizeBegin и ResizeEnd. Это позволяет провести дополнительные проверки и пересчёты. Эти методы упрощают работу контролам FlowLayoutPanel и TableLayoutPanel. Кроме них, появился метод SizeFromClientSize, тоже управляющий размерами. Думаю, его назначение очевидно из названия – он рассчитывает необходимый размер контрола или формы так, чтобы размер клиентской области соответствовал размерам, переданным в этот метод. Следующий пример выставляет размер формы, клиентская область которой точно соответствует размеру кнопки (кнопка при этом сдвигается в левый верхний угол).

Скроллинг

Добавлен метод ScrollWindow, вызывающий прокрутку окна на указанное количество пикселей. Ещё два свойства, AutoRelocate и AutoScrollOffset, не документированы.

Итоги

Моя статья представляет собой небольшую «разведку» будущего плацдарма WinForms 2.0. Конечно, много ещё может измениться. Цель такой разведки — не абсолютно достоверные данные о новой версии .NET Framework, а проявление ключевых направлений. Я надеюсь, эти изыскания помогут и вам заранее освоиться с новыми функциями.

Split Container Класс

Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

Представляет элемент управления, состоящий из подвижной строки, которая разделяет область отображения контейнера на две панели с изменяемыми размерами.

public ref class SplitContainer : System::Windows::Forms::ContainerControl
public ref class SplitContainer : System::Windows::Forms::ContainerControl, System::ComponentModel::ISupportInitialize
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDispatch)] [System.Runtime.InteropServices.ComVisible(true)] [System.Windows.Forms.Docking(System.Windows.Forms.DockingBehavior.AutoDock)] public class SplitContainer : System.Windows.Forms.ContainerControl
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDispatch)] [System.Runtime.InteropServices.ComVisible(true)] [System.Windows.Forms.Docking(System.Windows.Forms.DockingBehavior.AutoDock)] public class SplitContainer : System.Windows.Forms.ContainerControl, System.ComponentModel.ISupportInitialize
[System.Windows.Forms.Docking(System.Windows.Forms.DockingBehavior.AutoDock)] public class SplitContainer : System.Windows.Forms.ContainerControl, System.ComponentModel.ISupportInitialize
[] [] [] type SplitContainer = class inherit ContainerControl
[] [] [] type SplitContainer = class inherit ContainerControl interface ISupportInitialize
[] type SplitContainer = class inherit ContainerControl interface ISupportInitialize
Public Class SplitContainer Inherits ContainerControl
Public Class SplitContainer Inherits ContainerControl Implements ISupportInitialize

Наследование
SplitContainer
Реализации

Примеры

В следующем примере кода показаны как вертикальные, так и горизонтальные SplitContainer. Вертикальный разделитель перемещается с шагом в 10 пикселей. Левая панель по вертикали SplitContainer содержит TreeView элемент управления, а правая — горизонтальную SplitContainer. Обе горизонтальные SplitContainer панели заполняются ListView элементами управления, а верхняя панель определяется как FixedPanel , чтобы она не изменяла размер при изменении размера контейнера. При перемещении вертикального разбиения вызывается SplitterMoving событие, означаемое в этом примере изменением стиля курсора. Событие SplitterMoved возникает при остановке перемещения разделитировщика. В этом примере это означает, что стиль курсора возвращается к значению по умолчанию.

#using #using #using #using using namespace System; using namespace System::Drawing; using namespace System::Collections; using namespace System::ComponentModel; using namespace System::Windows::Forms; using namespace System::Data; public ref class Form1: public System::Windows::Forms::Form < private: System::Windows::Forms::SplitContainer^ splitContainer1; System::Windows::Forms::TreeView^ treeView1; System::Windows::Forms::SplitContainer^ splitContainer2; System::Windows::Forms::ListView^ listView2; System::Windows::Forms::ListView^ listView1; public: Form1() < InitializeComponent(); >private: void InitializeComponent() < splitContainer1 = gcnew System::Windows::Forms::SplitContainer; treeView1 = gcnew System::Windows::Forms::TreeView; splitContainer2 = gcnew System::Windows::Forms::SplitContainer; listView1 = gcnew System::Windows::Forms::ListView; listView2 = gcnew System::Windows::Forms::ListView; splitContainer1->SuspendLayout(); splitContainer2->SuspendLayout(); SuspendLayout(); // Basic SplitContainer properties. // This is a vertical splitter that moves in 10-pixel increments. // This splitter needs no explicit Orientation property because Vertical is the default. splitContainer1->Dock = System::Windows::Forms::DockStyle::Fill; splitContainer1->ForeColor = System::Drawing::SystemColors::Control; splitContainer1->Location = System::Drawing::Point( 0, 0 ); splitContainer1->Name = "splitContainer1"; // You can drag the splitter no nearer than 30 pixels from the left edge of the container. splitContainer1->Panel1MinSize = 30; // You can drag the splitter no nearer than 20 pixels from the right edge of the container. splitContainer1->Panel2MinSize = 20; splitContainer1->Size = System::Drawing::Size( 292, 273 ); splitContainer1->SplitterDistance = 79; // This splitter moves in 10-pixel increments. splitContainer1->SplitterIncrement = 10; splitContainer1->SplitterWidth = 6; // splitContainer1 is the first control in the tab order. splitContainer1->TabIndex = 0; splitContainer1->Text = "splitContainer1"; // When the splitter moves, the cursor changes shape. splitContainer1->SplitterMoved += gcnew System::Windows::Forms::SplitterEventHandler( this, &Form1::splitContainer1_SplitterMoved ); splitContainer1->SplitterMoving += gcnew System::Windows::Forms::SplitterCancelEventHandler( this, &Form1::splitContainer1_SplitterMoving ); // Add a TreeView control to the left panel. splitContainer1->Panel1->BackColor = System::Drawing::SystemColors::Control; // Add a TreeView control to Panel1. splitContainer1->Panel1->Controls->Add( treeView1 ); splitContainer1->Panel1->Name = "splitterPanel1"; // Controls placed on Panel1 support right-to-left fonts. splitContainer1->Panel1->RightToLeft = System::Windows::Forms::RightToLeft::Yes; // Add a SplitContainer to the right panel. splitContainer1->Panel2->Controls->Add( splitContainer2 ); splitContainer1->Panel2->Name = "splitterPanel2"; // This TreeView control is in Panel1 of splitContainer1. treeView1->Dock = System::Windows::Forms::DockStyle::Fill; treeView1->ForeColor = System::Drawing::SystemColors::InfoText; treeView1->ImageIndex = -1; treeView1->Location = System::Drawing::Point( 0, 0 ); treeView1->Name = "treeView1"; treeView1->SelectedImageIndex = -1; treeView1->Size = System::Drawing::Size( 79, 273 ); // treeView1 is the second control in the tab order. treeView1->TabIndex = 1; // Basic SplitContainer properties. // This is a horizontal splitter whose top and bottom panels are ListView controls. The top panel is fixed. splitContainer2->Dock = System::Windows::Forms::DockStyle::Fill; // The top panel remains the same size when the form is resized. splitContainer2->FixedPanel = System::Windows::Forms::FixedPanel::Panel1; splitContainer2->Location = System::Drawing::Point( 0, 0 ); splitContainer2->Name = "splitContainer2"; // Create the horizontal splitter. splitContainer2->Orientation = System::Windows::Forms::Orientation::Horizontal; splitContainer2->Size = System::Drawing::Size( 207, 273 ); splitContainer2->SplitterDistance = 125; splitContainer2->SplitterWidth = 6; // splitContainer2 is the third control in the tab order. splitContainer2->TabIndex = 2; splitContainer2->Text = "splitContainer2"; // This splitter panel contains the top ListView control. splitContainer2->Panel1->Controls->Add( listView1 ); splitContainer2->Panel1->Name = "splitterPanel3"; // This splitter panel contains the bottom ListView control. splitContainer2->Panel2->Controls->Add( listView2 ); splitContainer2->Panel2->Name = "splitterPanel4"; // This ListView control is in the top panel of splitContainer2. listView1->Dock = System::Windows::Forms::DockStyle::Fill; listView1->Location = System::Drawing::Point( 0, 0 ); listView1->Name = "listView1"; listView1->Size = System::Drawing::Size( 207, 125 ); // listView1 is the fourth control in the tab order. listView1->TabIndex = 3; // This ListView control is in the bottom panel of splitContainer2. listView2->Dock = System::Windows::Forms::DockStyle::Fill; listView2->Location = System::Drawing::Point( 0, 0 ); listView2->Name = "listView2"; listView2->Size = System::Drawing::Size( 207, 142 ); // listView2 is the fifth control in the tab order. listView2->TabIndex = 4; // These are basic properties of the form. ClientSize = System::Drawing::Size( 292, 273 ); Controls->Add( splitContainer1 ); Name = "Form1"; Text = "Form1"; splitContainer1->ResumeLayout( false ); splitContainer2->ResumeLayout( false ); ResumeLayout( false ); > void splitContainer1_SplitterMoving( System::Object^ /*sender*/, System::Windows::Forms::SplitterCancelEventArgs ^ /*e*/ ) < // As the splitter moves, change the cursor type. ::Cursor::Current = System::Windows::Forms::Cursors::NoMoveVert; >void splitContainer1_SplitterMoved( System::Object^ /*sender*/, System::Windows::Forms::SplitterEventArgs^ /*e*/ ) < // When the splitter stops moving, change the cursor back to the default. ::Cursor::Current = System::Windows::Forms::Cursors::Default; >>; [STAThread] int main()
using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; public class Form1 : System.Windows.Forms.Form < private System.Windows.Forms.SplitContainer splitContainer1; private System.Windows.Forms.TreeView treeView1; private System.Windows.Forms.SplitContainer splitContainer2; private System.Windows.Forms.ListView listView2; private System.Windows.Forms.ListView listView1; public Form1() < InitializeComponent(); >private void InitializeComponent() < splitContainer1 = new System.Windows.Forms.SplitContainer(); treeView1 = new System.Windows.Forms.TreeView(); splitContainer2 = new System.Windows.Forms.SplitContainer(); listView1 = new System.Windows.Forms.ListView(); listView2 = new System.Windows.Forms.ListView(); splitContainer1.SuspendLayout(); splitContainer2.SuspendLayout(); SuspendLayout(); // Basic SplitContainer properties. // This is a vertical splitter that moves in 10-pixel increments. // This splitter needs no explicit Orientation property because Vertical is the default. splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; splitContainer1.ForeColor = System.Drawing.SystemColors.Control; splitContainer1.Location = new System.Drawing.Point(0, 0); splitContainer1.Name = "splitContainer1"; // You can drag the splitter no nearer than 30 pixels from the left edge of the container. splitContainer1.Panel1MinSize = 30; // You can drag the splitter no nearer than 20 pixels from the right edge of the container. splitContainer1.Panel2MinSize = 20; splitContainer1.Size = new System.Drawing.Size(292, 273); splitContainer1.SplitterDistance = 79; // This splitter moves in 10-pixel increments. splitContainer1.SplitterIncrement = 10; splitContainer1.SplitterWidth = 6; // splitContainer1 is the first control in the tab order. splitContainer1.TabIndex = 0; splitContainer1.Text = "splitContainer1"; // When the splitter moves, the cursor changes shape. splitContainer1.SplitterMoved += new System.Windows.Forms.SplitterEventHandler(splitContainer1_SplitterMoved); splitContainer1.SplitterMoving += new System.Windows.Forms.SplitterCancelEventHandler(splitContainer1_SplitterMoving); // Add a TreeView control to the left panel. splitContainer1.Panel1.BackColor = System.Drawing.SystemColors.Control; // Add a TreeView control to Panel1. splitContainer1.Panel1.Controls.Add(treeView1); splitContainer1.Panel1.Name = "splitterPanel1"; // Controls placed on Panel1 support right-to-left fonts. splitContainer1.Panel1.RightToLeft = System.Windows.Forms.RightToLeft.Yes; // Add a SplitContainer to the right panel. splitContainer1.Panel2.Controls.Add(splitContainer2); splitContainer1.Panel2.Name = "splitterPanel2"; // This TreeView control is in Panel1 of splitContainer1. treeView1.Dock = System.Windows.Forms.DockStyle.Fill; treeView1.ForeColor = System.Drawing.SystemColors.InfoText; treeView1.ImageIndex = -1; treeView1.Location = new System.Drawing.Point(0, 0); treeView1.Name = "treeView1"; treeView1.SelectedImageIndex = -1; treeView1.Size = new System.Drawing.Size(79, 273); // treeView1 is the second control in the tab order. treeView1.TabIndex = 1; // Basic SplitContainer properties. // This is a horizontal splitter whose top and bottom panels are ListView controls. The top panel is fixed. splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill; // The top panel remains the same size when the form is resized. splitContainer2.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; splitContainer2.Location = new System.Drawing.Point(0, 0); splitContainer2.Name = "splitContainer2"; // Create the horizontal splitter. splitContainer2.Orientation = System.Windows.Forms.Orientation.Horizontal; splitContainer2.Size = new System.Drawing.Size(207, 273); splitContainer2.SplitterDistance = 125; splitContainer2.SplitterWidth = 6; // splitContainer2 is the third control in the tab order. splitContainer2.TabIndex = 2; splitContainer2.Text = "splitContainer2"; // This splitter panel contains the top ListView control. splitContainer2.Panel1.Controls.Add(listView1); splitContainer2.Panel1.Name = "splitterPanel3"; // This splitter panel contains the bottom ListView control. splitContainer2.Panel2.Controls.Add(listView2); splitContainer2.Panel2.Name = "splitterPanel4"; // This ListView control is in the top panel of splitContainer2. listView1.Dock = System.Windows.Forms.DockStyle.Fill; listView1.Location = new System.Drawing.Point(0, 0); listView1.Name = "listView1"; listView1.Size = new System.Drawing.Size(207, 125); // listView1 is the fourth control in the tab order. listView1.TabIndex = 3; // This ListView control is in the bottom panel of splitContainer2. listView2.Dock = System.Windows.Forms.DockStyle.Fill; listView2.Location = new System.Drawing.Point(0, 0); listView2.Name = "listView2"; listView2.Size = new System.Drawing.Size(207, 142); // listView2 is the fifth control in the tab order. listView2.TabIndex = 4; // These are basic properties of the form. ClientSize = new System.Drawing.Size(292, 273); Controls.Add(splitContainer1); Name = "Form1"; Text = "Form1"; splitContainer1.ResumeLayout(false); splitContainer2.ResumeLayout(false); ResumeLayout(false); >[STAThread] static void Main() < Application.Run(new Form1()); >private void splitContainer1_SplitterMoving(System.Object sender, System.Windows.Forms.SplitterCancelEventArgs e) < // As the splitter moves, change the cursor type. Cursor.Current = System.Windows.Forms.Cursors.NoMoveVert; >private void splitContainer1_SplitterMoved(System.Object sender, System.Windows.Forms.SplitterEventArgs e) < // When the splitter stops moving, change the cursor back to the default. Cursor.Current=System.Windows.Forms.Cursors.Default; >> 
' Compile this example using the following command line: ' vbc basicsplitcontainer.vb /r:System.Drawing.dll /r:System.Windows.Forms.dll /r:System.dll /r:System.Data.dll Imports System.Drawing Imports System.Collections Imports System.ComponentModel Imports System.Windows.Forms Imports System.Data Public Class Form1 Inherits System.Windows.Forms.Form Private WithEvents splitContainer1 As System.Windows.Forms.SplitContainer Private treeView1 As System.Windows.Forms.TreeView Private splitContainer2 As System.Windows.Forms.SplitContainer Private listView2 As System.Windows.Forms.ListView Private listView1 As System.Windows.Forms.ListView Public Sub New() InitializeComponent() End Sub Private Sub InitializeComponent() splitContainer1 = New System.Windows.Forms.SplitContainer() treeView1 = New System.Windows.Forms.TreeView() splitContainer2 = New System.Windows.Forms.SplitContainer() listView1 = New System.Windows.Forms.ListView() listView2 = New System.Windows.Forms.ListView() splitContainer1.SuspendLayout() splitContainer2.SuspendLayout() SuspendLayout() ' Basic SplitContainer properties. ' This is a vertical splitter that moves in 10-pixel increments. ' This splitter needs no explicit Orientation property because Vertical is the default. splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill splitContainer1.ForeColor = System.Drawing.SystemColors.Control splitContainer1.Location = New System.Drawing.Point(0, 0) splitContainer1.Name = "splitContainer1" ' You can drag the splitter no nearer than 30 pixels from the left edge of the container. splitContainer1.Panel1MinSize = 30 ' You can drag the splitter no nearer than 20 pixels from the right edge of the container. splitContainer1.Panel2MinSize = 20 splitContainer1.Size = New System.Drawing.Size(292, 273) splitContainer1.SplitterDistance = 79 ' This splitter moves in 10-pixel increments. splitContainer1.SplitterIncrement = 10 splitContainer1.SplitterWidth = 6 ' splitContainer1 is the first control in the tab order. splitContainer1.TabIndex = 0 splitContainer1.Text = "splitContainer1" ' Add a TreeView control to the left panel. splitContainer1.Panel1.BackColor = System.Drawing.SystemColors.Control ' Add a TreeView control to Panel1. splitContainer1.Panel1.Controls.Add(treeView1) splitContainer1.Panel1.Name = "splitterPanel1" ' Controls placed on Panel1 support right-to-left fonts. splitContainer1.Panel1.RightToLeft = System.Windows.Forms.RightToLeft.Yes ' Add a SplitContainer to the right panel. splitContainer1.Panel2.Controls.Add(splitContainer2) splitContainer1.Panel2.Name = "splitterPanel2" ' This TreeView control is in Panel1 of splitContainer1. treeView1.Dock = System.Windows.Forms.DockStyle.Fill treeView1.ForeColor = System.Drawing.SystemColors.InfoText treeView1.ImageIndex = - 1 treeView1.Location = New System.Drawing.Point(0, 0) treeView1.Name = "treeView1" treeView1.SelectedImageIndex = - 1 treeView1.Size = New System.Drawing.Size(79, 273) ' treeView1 is the second control in the tab order. treeView1.TabIndex = 1 ' Basic SplitContainer properties. ' This is a horizontal splitter whose top and bottom panels are ListView controls. The top panel is fixed. splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill ' The top panel remains the same size when the form is resized. splitContainer2.FixedPanel = System.Windows.Forms.FixedPanel.Panel1 splitContainer2.Location = New System.Drawing.Point(0, 0) splitContainer2.Name = "splitContainer2" ' Create the horizontal splitter. splitContainer2.Orientation = System.Windows.Forms.Orientation.Horizontal splitContainer2.Size = New System.Drawing.Size(207, 273) splitContainer2.SplitterDistance = 125 splitContainer2.SplitterWidth = 6 ' splitContainer2 is the third control in the tab order. splitContainer2.TabIndex = 2 splitContainer2.Text = "splitContainer2" ' This splitter panel contains the top ListView control. splitContainer2.Panel1.Controls.Add(listView1) splitContainer2.Panel1.Name = "splitterPanel3" ' This splitter panel contains the bottom ListView control. splitContainer2.Panel2.Controls.Add(listView2) splitContainer2.Panel2.Name = "splitterPanel4" ' This ListView control is in the top panel of splitContainer2. listView1.Dock = System.Windows.Forms.DockStyle.Fill listView1.Location = New System.Drawing.Point(0, 0) listView1.Name = "listView1" listView1.Size = New System.Drawing.Size(207, 125) ' listView1 is the fourth control in the tab order. listView1.TabIndex = 3 ' This ListView control is in the bottom panel of splitContainer2. listView2.Dock = System.Windows.Forms.DockStyle.Fill listView2.Location = New System.Drawing.Point(0, 0) listView2.Name = "listView2" listView2.Size = New System.Drawing.Size(207, 142) ' listView2 is the fifth control in the tab order. listView2.TabIndex = 4 ' These are basic properties of the form. ClientSize = New System.Drawing.Size(292, 273) Controls.Add(splitContainer1) Name = "Form1" Text = "Form1" splitContainer1.ResumeLayout(False) splitContainer2.ResumeLayout(False) ResumeLayout(False) End Sub _ Shared Sub Main() Application.Run(New Form1()) End Sub Private Sub splitContainer1_SplitterMoving(sender As System.Object, e As System.Windows.Forms.SplitterCancelEventArgs) Handles splitContainer1.SplitterMoving ' As the splitter moves, change the cursor type. Cursor.Current = System.Windows.Forms.Cursors.NoMoveVert End Sub Private Sub splitContainer1_SplitterMoved(sender As System.Object, e As System.Windows.Forms.SplitterEventArgs) Handles splitContainer1.SplitterMoved ' When the splitter stops moving, change the cursor back to the default. Cursor.Current = System.Windows.Forms.Cursors.Default End Sub End Class 

Комментарии

Вы можете добавить элементы управления на две изменяемые панели, а также другие SplitContainer элементы управления на существующие SplitContainer панели, чтобы создать множество областей отображения с возможностью изменения размера.

Используйте элемент управления , SplitContainer чтобы разделить область отображения контейнера (например Form, ) и разрешить пользователю изменять размер элементов управления, добавленных на SplitContainer панели. Когда пользователь передает указатель мыши на разделитель, курсор меняется, указывая, что элементы управления внутри SplitContainer элемента управления могут быть изменены.

Предыдущие версии платформа .NET Framework поддерживают только элемент Splitter управления .

SplitContainer также упрощает размещение элементов управления во время разработки. Например, чтобы создать окно, аналогичное Windows Обозреватель, добавьте SplitContainer элемент управления в Form и задайте для его Dock свойства значение DockStyle.Fill . TreeView Добавьте элемент управления в и Form задайте для его Dock свойства значение DockStyle.Fill . Чтобы завершить макет, добавьте ListView элемент управления и присвойте его Dock свойству DockStyle.Fill значение , чтобы ListView объект занимал оставшееся пространство в Form. Во время выполнения пользователь может изменить размер ширины обоих элементов управления с помощью разделищающего модуля. Используйте свойство , FixedPanel чтобы указать, что размер элемента управления не следует изменять вместе с или другим контейнером Form .

Используйте , SplitterDistance чтобы указать, где начинается разделитель в форме. Используйте , SplitterIncrement чтобы указать, сколько пикселей перемещается разделитель за раз. Значение по умолчанию для SplitterIncrement — один пиксель.

Используйте Panel1MinSize и Panel2MinSize , чтобы указать, как закрыть разделитель можно переместить на внешний SplitContainer край панели. Минимальный размер панели по умолчанию составляет 25 пикселей.

Используйте свойство , Orientation чтобы указать горизонтальную ориентацию. Ориентация SplitContainer по умолчанию — вертикальная.

Используйте свойство , BorderStyle чтобы указать стиль SplitContainer границы и согласовать его стиль границы со стилем границы элементов управления, добавляемых в SplitContainer.

Конструкторы

Инициализирует новый экземпляр класса SplitContainer.

Поля

Определяет значение свойства AutoScroll.

Определяет, включил ли пользователь перетаскивание всего окна.

Определяет, установлено ли для свойства HScroll значение true .

Определяет, выполнял ли пользователь прокрутку в элементе управления ScrollableControl.

Определяет, установлено ли для свойства VScroll значение true .

Свойства

Получает объект AccessibleObject, назначенный элементу управления.

Возвращает или задает описание выполняемого по умолчанию действия элемента управления для использования клиентскими приложениями со специальными возможностями.

Возвращает или задает описание элемента управления, используемого клиентскими приложениями со специальными возможностями.

Возвращает или задает имя элемента управления, используемого клиентскими приложениями со специальными возможностями.

Возвращает или задает доступную роль элемента управления.

Возвращает или задает активный элемент управления в контейнере.

Возвращает или задает значение, указывающее, может ли элемент управления принимать данные, перетаскиваемые в него пользователем.

Возвращает или задает границы контейнера, с которым связан элемент управления, и определяет способ изменения размеров элемента управления при изменении размеров его родительского элемента.

Возвращает или задает размеры, заданные для этого элемента управления при разработке.

Получает коэффициент масштабирования между текущими измерениями и автоматически масштабируемыми измерениями во время проектирования.

Возвращает или задает режим автоматического масштабирования элемента управления.

При переопределении в производном классе Возвращает или задает значение, указывающее, появляются ли полосы прокрутки, когда элементы управления помещаются вне клиентской области объекта SplitContainer. Данное свойство не применимо к этому классу.

Возвращает или задает размер поля автоматической прокрутки. Данное свойство не применимо к этому классу. Данное свойство не применимо к этому классу.

Возвращает или задает минимальный размер полосы прокрутки. Данное свойство не применимо к этому классу.

Данное свойство не применимо к этому классу.

Данное свойство не применимо к этому классу.

Возвращает или задает значение, показывающее, изменяется ли автоматически размер объекта SplitContainer для отображения всего содержимого. Данное свойство не применимо к этому классу.

Возвращает или задает значение, указывающее, будут ли элементы управления в этом контейнере автоматически проверены при изменении фокуса.

Возвращает или задает цвет фона для элемента управления.

Возвращает или задает фоновое изображение, отображаемое на элементе управления.

Данное свойство не применимо к этому классу.

Возвращает или задает BindingContext для объекта SplitContainer.

Возвращает или задает стиль границы для объекта SplitContainer.

Возвращает расстояние в пикселях между нижней границей элемента управления и верхней границей клиентской области контейнера.

Возвращает или задает размер и местоположение (в пикселях) элемента управления, включая его неклиентские элементы, относительно его родительского элемента управления.

Получает значение, указывающее, можно ли для свойства ImeMode установить активное значение с целью включения поддержки IME.

Возвращает значение, указывающее, может ли элемент управления получать фокус.

Определяет, могут ли вызываться события в элементе управления.

Возвращает значение, указывающее, доступен ли элемент управления для выбора.

Возвращает или задает значение, указывающее, была ли мышь захвачена элементом управления.

Возвращает или задает значение, указывающее, вызывает ли элемент управления выполнение проверки для всех элементов управления, требующих проверки, при получении фокуса.

Возвращает прямоугольник, представляющий клиентскую область элемента управления.

Возвращает или задает высоту и ширину клиентской области элемента управления.

Возвращает название организации или имя создателя приложения, содержащего элемент управления.

Возвращает объект IContainer, который содержит коллекцию Component.

Возвращает значение, указывающее, имеет ли элемент управления или один из его дочерних элементов фокус ввода в настоящий момент.

Возвращает или задает контекстное меню, связанное с элементом управления.

Возвращает или задает объект ContextMenuStrip, сопоставленный с этим элементом управления.

Получает коллекцию дочерних элементов управления. Данное свойство не применимо к этому классу.

Возвращает значение, указывающее, был ли создан элемент управления.

Возвращает параметры, необходимые для создания дескриптора элемента управления.

Возвращает текущие измерения экрана во время выполнения.

Возвращает или задает курсор, отображаемый, когда указатель мыши находится на элементе управления.

Возвращает привязки данных для элемента управления.

Возвращает или задает контекст данных для привязки данных. Это свойство окружения.

Возвращает или задает курсор по умолчанию для элемента управления.

Возвращает стандартный режим редактора методов ввода, поддерживаемый данным элементом управления.

Возвращает размер пустого пространства в пикселях между элементами управления, которое определено по умолчанию.

Возвращает длину и высоту в пикселях, которые были указаны в качестве максимального размера элемента управления.

Возвращает длину и высоту в пикселях, которые были указаны в качестве минимального размера элемента управления.

Возвращает внутренние промежутки в содержимом элемента управления в пикселях.

Возвращает размер по умолчанию для объекта SplitContainer.

Возвращает значение, указывающее, находится ли данный компонент Component в режиме конструктора в настоящее время.

Получает значение DPI для устройства, на котором сейчас отображается элемент управления.

Получает прямоугольник, представляющий виртуальную отображаемую область элемента управления.

Получает значение, указывающее, находится ли базовый класс Control в процессе удаления.

Возвращает или задает границы объекта SplitContainer, прикрепляемые к краям контейнера.

Получает параметры заполнения прикрепления для всех краев элемента управления.

Возвращает или задает значение, указывающее, должна ли поверхность этого элемента управления перерисовываться с помощью дополнительного буфера, чтобы уменьшить или предотвратить мерцание.

Возвращает или задает значение, указывающее, может ли элемент управления отвечать на действия пользователя.

Возвращает список обработчиков событий, которые прикреплены к этому объекту Component.

Возвращает или задает панель SplitContainer, которая сохраняет свои размеры при изменении размеров контейнера.

Возвращает значение, указывающее, имеется ли на элементе управления фокус ввода.

Возвращает или задает шрифт текста, отображаемого элементом управления.

Возвращает или задает высоту шрифта элемента управления.

Возвращает или задает цвет элемента управления.

Возвращает дескриптор окна, с которым связан элемент управления.

Возвращает значение, указывающее, содержит ли элемент управления один или несколько дочерних элементов.

Возвращает или задает высоту элемента управления.

Получает характеристики, связанные с горизонтальной полосой прокрутки.

Получает или задает значение, показывающее, отображается ли горизонтальная полоса прокрутки.

Возвращает или задает режим редактора метода ввода элемента управления.

Получает или задает режим IME элемента управления.

Возвращает значение, указывающее, следует ли вызывающему оператору обращаться к методу invoke во время вызовов метода из элемента управления, так как вызывающий оператор находится не в том потоке, в котором был создан элемент управления.

Возвращает или задает значение, указывающее, является ли элемент управления видимым для приложений со специальными возможностями.

Указывает, находится ли один из предков этого элемента управления в режиме DesignMode. Это свойство доступно только для чтения.

Возвращает значение, указывающее, был ли удален элемент управления.

Возвращает значение, указывающее, имеется ли у элемента управления связанный с ним дескриптор.

Возвращает значение, указывающее, отображается ли зеркально элемент управления.

Возвращает или задает значение, указывающее, является ли разделитель стационарным или подвижным.

Получает кэшированный экземпляр механизма размещения элемента управления.

Возвращает или задает расстояние в пикселях между левой границей элемента управления и левой границей клиентской области его контейнера.

Возвращает или задает координаты левого верхнего угла элемента управления относительно левого верхнего угла его контейнера.

Возвращает или задает расстояние между элементами управления.

Возвращает или задает размер, являющийся верхней границей, которую может указать метод GetPreferredSize(Size).

Возвращает или задает размер, являющийся нижней границей, которую может указать метод GetPreferredSize(Size).

Возвращает или задает имя элемента управления.

Возвращает или задает значение, указывающее ориентацию (горизонтальную или вертикальную) панелей SplitContainer.

Возвращает или задает внутренний зазор (в пикселях) между краями объекта SplitterPanel и его содержимым. Данное свойство не применимо к этому классу.

Получает левую или верхнюю панель объекта SplitContainer в зависимости от значения Orientation.

Возвращает или задает значение, определяющее, свернута панель Panel1 или развернута.

Возвращает или задает минимальное расстояние (в пикселях) разделителя от левого или верхнего края панели Panel1.

Получает правую или нижнюю панель объекта SplitContainer в зависимости от значения Orientation.

Возвращает или задает значение, определяющее, свернута панель Panel2 или развернута.

Возвращает или задает минимальное расстояние (в пикселях) разделителя от правого или нижнего края панели Panel2.

Возвращает или задает родительский контейнер элемента управления.

Возвращает форму, которой назначен данный элемент управления типа «контейнер».

Возвращает размер прямоугольной области, в которую может поместиться элемент управления.

Возвращает имя продукта сборки, содержащей элемент управления.

Возвращает версию сборки, содержащую элемент управления.

Возвращает значение, указывающее, осуществляет ли в настоящий момент элемент управления повторное создание дескриптора.

Возвращает или задает область окна, связанную с элементом управления.

Устаревшие..
Устаревшие..

Это свойство устарело.

Возвращает или задает значение, указывающее, перерисовывается ли элемент управления при изменении размеров.

Возвращает расстояние в пикселях между правой границей элемента управления и левой границей клиентской области его контейнера.

Возвращает или задает значение, указывающее, выровнены ли компоненты элемента управления для поддержки языков, использующих шрифты с написанием справа налево.

Получает значение, определяющее масштабирование дочерних элементов управления.

Возвращает значение, указывающее, должен ли элемент управления отображать прямоугольники фокуса.

Возвращает значение, указывающее, имеет ли пользовательский интерфейс соответствующее состояние, при котором отображаются или скрываются сочетания клавиш.

Возвращает или задает местонахождение элемента управления.

Возвращает или задает высоту и ширину элемента управления.

Возвращает или задает местоположение разделителя (в пикселях) от левого или верхнего края объекта SplitContainer.

Возвращает или задает значение, представляющее шаг перемещения разделителя, выраженный в пикселях.

Получает размер и местоположение разделителя относительно объекта SplitContainer.

Возвращает или задает ширину разделителя в пикселях.

Возвращает или задает последовательность перехода по клавише TAB между элементами управления внутри контейнера.

Возвращает или задает значение, указывающее, можно ли передать фокус разделителю при помощи клавиши TAB.

Возвращает или задает объект, содержащий данные об элементе управления.

Данное свойство не применимо к этому классу.

Возвращает или задает расстояние в пикселях между верхней границей элемента управления и верхней границей клиентской области его контейнера.

Получает родительский элемент управления, не имеющий другого родительского элемента управления Windows Forms. Как правило, им является внешний объект Form, в котором содержится элемент управления.

Возвращает или задает значение, указывающее, следует ли использовать курсор ожидания для текущего элемента управления и всех дочерних элементов управления.

Получает характеристики, связанные с вертикальной полосой прокрутки.

Возвращает или задает значение, указывающее, отображаются ли элемент управления и все его дочерние элементы управления.

Получает или задает значение, показывающее, отображается ли вертикальная полоса прокрутки.

Возвращает или задает ширину элемента управления.

Данное свойство не применимо к этому классу.

Методы

Уведомляет клиентские приложения со специальными возможностями об указанном перечислении AccessibleEvents для указанного дочернего элемента управления.

Уведомляет клиентские приложения со специальными возможностями об указанном перечислении AccessibleEvents для указанного дочернего элемента управления.

Настраивает полосы прокрутки в контейнере на основе текущей позиции элемента управления и выбранного в данный момент элемента управления.

Подает объекту сигнал о начале инициализации.

Выполняет указанный делегат асинхронно в потоке, в котором был создан базовый дескриптор элемента управления.

Выполняет указанный делегат асинхронно в потоке, в котором был создан базовый дескриптор элемента управления.

Выполняет указанный делегат асинхронно с указанными аргументами в потоке, в котором был создан базовый дескриптор элемента управления.

Помещает элемент управления в начало z-порядка.

Возвращает значение, указывающее, является ли указанный элемент управления дочерним элементом.

Представляет элемент управления, состоящий из подвижной строки, которая разделяет область отображения контейнера на две панели с изменяемыми размерами.

Создает для элемента управления новый объект с поддержкой специальных возможностей.

Вызывает принудительное создание видимого элемента управления, включая создание дескриптора и всех видимых дочерних элементов.

Создает новый экземпляр коллекции элементов управления для данного элемента управления.

Создает объект Graphics для элемента управления.

Создает дескриптор для элемента управления.

Создает объект, который содержит всю необходимую информацию для создания прокси-сервера, используемого для взаимодействия с удаленным объектом.

Отправляет заданное сообщение процедуре окна, используемой по умолчанию.

Удаляет дескриптор, связанный с элементом управления.

Освобождает все ресурсы, занятые модулем Component.

Освобождает неуправляемые ресурсы, используемые объектом Control и его дочерними элементами управления (при необходимости освобождает и управляемые ресурсы).

Начинает операцию перетаскивания.

Начинает операцию перетаскивания.

Поддерживает отрисовку в указанном точечном рисунке.

Подает объекту сигнал о завершении инициализации.

Получает возвращаемое значение асинхронной операции, представленное переданным объектом IAsyncResult.

Определяет, равен ли указанный объект текущему объекту.

Возвращает форму, в которой находится элемент управления.

Устанавливает фокус ввода на элемент управления.

Получает указанный объект AccessibleObject.

Получает значение, указывающее, как будет вести себя элемент управления, когда его свойство AutoSize включено.

Возвращает дочерний элемент управления, имеющий указанные координаты.

Возвращает дочерний элемент управления, расположенный по указанным координатам, определяя, следует ли игнорировать дочерние элементы управления конкретного типа.

Возвращает следующий объект ContainerControl в цепочке родительских элементов управления данного элемента.

Служит хэш-функцией по умолчанию.

Устаревшие..

Извлекает объект обслуживания во время существования, который управляет политикой времени существования данного экземпляра.

Возвращает следующий или предыдущий элемент среди дочерних элементов управления в последовательности клавиши TAB.

Вычисляет размер прямоугольной области, в которую помещается элемент управления.

Возвращает границы, внутри которых масштабируется элемент управления.

Определяет, установлен ли указанный флаг.

Возвращает объект, представляющий службу, предоставляемую классом Component или классом Container.

Возвращает значение указанного бита стиля элемента управления для данного элемента управления.

Определяет, находится ли элемент управления на верхнем уровне.

Возвращает объект Type для текущего экземпляра.

Скрывает элемент управления от пользователя.

Устаревшие..

Получает объект службы времени существования для управления политикой времени существования для этого экземпляра.

Вызывается после добавления элемента управления в другой контейнер.

Делает недействительной всю поверхность элемента управления и вызывает его перерисовку.

Делает недействительной конкретную область элемента управления и вызывает отправку сообщения рисования элементу управления. При необходимости объявляет недействительными назначенные элементу управления дочерние элементы.

Делает недействительной указанную область элемента управления (добавляет ее к области обновления элемента, которая будет перерисована при следующей операции рисования) и вызывает отправку сообщения рисования элементу управления.

Делает недействительной указанную область элемента управления (добавляет ее к области обновления элемента, которая будет перерисована при следующей операции рисования) и вызывает отправку сообщения рисования элементу управления. При необходимости объявляет недействительными назначенные элементу управления дочерние элементы.

Делает недействительной указанную область элемента управления (добавляет ее к области обновления элемента, которая будет перерисована при следующей операции рисования) и вызывает отправку сообщения рисования элементу управления.

Делает недействительной указанную область элемента управления (добавляет ее к области обновления элемента, которая будет перерисована при следующей операции рисования) и вызывает отправку сообщения рисования элементу управления. При необходимости объявляет недействительными назначенные элементу управления дочерние элементы.

Выполняет указанный делегат в том потоке, которому принадлежит базовый дескриптор окна элемента управления.

Выполняет указанный делегат в том потоке, которому принадлежит базовый дескриптор окна элемента управления.

Выполняет указанный делегат в том потоке, которому принадлежит основной дескриптор окна элемента управления, с указанным списком аргументов.

Выполняет указанный делегат в том потоке, которому принадлежит базовый дескриптор окна элемента управления.

Вызывает событие GotFocus для указанного элемента управления.

Вызывает событие LostFocus для указанного элемента управления.

Вызывает событие Click для указанного элемента управления.

Вызывает событие Paint для указанного элемента управления.

Вызывает событие PaintBackground для указанного элемента управления.

Определяет, является ли символ входным символом, который распознается элементом управления.

Определяет, является ли заданная клавиша обычной клавишей ввода или специальной клавишей, нуждающейся в предварительной обработке.

Преобразует логическое значение DPI в эквивалентное значение DPI DeviceUnit.

Преобразует размер из логических единиц в единицы устройства путем его масштабирования к текущему DPI и округлением вниз до ближайшего целого значения ширины и высоты.

Создает неполную копию текущего объекта Object.

Создает неполную копию текущего объекта MarshalByRefObject.

Вызывает событие Invalidated, чтобы сделать недействительной указанную область элемента управления.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *