Здорова ребятки! Сегодня попробуем разобрать такую штуку как панели состояния в MFC, как их создавать и что это такое. По умолчанию панель состояния расположена в нижней части окна приложения
как видите панель состояния на рисунке состоит из четырех секций Готово, CAP,NUM и SCRL. В панели состояния можно вывести то, что мастер Application Wizard предлагает по умолчанию, но вам нужен доступ к переменной m_wndStatusBar объекта CMainFrame, которая предоставляет эту панель. Давайте для начала создадим само приложение, а то я наперед забежал. И так создаем самое простейшее MDI приложение как на рисунке ниже
это самое простое приложение и там мы видим какая создалась панель по умолчанию. Мы ее трогать не будем, а будем создавать еще одну панель для дочерних классов фрейма CChildFrame. Первое добавляем открытую переменную типа CMFCStatusBar m_StatusBar в класс CChildFrame который отвечает за создание окна для представлений
1 2 3 |
public: // Объект панели состояния CMFCStatusBar m_StatusBar; |
Дальше идем в окно ресурсов, выбираем таблицу stringtable
Выбираем ее и добавляем идентификатор ID_STATUS и значение его «Value : 1«, на рисунке ниже после добавления у вас оно должно появится в таблице
Идем дальше, нам нужно инициализировать переменную m_StatusBar непосредственно перед тем как отобразится окно видимого представления. Поэтому с помощью окна свойств класса CChildFrame добавьте в класс функцию, которая будет вызываться в ответ на сообщение WM_CREATE, отправленное приложению при создании окна. Просто выберим класс CChildFrame, перейдем в его свойства и выберем из списка сообщение WM_CREATE и добавим его обработчик как на рисунке ниже
После выбора <Add> OnCreate у вас появится функция обработчик OnCreate и добавьте в нее код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
int CChildFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CMDIChildWndEx::OnCreate(lpCreateStruct) == -1) return -1; //Создать панель состояния m_StatusBar.Create(this); static UINT indicators[]={ID_STATUS};//создание массива индикаторов m_StatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));//инициализация массива индикаторов m_StatusBar.SetPaneStyle(0,SBPS_STRETCH);//растянуть первую панель return 0; } |
Компилируйте запускайте и у вас в окна обрамления вида появилась панель состояния
Функция SetPaneStyle задает стили для панели в таблице ниже вы можете их увидеть какие еще существуют
Код стиля | Внешний вид |
SBPS_NORMAL | Не установлено никаких стилей растяжения, границ или возникновения |
SBPS_POPOUT | Текст имеет границу, которая выглядит выступающей над поверхностью панели состояния |
SBPS_NOBORDERS | Текст отображается без границ |
SBPS_DISABLED | Текст в панели не отображается |
Если хотите добавить в строку состояния несколько панелей, разделите их, включив символ ID_SEPARATOR между символами в массиве индикаторов. Приведем примерчик, только добавим еще один элемент в таблицу String Table который будет назваться ID_STATUS1 и иметь значение value1 : 1
И изменим функцию обработчик события WM_CREATE
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
int CChildFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CMDIChildWndEx::OnCreate(lpCreateStruct) == -1) return -1; //Создать панель состояния m_StatusBar.Create(this); static UINT indicators[]={ID_STATUS,ID_SEPARATOR,ID_STATUS1};//создание массива индикаторов m_StatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));//инициализация массива индикаторов m_StatusBar.SetPaneStyle(0,SBPS_STRETCH);//растянуть первую панель return 0; } |
все компилируем запускаем и у нас уже две секции в панели инструментов.
Теперь давайте заставим эти секции работать, для этого нам нужно добавить в классе вида, зайдите в Окно классов и щелкните правой клавишей мышки по классу CTestStatusBarView
Вы попадете в мастер классов
выберите наш идентификатор ID_STATUS, выберите UPDATE_COMMAND_UI и нажмите кнопку добавить обработчик и у вас появится окошко
нажимайте Ок и в самом мастере классов MFC нажмите Ок и у вас создастся пустой обработчик OnUpdateStatus, добавим в него следующий код
1 2 3 4 5 6 7 |
void CTestStatusBarView::OnUpdateStatus(CCmdUI *pCmdUI) { pCmdUI->Enable(); CString status; status.Format(_T(" Value : %d"),m_value); pCmdUI->SetText(status); } |
Добавьте переменную в класс вида типа int и названия m_value
1 2 |
// хранит значение статуса int m_value; |
Добавим новый пункт меню в котором будут несколько подпунктов изменяющие данный статус на соответствующие значения, как на рисунке ниже
мы создали пункт status и четыре подпункта, так же я создал пункт status 1 и там так же 4 подпункта, но они пока нам не нужны, нам нужны пока пункт status со своими четырмя подпунктами, для них создаем обработчики событий которые представлены ниже
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
void CTestStatusBarView::OnStatus1() { m_value=1; } void CTestStatusBarView::OnStatus2() { m_value=2; } void CTestStatusBarView::OnStatus3() { m_value=3; } void CTestStatusBarView::OnStatus4() { m_value=4; } |
Компилируем и запускаем и у нас уже когда мы выбираем пункт меню допустим 3 и статус бар меняется на 3 как на рисунке ниже
Так же само по подобному принципу создаем обновление и для второй секции, начинаем с обработчика в классе вида, только уже выбираем идентификатор ID_STATUS1 как на скрине ниже и создаем обработчик
Нажимаем кнопку добавить обработчик и нажимаем Ок и затем уже в мастере классов так же Ок и у нас создается функция обработчик OnUpdateStatus1
1 2 3 4 5 6 7 |
void CTestStatusBarView::OnUpdateStatus1(CCmdUI *pCmdUI) { pCmdUI->Enable(); CString status; status.Format(_T(" Value : %d"),m_value2); pCmdUI->SetText(status); } |
так же добавим в класс вида переменную m_value2 и обработчики для пункта меню status2 как и в первом случае такие же
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
void CTestStatusBarView::OnStatus11() { m_value2=1; } void CTestStatusBarView::OnStatus12() { m_value2=2; } void CTestStatusBarView::OnStatus13() { m_value2=3; } void CTestStatusBarView::OnStatus14() { m_value2=4; } |
компилируем запуск и при выборе меню status1 и пункта 4 у нас действительно уже изменяется идентификатор второй для строки состояния ка на рисунке ниже.
[youtube]https://www.youtube.com/watch?v=oq-_uDuBHwU[/youtube]