Microsoft Visual C++ и MFC. Программирование для Win95 и WinNT

Приложение MultiBar


Создайте новый проект под названием MultiBar. В качестве типа приложения выберите из списка Type строку Application. Настройте проект MultiBar, точно также как вы настраивали проект Bar - укажите, что приложение будет работать с библиотекой классов MFC.

Наберите в редакторе исходный текст приложения и сохраните его в файле MultiBar.cpp (листинг 3.7). За основу вы можете взять файл Bar.cpp приложения Bar. Включите готовый файл MultiBar.cpp в проект.

Листинг 3.7. Файл MultiBar.cpp

//============================================================

// Приложение MultiBar

// (c) Frolov G.V., 1996

// E-mail: frolov@glas.apc.org

//============================================================

// Исключаем редко используемые определения из

// включаемых файлов

#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_COMBO,

      TBBS_SEPARATOR, 150);

   // Определяем координаты прямоугольной области панели

   // управления, занимаемой разделителем

   CRect rectComboBox;

   m_wndExtendedBar.GetItemRect(4, &rectComboBox);

   // Делаем отступ с левой и правой стороны

   rectComboBox.left += 6;

   rectComboBox.right -= 6;

   // Увеличиваем высоту прямоугольной области, чтобы в ней

   // можно было разместить список combo-box

   rectComboBox.bottom = rectComboBox.top + 80;

   // Размещаем на панели управления Extended, в области

   // rectComboBox список combo-box

   if(!m_wndExtendedBar.m_combo_box.Create(

      CBS_DROPDOWN | WS_CHILD | WS_VISIBLE | WS_VSCROLL |

      ES_AUTOHSCROLL | CBS_DISABLENOSCROLL,

      rectComboBox, &m_wndExtendedBar, IDW_COMBO))

   {

      // Ошибка при создании списка

      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");

  

   // Разрешаем пристывковывать панель управления Extended к

   // любой из строн родительского окна

   m_wndExtendedBar.EnableDocking(CBRS_ALIGN_ANY );

   // Пристывковываем панель управления Extended к

   // родительскому окну

   DockControlBar(&m_wndExtendedBar);

   return 0;

}


Содержание раздела