15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


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

Автор: Mike Melnikov

Описание

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

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

void addControls(int count, bool connectVertical, ...);
void addControl(int id);

Демонстрационный проект показывает автоматиеское добавление элементов управления в классы CDialog, CPropertyPage, CView и CFormView.

Sample Image

Использование класса

Самый простой способ - это использовать шаблон ZSplitterDlgImpl. Вам необходимо изменить:

  • Родительский класс Вашего диалога на view класс,
  • конструктор,
  • второй параметр в макросе BEGIN_MESSAGE_MAP , и
  • функцию "on init" Вашего окна.
// в заголовке
class CTestDlg1 : public ZSplitterDlgImpl<CPropertyPage>

// в исходнике
CTestDlg1::CTestDlg1() : /*...*/ ZSplitterDlgImpl<CPropertyPage>(CTestDlg1::IDD) {}

BEGIN_MESSAGE_MAP(CTestDlg1, ZSplitterDlgImpl<CPropertyPage>)
	//	...
END_MESSAGE_MAP()

BOOL CTestDlg1::OnInitDialog() 
{
	// ... здесь используем функцию addControl(s)
	init();
	// ...
}

Шаблон ZSplitterDlgImpl имеет второй параметр (ZSplitter2 по умолчанию). ZSplitter2 содержит в себе сам сплиттер. Он имеет виртуальную функцию OnPaint() - и Вы можете изменять её реализацию для получения различных видов Вашего элемента управления (см. класс CMyView1 в демонстрашке).

Шаблон ZSplitterDlgImpl поможет Вам использовать сплиттер, но тогда Вы не сможете использовать его базовый класс ZSplitterDlg (см. класс CTestDlg2) в демонстрационном пректе.

Это пример Вашего диалога в редакторе ресурсов:

in vc++ editor

И пользователь может изменять его во время выполнения приложения.

after user manipulations

Для добавления контрола в "раскладку сплиттера" используйте функции addControls или addControl либо группу контролов: они будут перемещаться совместно. Например

  addControls(2,false,IDC_LIST6,IDC_LIST7);
  addControls(2,true,IDC_LIST1,IDC_LIST8);
  addControl(IDC_LIST9);
  addControl(IDC_LIST2);
  addControl(IDC_LIST3);
  addControl(IDC_LIST4);
  addControl(IDC_LIST5);

Кроме того Вы можете вручную добавлять класс ZSPLITTER класс () на страницу. Посмотрите, как это выглядит на рисунке, а так же в классе CTestDlg3 демонстрационного проекта.

before moving after moving