Приложение 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;
}