KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Александр Фролов - Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT. Часть 2

Александр Фролов - Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT. Часть 2

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн "Александр Фролов - Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT. Часть 2". Жанр: Программирование издательство -, год -.
Перейти на страницу:

Методика размещения полосы progress bar на панели состояния достаточно проста. В тот момент, когда потребуется вывести полосу progress bar, просто создайте ее, указав в качестве родительского окна панель состояния. Координаты линейного индикатора progress bar желательно выбрать таким образом, чтобы он отображался на месте одного из индикаторов. Предварительно вы можете убрать рамку с этого индикатора и заблокировать его так, чтобы в нем не отображался текст.

Приложение Status

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

Наберите в редакторе исходный текст приложения и сохраните его в файле Status.cpp (листинг 3.13). Включите готовый файл DialogBar.cpp в проект.

Листинг 3.13. Файл Status.cpp

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

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

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

// E-mail: [email protected]

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


// Включаемые файлы для MFC

#include <afxwin.h>

#include <afxext.h>

#include <afxcmn.h>


// Включаемый файл для ресурсов приложения и идентификаторов

#include "resource.h"


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

// Класс CStateApp – главный класс приложения

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

class CStateApp : public CWinApp {

public:

 // Мы будем переопределять метод InitInstance,

 // предназначенный для инициализации приложения

 virtual BOOL InitInstance();

};


// Создаем объект приложение класса CStateApp

CStateApp StateApp;


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

// Класс CStateWindow – представляет главное окно

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

class CStateWindow : public CFrameWnd {


protected:

 CStatusBar  m_wndStatusBar; // Панель состояния

 BOOL  bIndicatorTEXT;       // Флаг для управления

                             // индикатором

                             // ID_INDICATOR_TEXT


protected:

 // Метод для создания окна приложения и панели состояния

 afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);


public:

 // Объявляем конструктор класса CStateWindow

 CStateWindow();


 // Объявляем методы для обработки команд меню

 afx_msg BOOL OnMenuDirectADD_SUB(UINT nID);

 afx_msg void OnMenuProcessBar();

 afx_msg void OnMenuDisableADD_SUB();

 afx_msg void OnMenuSwitchTEXT();

 afx_msg void OnMenuExit();


 // Метод для обработки команды ON_UPDATE_COMMAND_UI

 // от индикатора ID_INDICATOR_TEXT

 afx_msg void OnUpdateTEXT(CCmdUI* pCmdUI);


 // Макрокоманда необходима, так как класс

 // CStateWindow обрабатывает сообщения

 DECLARE_MESSAGE_MAP()   

};


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

// Таблица сообщений класса CStateWindow

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

BEGIN_MESSAGE_MAP(CStateWindow, CFrameWnd)


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

 ON_WM_CREATE()


 // Обработчик сообщения ON_UPDATE_COMMAND_UI

 ON_UPDATE_COMMAND_UI(ID_INDICATOR_TEXT, OnUpdateTEXT)


 // Обработчики команд меню Work

 ON_COMMAND(ID_WORK_PROCESS, OnMenuProcessBar)

 ON_COMMAND(ID_WORK_DISABLE_ADDSUB, OnMenuDisableADD_SUB)

 ON_COMMAND(ID_WORK_ON_SWITCH_TEXT, OnMenuSwitchTEXT)  

 ON_COMMAND_EX(ID_WORK_DIRECT_ADD, OnMenuDirectADD_SUB)

 ON_COMMAND_EX(ID_WORK_DIRECT_SUB, OnMenuDirectADD_SUB) 

 ON_COMMAND(ID_WORK_EXIT, OnMenuExit)


END_MESSAGE_MAP()


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

// Индикаторы панели управления. Порядок идентификаторов

// соответствует порядку индикаторов в панели состояния

// (до тех пор, пока он не изменен методом SetPaneInfo)

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

static UINT indicators[] = {

 ID_SEPARATOR,          // Самый первый индикатор

 ID_INDICATOR_OVR,      // Индикатор OVR

 ID_INDICATOR_PROGRESS, // Резервирование места для

                        // progress bar

 ID_INDICATOR_CAPS,     // Индикатор клавиши <Caps Lock>

 ID_INDICATOR_NUM,      // Индикатор клавиши <Num Lock>

 ID_INDICATOR_SCRL,     // Индикатор клавиши <Scroll Lock>

 ID_INDICATOR_TEXT,     // Индикатор TEXT/PIC

 ID_INDICATOR_ADD,      // Индикатор ADD/SUB (начальное

                        // состояние START)

};


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

// Метод InitInstance класса CStateApp

// Создает главное окно приложения и отображает его на экране

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

BOOL CStateApp::InitInstance() {

 m_pMainWnd = new CStateWindow();

 m_pMainWnd->ShowWindow(m_nCmdShow);

 m_pMainWnd->UpdateWindow();

 return TRUE;

}


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

// Конструктор класса CStateWindow

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

CStateWindow::CStateWindow() {

 // Создаем окно приложения, соответствующее

 // данному объекту класса CStateWindow

 Create(NULL, "Status Bar Sample", WS_OVERLAPPEDWINDOW, rectDefault, NULL, MAKEINTRESOURCE(IDR_MENU));


 // Устанавливаем значение флага bIndicatorTEXT

 bIndicatorTEXT = TRUE;

}


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

// Метод OnMenuProcessBar класса CStateWindow

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

void CStateWindow::OnMenuProcessBar() {

 // Определяем координаты индикатора ID_INDICATOR_PROGRESS

 RECT rectProgress;

 m_wndStatusBar.GetItemRect(m_wndStatusBar.CommandToIndex(ID_INDICATOR_PROGRESS), &rectProgress);


 // Создаем полосу progress bar. Размещаем ее

 // на месте индикатора ID_INDICATOR_PROGRESS

 CProgressCtrl ctrlProgressBar;


 if (!ctrlProgressBar.Create(WS_CHILD | WS_VISIBLE, rectProgress, &m_wndStatusBar, 1)) {

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

  TRACE0("Failed to create progress barn");

  return;

 }


 // Устанавливаем границы для progress bar

 ctrlProgressBar.SetRange(0, 100);


 // Устанавливаем шаг приращения для progress bar

 ctrlProgressBar.SetStep(1);


 // Плавно увеличиваем положение progress bar

 for (int i=0; i<100; i++) {

  // Выполняем короткую задержку

  Sleep(10);


  // Выполняем шаг приращения progress bar

  ctrlProgressBar.StepIt();

 }


 // По завершении, отображаем текст в самом первом

 // индикаторе панели состояния

 m_wndStatusBar.SetWindowText("Process completed");

}


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

// Метод OnMenuDirectADD_SUB класса CStateWindow

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

BOOL CStateWindow::OnMenuDirectADD_SUB(UINT nID) {

 // Определяем индекс индикатора ID_INDICATOR_ADD

 int nIndex = m_wndStatusBar.CommandToIndex(ID_INDICATOR_ADD);


 // Устанавливаем нормальный режим отображения индикатора

 m_wndStatusBar.SetPaneStyle(nIndex, SBPS_NORMAL);


 // Из меню Work выбрана строка Direct set ADD

 if (nID == ID_WORK_DIRECT_ADD) {

  // Выводим текст ADD

  m_wndStatusBar.SetPaneText(nIndex, "ADD");

 }


 // Из меню Work выбрана строка Direct set SUB

 else if(nID == ID_WORK_DIRECT_SUB)   {

  // Изменяем внешний вид индикатора

  m_wndStatusBar.SetPaneStyle(nIndex, SBPS_POPOUT);


  // Выводим текст SUB

  m_wndStatusBar.SetPaneText(nIndex, "SUB");

 }


 return TRUE;

}


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

// Метод OnMenuDisableADD_SUB класса OnMenuDisableADD_SUB

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

void CStateWindow::OnMenuDisableADD_SUB() {

 // Определяем индекс индикатора ID_INDICATOR_ADD

 int nIndex = m_wndStatusBar.CommandToIndex(ID_INDICATOR_ADD);


 // Блокируем индикатор

 m_wndStatusBar.SetPaneStyle(nIndex, SBPS_DISABLED);

}


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

// Метод OnUpdateTEXT класса CStateWindow

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

void CStateWindow::OnMenuSwitchTEXT() {

 // Изменяем состояние флага bIndicatorTEXT,

 // который используется методом OnUpdateTEXT

 bIndicatorTEXT = !bIndicatorTEXT;

}


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

// Метод OnMenuExit класса CStateWindow

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

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*