Шаг 5 - Создание панели состояния

Создание проекта

Продолжаем развитие проекта. В предыдущих шагах все понятно, сосредоточимся на главном. Сейчас мы будем создавать панель состояния, и результат станет очень похожим на результаты использования волшебника!

Создаем код

В описания включаемых файлов добавим:

#include "afxext.h"     // MFC Расширения

В описание класса рамки окна:

class CMainWnd : public CFrameWnd
{
public:
	CMainWnd();	// Конструктор по умолчанию
	afx_msg void OnLButtonDblClk( UINT, CPoint );	// виртуальная процедура ответа на левую кнопку
	afx_msg void OnRButtonDblClk( UINT, CPoint );	// виртуальная процедура ответа на правую кнопку
	afx_msg void OnKeyDown( UINT, UINT, UINT );	// виртуальная процедура ответа на клавишу
	int OnCreate(LPCREATESTRUCT lpCreateStruct);	// эта функция вызывается при создании окна
	~CMainWnd();	// Деструктор
private:
	CStatic* MyStatic;		// Указатель на объект надпись
	CMyButton* MyButton;	// Элемент управления кнопка
	CEdit* MyEdit;		// Указатель на объект поле редактирования
	CStatusBar m_wndStatusBar;	// класс панели состояния
	DECLARE_MESSAGE_MAP();	// таблица откликов
};

В таблице откликов:

BEGIN_MESSAGE_MAP(CMainWnd, CFrameWnd)	// таблица откликов на сообщения
	ON_WM_LBUTTONDBLCLK()		// реакция на нажатие левой кнопки мыши
	ON_WM_RBUTTONDBLCLK()		// реакция на нажатие правой кнопки мышки
	ON_WM_KEYDOWN()			// реакция на нажатие клавиши
	ON_WM_CREATE()			// событие создания окна
END_MESSAGE_MAP()

Реализация объявленной процедуры:

int CMainWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	m_wndStatusBar.Create(this);
		return 0;
}

Описание

Для создания панели состояния нам естественно нужен MFC класс. В файле afxwin.h его нет. Но зато он есть в afxrxt.h. Его и надо подключить.

Следующим шагом этот класс мы и включаем в класс окна. Заметьте, он включен статически. То есть при создании объекта окна, автоматически создается класс панели состояния, и он будет жить, пока живет объект рамки окна. Это и нужно. Хотя можно и динамически.

Определили функцию OnCreate(). Эта функция при соблюдении условия (смотри ниже) вызывается при создании окна. Но она не виртуальная и код этой функции нам нужен. Вывод: вы можете переопределить любой метод (функция) класса. Вот!

Определяем реакцию на событие создания окна. Это нужно делать обязательно во многих случаях. Если этого не сделать, то функция не выполнится никогда. Это очень важно. Если вы переопределяете метод (функцию) класса и ничего не происходит, проверьте, а нет ли необходимого сообщения для работы этой функции. Например, OnPaint() требует событие ON_WM_PAINT, иначе на экране ничего не будет. Как правило, многие методы требуют определения реакции на соответствующее сообщение.

И, наконец, пишем саму функцию. Результат работы этой функции число. Если -1, то окно не создано. И код реализации окна нам нужен, поэтому и был вызван метод папы в этой функции - CFrameWnd::OnCreate. На параметры не обращайте пока внимание, не в этом суть. Правило - переопределил метод, вызови метод папы Папа::Метод() и делай дальше, что хочешь.

Код дальше вызывает метод класса "Панель состояния" для её создания. С параметром куда вставлять - сюда, в рамку окна.

Как обычно и запуск. Панель есть внизу, как настоящая, но пока пустая. Всё, пора пить кофе.

5_1.gif (2062 b)

Шпаргалка

  1. Включаем библиотеку расширений MFC:
    #include "afxext.h"
    
  2. В класс рамки окна добавляем процедуры создания и описание класса панели состояния.
    int OnCreate(LPCREATESTRUCT lpCreateStruct);
    CStatusBar m_wndStatusBar;
    
  3. Добавить в таблицу откликов реакцию на создание окна:
    ON_WM_CREATE()
    
  4. Описать процедуру создания окна и добавить создание панели состояния:
    m_wndStatusBar.Create(this);
    

Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.