69271

Рядок стану

Лекция

Информатика, кибернетика и программирование

Рядок стану є багатоелементною смугою, розташованою внизу фреймового вікна. Вона використовується для відображення різних даних, специфічних для цього додатку. Практично всі додатки Windows (як SDI, так і MDI) мають рядки стану. Крім того, вони є навіть у деяких діалогових застосувань.

Украинкский

2014-10-02

64 KB

0 чел.

Лекція № 13

Тема: Рядок стану

План

  1.  Створення і маніпулювання рядками стану
  2.  Стандартна поведінка рядків стану
  3.  Місце розташування рядків стану
  4.  Додавання в рядок стану текстових панелей

Створення і маніпулювання рядками стану

Рядок стану є багатоелементною смугою, розташованою внизу фреймового вікна. Вона використовується для відображення різних даних, специфічних для цього додатку. Практично всі додатки Windows (як SDI, так і MDI) мають рядки стану. Крім того, вони є навіть у деяких діалогових застосувань. На мал. представлений рядок стану, використовуваний текстовим процесором Microsoft Word для Windows. Звернете увагу, рядок стану відображає інформацію про поточну сторінку, розділ, рядок і позицію курсора, а також декілька додаткових панелей, що інформують про стан клавіатури і про наявність в документі слів, не знайдених в словнику Word (невелика піктограма, із зображенням книги, закресленої символом X). У цьому розділі описується, як за допомогою бібліотеки MFC створити простий рядок стану.

Рядок стану є стандартним засобом сповіщення користувача про стан додатку, а також засобом відображення будь-якої іншої інформації, специфічної для додатку

Стандартна поведінка рядків стану

Кожного разу, коли майстер AppWizard створює додаток SDI або MDI, він автоматично додає в нього рядок стану, досить довгу панель, що містить (зліва направо), призначену для підказок меню, а також три менші панелі, що відображають стан клавіш Caps, Num і Scroll lock. Отже приступимо до вивчення застосування цього елементу управління.

У середовищі виконання MFC рядок стану представлений класом CStatusBar, а стандартним местомом розташування коди рядка стану є клас CMainFrame. З нього і почнемо. (Рядки стану можна створювати і для діалогових вікон, але оскільки це трохи складніше, розглянемо їх декілька пізніше.)

Створіть проект додатку SDI і, відкривши його файл заголовка mainFrm.h, звернете увагу на створене майстром AppWizard визначення змінної-члена рядка стану:

protected: // Змінні-члени вбудованих елементів управління

CStatusBar m_wndStatusBar;

 

Тепер відкрийте файл mainfrm.cpp і знайдіть функцію OnCreate. Як і виходить з її назви, вона виконується при створенні вікна. Вікна додатків SDI і MDI створюються усередині фреймів, що несуть відповідальність за забезпечення таких, загальноприйнятих елементів, як межі (що дозволяють змінювати розміри), рядка стану і панелі інструментів. Приведений нижче код — це і все, що потрібне функції CMainFrame::OnCreate, щоб відобразити стандартний рядок стану:

if (!m_wndStatusBar.Create(this) ||

!m_wndStatusBar.Setlndicators(indicators,sizeof(indicators)/sizeof(UINT)))

{

TRACE0("Failed to create status bar\n");

return -1; // створити не вдалося

}

Як можна відмітити, спочатку код просто викликає функцію рядка стану Create (успадковану від класу CWnd). Передаваний нею покажчик this означає, що батьківським вікном рядка стану буде об'єкт CMainFrame. Функції Create можуть бути передані і інші параметри, наприклад, стиль вікна і ідентифікатор ресурсу рядка стани, які обговорюються декілька пізніше. Проте на справжній момент цілком підходять і стандартні значення, прийняті за умовчанням для цих параметрів.

Потім слідує звернення до функції Setlndicators. Цій функції додаток передає масив значень, що є ідентифікаторами різних ресурсів, відповідних значенням, що відображаються в рядку стану. Передавані в даному випадку значення об'єднані в масив indicators (індикатори), визначення якого розташоване на початку файлу MainFrm.cpp і має наступний вигляд:

static UINT indicators[] =

{

ID_SEPARATOR // Індикатори рядка стану

ID_INDICATOR_CAPS

ID_INDICATOR_NUM

ID_INDICATOR_SCRL 

};

Нескладне розслідування показує, що ідентифікатори ресурсів ID_INDICATOR_CAPS, ID_INDICATOR_NUMH, ID_INDICATOR_SCRL належать строковим ресурсам, визначеним у файлі .rc додатки таким чином (виділено напівжирному шрифтом):

STRINGTABLE 

BEGIN

ID__INDICATOR_EXT "EXT"

ID_INDICATOR_CAPS "CAP"

ID_INDICATOR_NUM "NUM"

ID_INDICATOR_SCRL "SCRL"

ID_INDICATOR_OVR "OVR"

ID_INDICATOR REC "REC"

END

Що таке ідентифікатор ресурсу ID__SEPARATOR? Це спеціальне значення, що повідомляє середовище виконання, що з даною конкретною панеллю рядка стану не асоційований жоден строковий ресурс. Фактично, якщо створене майстром Аррwizard додаток запустити на виконання, то в панелі зліва від індикаторів Caps, Num і Scroll Lock буде відображений текст Ready (Готово). Але якщо потім розкрити яке-небудь меню і перемістити курсор миші на будь-який з його пунктів, можна відмітити, що ця панель рядка стану змінилася і відображає текст рядка підказки, відповідний поточному пункту меню. Отже, про рядок стану на справжній момент відоме наступне.

- Клас CMainFrame містить переменную-член типу CStatusBar.

 - Ідентифікатори строкових ресурсів, що відображаються в рядку стану у вигляді набору індикаторів, визначені у файлі MainFrm. срр.

- Функція CMainFrame::OnCreate містить звернення до функції CStatusBar::Create, що дозволяє створити вікно рядка стану, а також до функції CStatusBar::Setlndicators, що дозволяє привласнити масив ідентифікаторів ресурсів тільки що створеному рядку стану.

Проте, можливості рядка стану дозволяють зробити значно більше, чим просто повідомити користувача про те, натискав він клавішу <CAPS Lock> чи ні. Отже, давайте розглянемо, як можна модифікувати рядок стану так, щоб вона задовольняла специфічним завданням конкретного застосування.

Місце розташування рядків стану

Як вже мовилося, звичайне вікно рядка стану створює код функції-члена OnCreate основного фреймового вікна:

m_wndStatusBar.Create(this);

Насправді функція CStatusBar::Create здатна приймати три параметри; проте, два з них мають значення за умовчанням, тому функцию-член CStatusBar::Create нерідко можна побачити одержуючою два додаткові аргументи:

virtual BOOL Create(

CWnd* pParentWnd

DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_BOTTOM, UINT nID = AFX_IDW_STATUS_BAR);

Призначення першого параметра (pParentWnd) цілком очевидно, і це єдиний аргумент, передача якого обов'язкова. Він є покажчиком на батьківське вікно рядка стану.

Другий параметр (dwStyle) — значення, використовуване для визначення стилю рядка стану, наприклад, чи є вона видимою (WS_VISIBLE), з якого боку батьківського вікна вона повинна бути відображена і так далі Розглянемо значення констант з префіксом CBRS_  детальніше.

Проглянувши вміст файлу afxres.h, можна відмітити, що розташування елементів управління, до яких відносяться і рядки стану, можна задати за допомогою чотирьох значень. Всі значення прапорів стилю, а також значення відповідних стилів вирівнювання і типів меж представлені в табл. Звернете увагу, стилі вирівнювання (CBRS_ALIGN_BOTTOM, CBRS__ALIGN_TOP, CBRS_ALIGN_RIGHT і CBRS_ALIGN_LEFT) є взаємовиключними, а стилі меж допускають сумісне використання.

Таблиця. Значення прапорів CBRS_ ДЛЯ місцеположення рядка стану

Прапор стилю  Комбінація місцеположення і типу меж

CBRS_TOP  CBRS_ALIGN_TOP  |  CBRS_BORDER_B0TTOM

CBRS_BOTTOM CBRS__ALIGN_BOTTOM |  CBRS_BORDER_TOP

CBRS_LEFT CBRS_ALIGN_JLEFT  |  CBRS_BORDER_RIGHT

CBRS__RIGHT CBRS ALIGN RIGHT  |  CBRS BORDER LEFT

 

Тут, ймовірно, доречно згадати про одну незадокументовану особливість. Насправді зі всіх цих значень для рядка стану допустимі тільки два: CBRS_BOTTOM і CBRS TOP. Якщо спробувати розташувати рядок стану справа або зліва, то при компіляції додатку буде відображено повідомлення про помилку у функції Сstatusbar::calcinsiderect, що свідчить про те, що "вертикальний рядок стану не підтримується" (vertical status bar not supported). Хоч і важко уявити собі ситуацію, де міг би знадобитися вертикальний рядок стану, було б непогано, якби подібна інформація містилася в довідковій системі.

Додавання в рядок стану текстових панелей

Засобом модифікації тексту панелі є функція CStatusBar::SetPaneText.

Синтаксис цієї функції такий:

BOOL SetPaneText(int nlndex,LPCTSTR IpszNewText, BOOL bUpdate = TRUE);

Перший параметр (nlndex) указує, яка з панелей рядка стану (починаючи з нуля) підлягає модифікації. Незабаром із цього приводу буде зроблено одне важливе зауваження. Другий параметр (IpszNewText) містить значення, підмет відображенню в цій панелі, а третій — (bUpdate) інформує середовище виконання про те, чи потрібна негайна перемальовування рядка стану чи ні. Якщо негайне перемальовування дійсно необхідне, то значенням цього параметра повинно бути TRUE.

Тепер, вивчивши вживаний синтаксис, давайте розглянемо конкретний приклад додавання тексту в панель рядка стану. Як можна відмітити, тут далеко не все так просто і очевидно, а крім того, передбачається наявність ряду додаткових дій. Припустимо, що в створюваному застосуванні присутня процедура реєстрації (login). Спробуємо відобразити в рядку стану результат спроби реєстрації, а у разі успіху і використовуваний ідентифікатор.

Спочатку створимо строковий ресурс повідомлення користувача про відмову в доступі. Зробити це зовсім нескладно, досить відкрити представлення Resource View (Ресурси), розвернути вузол String Table (Таблиця рядків), а потім двічі клацнути на елементі таблиці рядків. Коли з'явиться перелік рядків, слід натиснути клавішу <lnsert> і набрати необхідне значення, наприклад, щось подібне до <Not logged in> (У доступі відмовлено). Залишилося змінити ідентифікатор ресурсу нового рядка на що-небудь більш осмислене, типу IDS__LOGIN_STATUS, і додати нову панель в масив індикаторів таким чином:

static UINT indicators[] =

{

ID_SEPARATOR // Індикатори рядка стану

IDS_LOGIN_STATUS

ID_INDICATOR_CAPS

ID_INDICATOR_NUM

ID_INDICATOR_SCRL

}

Але якщо відкомпілювати і запустити додаток тепер, то панель відразу відобразить напис <Not logged in> (У доступі відмовлено). Отже, необхідно модифікувати код Функції реєстрації так, щоб він викликав функцію SetPaneText об'єкту рядка стану таким чином:

m_wndStatusBar.SetPaneText(l, strUserld);

 

Оскільки об'єкт рядка стану m_wndstatusBar є членом класу CMainFrame, це має на увазі, що що модифікує рядок стану код також знаходиться в класі CMainFrame.

Останнє, що необхідно зробити, — це додати обробник команди оновлення строкового ресурсу. Оскільки ідентифікатором ресурсу в даному випадку є IDS_LOGIN_STATUS, необхідно додати в карту повідомлень наступний елемент і функцію:

BEGIN MESSAGE_MAP(CMainFrame, CFrameWnd)

ON_WM_CREATE()

ON_COMMAND(ID_LOG_IN, OnLogln)

ON_COMMAND(ID_L0G_OUT, OnLogOut)

ON UPDATE_COMMAND_UI (IDS_LOGIN_STATUS, OnLoginStatus)

END MESSAGE_MAP()

void CMainFrame::OnLoginStatus(CCmdUI *pCmdUI)

{

pCmdUI->Enable(TRUE);

}

От і все. Залишилося згадати про параметр nlndex функції SetPaneText. Річ у тому, що передаване в нім значення повинне враховувати і панелі-роздільники (separator pane). Отже, якщо викликати функцію SetPaneText приведеним нижче чином, то при перегляді користувачем пункту меню текст поля буде замінений текстом підказки цього пункту меню.

m wndStatusBar.SetPaneText(0, strUserld);


 

А также другие работы, которые могут Вас заинтересовать

34012. Искусство как социокультурное явление.Эстетические основания и закономерности развития ис 45.5 KB
  Искусство это одна из форм культуры и сфера художественного творчества. философия исследует искусство в общем плане и в контексте жизни человека и общества. Искусство отражает и изображает жизнь в художественных образах которые позволяют человеку непосредственно в чувственном виде переживать то что в них заключил художник.
34013. Философское понимание культуры. Культура и цивилизация 26 KB
  Культура и цивилизация. Культура все созданное человеком; совокупность созданных и создаваемых человеком ценностей; качественная характеристика уровня развития ова. Там где есть человек его деятсть отношения между людьми там имеется и культура. Культура: материальная и духовная не противопоставлять.
34014. Филсофия Древней Индии 23 KB
  э Мир вечен никем никогда не был создан остоянно развивается делится на мир приоды и мир людей. Мир природы гормоничен и спокоен; мир людей мир страданий.э Мир вечен никем никогда не создан. Сущность мира изменеие развия.
34015. Философия русской культуры 110 KB
  Сущность любой культуры раскрывается в основополагающих ценностях: добре и зле свободе справедливости любви и т. Непосредственный объект любви в нем не человечество потому что вызвать любовь может только нечто наглядное; человечество просто карта которая разыгрывается им против того что ненавидят. Не уважая же никого перестает любить а чтобы не имея любви занять себя и развлечь предается страстям и грубым сладостям и доходит совсем до скотства в пороках своих а все от беспрерывной лжи и людям и себе самому. Однако...
34016. Общество как развивающаяся система 25 KB
  В западной социологии с основным классообразующим признаком, т.е. отношение к средствам производства, не согласна теория социальной стратификации. На этой основе она предлагает свои критерии...
34017. Основные модели общественного устройства 38.5 KB
  Современная форма либерализма как она утвердилась на Западе наиболее типичными здесь являются США теоретически оформилась и начала осуществляться на практике в Новое время и эпоху Просвещения. Основными посылками либерализма являются: 1. 'Lissez fire не мешайте действовать девиз классического либерализма. Идеал минимального государства характерная черта классического либерализма.
34018. Исторические формы общности людей 38.5 KB
  Историческими формами общности людей принято считать: род племя народность нацию. Это исторически восходящие формы объединения людей. Это связано с тем что в обществе где господствует коллективная собственность на средства производства и уравнительное распределение еще не дифференцировались интересы людей.
34019. Государство 32 KB
  Государство это одна из сложнейших и самых запутанных тем социальной и политической философии что связано в значительной степени с тем что она затрагивала и затрагивает интересы людей находящихся у кормила власти. Цицерон определяет государство как дело достойное народа подчеркивая при этом что народ не любое соединение людей собранных вместе каким бы то ни было образом а соединение многих людей связанных между собою согласием в вопросах права и общностью интересов . Макиавелли определяет государство как аппарат управляющий...
34020. Философия истории 26 KB
  Философия истории представляет особую сферу практической философии исследующей смысл и значение уникального явления человеческой жизни исторического бытия. Тем не менее несмотря на большое разнообразие теоретических подходов к феномену истории единой унифицированной философскоисторической концепции до сих пор не существует. Есть все основания полагать что именно в этом отсутствии единой теоретической версии философии истории есть и свои положительные черты. Термин философия истории введен в научный оборот сравнительно недавно...