Сегодня мы представляем вам статью нашего автора Алексей1153/
Элемент управления - Сплиттер (Splitter control)
Доброе время суток. В этой статье представлен класс CSplitter1153 (далее - компонент или просто сплиттер), написанный в среде VC++6 с использованием библиотеки MFC. Класс нашего компонента произведён от класса CStatic. Предназначен сплиттер для динамического изменения пользователем размера и положения элементов управления (производных от класса CWnd) на диалоговой форме. Сплиттер, как элемент управления,
располагается на любом объекте, класс которого произведён от CWnd (если не вдаваться в крайности , то на объектах типа CDialog, CDialogBar, CFormView и так далее). Также на нашем сплиттере можно отображать полосу прогресса. Код класса открыт, можете делать с ним что угодно. Исходный код компонента представлен в 2 файлах (их можно взять из файлов проекта, который находится по ссылке в конце статьи):
Splitter1153.h
заголовочный файл класса компонента.
Splitter1153.cpp
файл реализации класса компонента.
Тестовый проект для этой статьи, как уже было сказано, можно найти по ссылке в конце статьи. Но представим, что проект ещё не создан. Здесь будет описано, как производится вставка компонента в проект и работа с ним. Создаём тестовый проект SplitterTest (MFC , Dialog-based). Копируем в папку с проектом файлы класса компонента, описанные выше. Добавляем файлы также в дерево файлов проекта. После этого рекомендуется удалить из папки проекта файл "имя_проекта.clw" (можно даже не закрывая студию). Затем
в студии нажать Ctrl+W для того, чтобы обновилось дерево классов. Описываемый класс является производным от MFC-класса CStatic. Поэтому, чтобы поместить компонент на диалоговое окно в режиме редактирования ресурсов, надо положить на диалог контрол CStatic из стандартной палитры конторолов. Затем надо добавляем для статика связанный с ним член-переменную: удерживая Ctrl, дважды щелкаем по статику, пишем имя переменной m_..... , в окне Category -> выбираем Control, в окне Variable Type -> выбираем наш
класс CSplitter1153. Также не забываем добавить в заголовочный файл диалога перед описание класса диалога строчку:
Код:
#include "Splitter1153.h"
Тут надо отметить следующий момент. Сплиттер может быть горизонтальный или вертикальный. Когда CStatic кладётся на форму , это никак не предопределено, это будет задано в свойствах объекта в программе. Тем не менее, можно для наглядности придать статику форму ,
близкую к желаемой. Поскольку границу у статика (когда в нем нет текста) в редакторе ресурсов не видно, то для того, чтоб сделать статик заметным можно вписать, например, "= = = " (чередование "=" и пробелов) по всей длине статика. В вертикальном статике, за счёт наличия пробелов, "=" расположатся на всех строчках и равномерно распределятся по высоте. У сплиттера имеется два размера - "основной" и "не основной" . Для горизонтального основной - это высота. Для вертикального - ширина. Контрол следит
только за своим основным размером, а второй размер остаётся такой, какой был установлен в редакторе ресурсом. Конечно, его можно изменить в процессе работы программы методом CWnd::MoveWindow() . Величина основной размера может задаваться через метод контрола.
Итак, для примера создадим два сплиттера - горизонтальный и вертикальный. Зададим идентификаторы IDC_SP_H (для горизонтального) и IDC_SP_V (для вертикального). Добавляем для них связанные переменные класса CSplitter1153 с именами m_IDC_SP_H
и m_IDC_SP_V соответственно (как описано выше - удерживая Ctrl, дважды щелкаем). Поставьте в свойствах статиков следующие галочку Notify. Если не поставить галочку, то контрол не будет реагировать на щелчки мышью. Не забываем добавить в заголовочный файл диалога перед описанием класса диалога строчку: