// Исключаем редко используемые определения из включаемых файлов
#define VC_EXTRALEAN		

// Включаемый файл для MFC
#include <afxwin.h>
#include <afxext.h> 
#include <afxcmn.h>

// Включаемый файл для ресурсов приложения
#include "resource.h"

//========================================================
// Класс CMultiBarApp - главный класс приложения 
//========================================================
class CMultiBarApp : public CWinApp
{
public:
   // Мы будем переопределять метод InitInstance
   virtual BOOL InitInstance();
};
 
// Создаем объект приложение класса CMultiBarApp
CMultiBarApp MultiBarApp;
 
//========================================================
// Класс CExtendedBar - класс панели управления Extended
//========================================================
class CExtendedBar : public CToolBar
{
public:
   // Дополнительные органы управления панели Extended
   CEdit m_edit;                          // текстовый редактор
   CComboBox m_combo_box; // список с текстовым редактором
};


//========================================================
// Класс CMultiBarWindow - представляет главное окно 
//========================================================
class CMultiBarWindow : public CFrameWnd
{
// Определяем панели управления
protected: 
   // Панель управления Player
   CToolBar       m_wndPlayerBar;
   // Панель управления Style
   CToolBar       m_wndStyleBar;
   // Панель управления Extended
   CExtendedBar   m_wndExtendedBar;
   
protected:
   // Метод OnCreate используется для создания панелей управления
   afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

public:
   // Объявляем конструктор класса CMultiBarWindow
   CMultiBarWindow();

   // Объявляем методы для обработки команд панелей управления
   afx_msg void BarCommandOne();
   afx_msg void BarCommandRange(UINT nID);
   afx_msg void AddStringToComboBox();

   // Объявляем метод для обработки команд от меню View
   afx_msg BOOL ShowStyle(UINT nID);

   // Макрокоманда необходима, так как класс 
   // CMultiBarWindow обрабатывает сообщения
   DECLARE_MESSAGE_MAP()    
}; 

//========================================================
// Метод BarCommandRange
// Обрабатывает команды от панели управления
//========================================================
void CMultiBarWindow::BarCommandRange( UINT nID )
{
   // Обработчик не выполняет никакой работы
}

//========================================================
// Метод BarCommand
// Обрабатывает команды от кнопок панелей управления
//========================================================
void CMultiBarWindow::BarCommandOne()
{
   // Отображаем сообщение о том, что команда не реализована
   MessageBox("Command not implemented");	
}

//========================================================
// Метод AddStringToComboBox
// Обрабатывает команду от кнопки Add панели управления Extended
//========================================================
void CMultiBarWindow::AddStringToComboBox()
{
   // Получаем строку, введенную в текстовом редакторе m_edit
   char  tmpStr[39];
   m_wndExtendedBar.m_edit.GetLine(0, tmpStr,40);	

   // Добавляем новую строку к списку m_combo_box
   m_wndExtendedBar.m_combo_box.AddString(tmpStr);
}

//========================================================
// Метод ShowStyle
// Обрабатывает команды от меню View
//========================================================
BOOL CMultiBarWindow::ShowStyle(UINT nID)
{
   // Определяем указатель на панель управления, соответствующую 
   // идентификатору nID
   CControlBar* pBar = GetControlBar(nID);

   // Определяем, отображается в данный момент панель управления на 
   // экране или нет
   BOOL bShow = (( pBar -> GetStyle() & WS_VISIBLE) != 0);
   
   // Изменяем состояние панели управления: если панель управления 
   // отображается на экране, удаляем ее с экрана, если нет - отображаем
   ShowControlBar( pBar, !bShow, FALSE);
      
   return TRUE;
}

//========================================================
// Таблица сообщений класса CMultiBarWindow
//========================================================
BEGIN_MESSAGE_MAP(CMultiBarWindow, CFrameWnd)

   // Макрокоманда вызывает метод OnCreate
   ON_WM_CREATE()

   // Обработчики команд от панели управления Player
   ON_COMMAND(ID_STOP, BarCommandOne)
   ON_COMMAND(ID_PLAY, BarCommandOne)
   ON_COMMAND(ID_PAUSE, BarCommandOne)
   ON_COMMAND_RANGE(ID_LEFT, ID_RIGHT, 
                                                  BarCommandRange)
   ON_COMMAND_RANGE(ID_TYPE, ID_WAVE, 
                                                  BarCommandRange)

   // Обработчики команд от панели управления Extended
   ON_COMMAND(ID_ADD, AddStringToComboBox)
   ON_COMMAND_RANGE(ID_FOTO, ID_DISK, 
                                                  BarCommandRange)

   // Обработчик команд от панели управления Style
   ON_COMMAND_RANGE(ID_UNDERLINE, ID_MARK_4, 
                                                  BarCommandRange)

   // Обработчики команд меню View
   ON_COMMAND_EX(ID_Style, ShowStyle)
   ON_COMMAND_EX(ID_Extended, ShowStyle)
   ON_COMMAND_EX(ID_Player, ShowStyle)

END_MESSAGE_MAP()

//========================================================
// Метод InitInstance класса CMultiBarApp
// Создает главное окно приложения и отображает его на экране
//========================================================
BOOL CMultiBarApp::InitInstance()
{
   m_pMainWnd = new CMultiBarWindow();
   m_pMainWnd -> ShowWindow(m_nCmdShow);
   m_pMainWnd -> UpdateWindow();

   return TRUE;
}

//========================================================
// Конструктор класса CMultiBarWindow
//========================================================
CMultiBarWindow::CMultiBarWindow()
{ 
   // Создаем окно приложения, соответствующее 
   // данному объекту класса CMultiBarWindow
   Create(NULL, "Multi Bar", WS_OVERLAPPEDWINDOW,
         rectDefault, NULL, MAKEINTRESOURCE(IDR_MENU)); 
}

//========================================================
// Метод OnCreate класса CMultiBarWindow
// Используется для создания панелей управления
//========================================================
int CMultiBarWindow::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
   // Вызываем метод OnCreate базового класса
   if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
      return -1;

   // Разрешаем присоединение панелей управления ко 
   // всем сторонам окна CMultiBarWindow
	EnableDocking(CBRS_ALIGN_ANY);
   
   //  Переменные для изменения стилей кнопок 
   UINT nBarStyle;
   int nIndex;
//========================================================
// Создаем и отображаем панель управления Player
//========================================================
   // Создаем панель управления toolbar
   if (!m_wndPlayerBar.Create(this, WS_CHILD | WS_VISIBLE | 
      CBRS_SIZE_DYNAMIC | CBRS_BOTTOM  | 
      CBRS_TOOLTIPS, ID_Player))
   {
      // Ошибка при создании панели управления
      TRACE0("Failed to create toolbar\n");
      return -1;
   }
	
   // Загружаем ресурс панели управления Player
   if (!m_wndPlayerBar.LoadToolBar(IDR_PLAYER))
   {
      // Ошибка при загрузке ресурса панели управления 
      TRACE0("Failed to load toolbar\n");
      return -1;
   }
   
   // Устанавливаем заголовок панели управления Player
   m_wndPlayerBar.SetWindowText("Player");      
   
   // Из кнопок с идентификаторами ID_TYPE, ID_CD_DRV и ID_WAVE
   // делаем трехпозиционный переключатель с зависимой фиксацией.
   // Устанавливаем для этих кнопок стиль TBBS_CHECKGROUP
   nIndex = m_wndPlayerBar.CommandToIndex(ID_TYPE);
   nBarStyle =  m_wndPlayerBar.GetButtonStyle(nIndex) | TBBS_CHECKGROUP;
   m_wndPlayerBar.SetButtonStyle(nIndex, nBarStyle);

   nIndex = m_wndPlayerBar.CommandToIndex(ID_CD_DRV);
   nBarStyle =  m_wndPlayerBar.GetButtonStyle(nIndex) | TBBS_CHECKGROUP;
   m_wndPlayerBar.SetButtonStyle(nIndex, nBarStyle);

   nIndex = m_wndPlayerBar.CommandToIndex(ID_WAVE);
   nBarStyle =  m_wndPlayerBar.GetButtonStyle(nIndex) | TBBS_CHECKGROUP;
   m_wndPlayerBar.SetButtonStyle(nIndex, nBarStyle);
    
   // Из кнопоки с идентификатором ID_PAUSE делаем переключатель.
   // Устанавливаем для этой кнопки стиль TBBS_CHECKBOX
   nIndex = m_wndPlayerBar.CommandToIndex(ID_PAUSE);
   nBarStyle =  m_wndPlayerBar.GetButtonStyle(nIndex) | TBBS_CHECKBOX;
   m_wndPlayerBar.SetButtonStyle(nIndex, nBarStyle);
   
   // Разрешаем пристывковывать панель управления Player к 
   // любой строне родительского окна
   m_wndPlayerBar.EnableDocking(CBRS_ALIGN_ANY );

   // Пристывковываем панель управления Player к родительскому 
   // окну
	DockControlBar(&m_wndPlayerBar);

//========================================================
// Создаем и отображаем панель управления Style
//========================================================
   // Создаем панель управления toolbar
   if (!m_wndStyleBar.Create(this, WS_CHILD | WS_VISIBLE | 
      CBRS_SIZE_FIXED | CBRS_TOP | CBRS_TOOLTIPS, ID_Style))
   {
      // Ошибка при создании панели управления
      TRACE0("Failed to create toolbar\n");
      return -1;
   }

   // Загружаем ресурс панели управления Style
   if (!m_wndStyleBar.LoadToolBar(IDR_STYLE))
   {
      // Ошибка при загрузке ресурса панели управления
      TRACE0("Failed to load toolbar\n");
      return -1;
   }

   // Устанавливаем заголовок панели управления Style
   m_wndStyleBar.SetWindowText("Style");   

   // Запрещаем пристывковывать панель управления Player к 
   // родительскому окну
   m_wndStyleBar.EnableDocking(0);

   // Устанавливаем для кнопки ID_SUBSCRIPT стиль TBBS_WRAPPED
   nIndex = m_wndStyleBar.CommandToIndex(ID_SUBSCRIPT);
   nBarStyle =  m_wndStyleBar.GetButtonStyle(nIndex) | TBBS_WRAPPED;
   m_wndStyleBar.SetButtonStyle(nIndex, nBarStyle);
 
   // Устанавливаем для кнопки ID_TEXT_JUSTIFY стиль TBBS_WRAPPED
   nIndex = m_wndStyleBar.CommandToIndex(ID_TEXT_JUSTIFY);
   nBarStyle =  m_wndStyleBar.GetButtonStyle(nIndex) | TBBS_WRAPPED;
   m_wndStyleBar.SetButtonStyle(nIndex, nBarStyle);
 
   // Отображаем панель управления Style в мини-окне.
   // Начальные координаты панели управления определяются 
   // значением объекта pointStyleBar класса CPoint 
   CPoint pointStyleBar(100, 100);
   FloatControlBar(&m_wndStyleBar, pointStyleBar);
  
//========================================================
// Создаем и отображаем панель управления Extended
//========================================================
   // Создаем панель управления Extended
   if (!m_wndExtendedBar.Create(this, WS_CHILD | WS_VISIBLE | 
      CBRS_SIZE_DYNAMIC | CBRS_TOP | CBRS_TOOLTIPS, ID_Extended))
   {
      // Ошибка при создании панели управления
      TRACE0("Failed to create toolbar\n");
      return -1;
   }
	
   // Загружаем ресурс панели управления Extended
   if (!m_wndExtendedBar.LoadToolBar(IDR_EXTENDED))
   {
      // Ошибка при загрузке ресурса панели управления
      TRACE0("Failed to load toolbar\n");
      return -1;
   }

   // Устанавливаем заголовок панели управления Extended
   m_wndExtendedBar.SetWindowText("Extended");      

	// Увеличиваем размер первого разделителя. 
   // Этот разделитель имеет индекс 2
	m_wndExtendedBar.SetButtonInfo(2, IDW_EDIT, TBBS_SEPARATOR, 130);

   // Определяем координаты прямоугольной области панели управления,
   // занимаемой разделителем
	CRect rectEdit;
	m_wndExtendedBar.GetItemRect(2, &rectEdit);

   // Делаем отступ с левой и правой стороны
   rectEdit.left += 6;
   rectEdit.right -= 6;
   
   // Размещаем на панели управления Extended, в области rectEdit
   // однострочный текстовый редактор
   if (!m_wndExtendedBar.m_edit.Create(WS_CHILD |
      ES_AUTOHSCROLL|WS_VISIBLE|WS_TABSTOP|WS_BORDER,
      rectEdit, &m_wndExtendedBar, IDW_EDIT))
	{
      // Ошибка при создании текстового редактора
      TRACE0("Failed to create edit-box\n");
		return FALSE;
	}

	// Увеличиваем размер второго разделителя. 
   // Этот разделитель имеет индекс 4
	m_wndExtendedBar.SetButtonInfo(4, IDW_SPIN, TBBS_SEPARATOR, 150);

   // Определяем координаты прямоугольной области панели управления,
   // занимаемой разделителем
	CRect rectComboBox;
	m_wndExtendedBar.GetItemRect(4, &rectComboBox);

   // Делаем отступ с левой и правой стороны
   rectComboBox.left += 6;
   rectComboBox.right -= 6;

   // Увеличиваем высоту прямоугольной области, чтобы в ней можно 
   // было разместить список с полем редактирования
   rectComboBox.bottom = rectComboBox.top + 80;

   // Размещаем на панели управления Extended, в области rectComboBox
   // список с полем редактирования
   if (!m_wndExtendedBar.m_combo_box.Create(
			CBS_DROPDOWN | WS_CHILD | WS_VISIBLE | WS_VSCROLL |
         CBS_AUTOHSCROLL|CBS_DISABLENOSCROLL,
			rectComboBox, &m_wndExtendedBar, IDW_SPIN))
	{
      // Ошибка при создании списока с полем редактирования
		TRACE0("Failed to create combo-box\n");
		return FALSE;
	}

   // Добавляем три строки в список m_combo_box
   m_wndExtendedBar.m_combo_box.AddString("One");
   m_wndExtendedBar.m_combo_box.AddString("Two");
   m_wndExtendedBar.m_combo_box.AddString("Third");
   
   // Разрешаем пристывковывать панель управления Player к 
   // левой, верхней и нижней строне родительского окна
   m_wndExtendedBar.EnableDocking(
         CBRS_ALIGN_LEFT | CBRS_ALIGN_TOP | CBRS_ALIGN_BOTTOM );
	
   // Пристывковываем панель управления Player к родительскому 
   // окну
   DockControlBar(&m_wndExtendedBar);

   return 0;
}
