Visual C++. ToolBar, Menu и отображение текста в StatusBar:
Приготовся. Статья будет достаточно большая. А что делать... На Delphi прогу можно написать в 10 раз быстрее, а описать ещё в двадцать раз быстрее. Так что придётся нагонять и писать побольше. Если у тебя уж слишком большое желание писать на С++, то придётся напрячся.
Сегодня нам предстоит познакомится с тремя самыми распространёнными элементами управления, которые присутствуют практически во всех прогах. Материал достаточно тяжёлый, но я как всегда постарался дать его попроще. Сегодня мы рассмотрим не все возможности, а только самые основы работы с элементами управления. Всё рассказать нереально.
Рис 1. Мастер создания MFC проекта
Приступаем к телу. Начнём мы с создания нового проекта. Нажми File->New. В появившемся окне выбери MFC AppWizard (уже ставший стандартом для наших примеров). Введи имя проекта - ToolBarMenu и укажи место его расположения. Теперь нажми кнопку ОК. Перед тобой появится уже знакомый мастер создания MFC проектов (рис 1).
В этом окне выбери опцию "Single Document" и убери галочку с "Document/View architecture support" (это нам не понадобится). Всё, можно жать на Finish, потому что остальные настройки нас устроят и по умолчанию.
Сразу создадим новую кнопку на панели инструментов. Для этого в окне Workspace (находится вдоль всего окна слева) выдели закладку "Resource". Перед тобой появится дерево ресурсов. Выбери пункт "ToolBarMenu resource", откроется дерево ресурсов. Выбери здесь пункт Toolbar, откроется ветка с ресурсами панели инструментов. Дважды щёлкни по пункту IDR_MAINFRAME. Откроется окно редактирования кнопок панели (рис 2).
Рис 2. Редактор кнопок
Сверху окна находится панель с кнопками. Под ней расположен простенький графический редактор, с помощью которого ты можешь рисовать кнопки. Выбирая кнопку, она сразу появляется в редакторе.
Заметь, что самая правая кнопка без рисунка. Щёлкни по ней и под панелью появится пустой рисунок. Нарисуй что-нибудь. Для примера не особо важно содержимое кнопки.
Теперь не снимая выделения с кнопки выбери меню View->Properties. Измени поле ID на более понятное ID_MYBUTTON (рисунок 3).
Рис 3. Свойства кнопки
Теперь в окне Workspace (находится вдоль всего окна слева) выбери закладку ClassView. Щёлкни правой кнопкой по пункту CToolBarMenuApp и выбери в появившемся меню "Add Member Variable". Этим мы создадим переменную. В поле "Variable Type" (тип переменной) укажем bool. В поле "Variable Name" (имя переменной) укажем Pressed. Всё. Тип доступа (access) пускай останется public, чтобы мы могли видть эту переменную из других объектов.
Всё. Приготовления закончены. Теперь создадим обработчик события - на нажатие созданной нами кнопки. Для этого нажми Ctrl+W, чтобы попасть в ClassWizard.
Рис 4. ClassWizard. Создание обработчика для кнопки
Для создания обработчика выдели в окне всё так, как показано на рисунке 4.
Поле "Project" должно содержать пункт "ToolBarMenu" - текущий проект
Поле "Class name" должно содержать "CToolBarMenuApp" - Главный класс
Поле "Object ID's" должно содержать "ID_MYBUTTON" - наша кнопка
Поле "Messages" должно содержать "COMMAND" - сообщение по нажатию кнопки
Теперь нажми кнопку "Add function", чтобы создать обработчик, а затем "Edit Code", чтобы написать код-обработчик. Здесь напиши следующее:
void CToolBarMenuApp::OnMybutton()
{
// TODO: Add your command handler code here
AfxMessageBox( "Лучше бы нажал себе на пупок" );
Pressed=Pressed ? FALSE :TRUE;
}
Первая строка выводит сообщение. Мы уже не раз это делали, поэтому я не буду много ботать. Вторая строка изменяет созданную нами булеву переменную Pressed. Если она равна true, она превратится в false, и наоборот. Эту переменную мы будем использовать при выводе в строку состояния.
С панелькой разобрались. Теперь пора приступить к строке состояния. Мастер нам уже содал строку. Теперь давай изменим её, добавив новый пункт.
Для этого в окне Workspace перейди на закладку Resource. Открой пукт дерева "String Table" и дважды щёлкни по появившемуся подпункту "String Table". Появится окно редактирования строк (рис 5).
Рис 5. Редактор строк
Найди строки начинающиеся с "ID_INDICATOR_". Выдели любую (желательно последнюю) и щёлкни правой кнопкой. Выбери в появившемся меню пункт "New String". В поле ID введи ID_INDICATOR_MY, а в поле Caption введи текст "Hello from VR-online" (от длины введённого сюда текста зависит длнна поля строки состояния по умолчанию). Закрывай окно.
Теперь нужно задействовать наше поле строки состояния. Перейди на закладку File View. открой дерево "Source Files". Здесь дважды щёлкни по файлу MainFrm.cpp, откроется его текст.
Найди строку indicators[]. Добавь сюда наш индикатор:
static UINT indicators[] =
{
ID_INDICATOR_MY, //Наш индикатор в строке состояния
ID_SEPARATOR, // status line indicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
Я ввёл наш индикатор первым. Ты можешь поставить его любым по счёту. Теперь нужно научить наше поле (индикатор) в строке состояния отображать текст. Для этого найди чуть выше карту сообщений BEGIN_MESSAGE_MAP. Добавь сюда строку ON_UPDATE_COMMAND_UI(ID_INDICATOR_MY, OnUpdateInd). Её нужно добавлять перед самым концом карты сообщений END_MESSAGE_MAP():
Теперь нам осталось только реализоватьобъявленную здесь процедуру OnUpdateInd, которая будет вызываться, при необходимости обновить содержимое строки состояния.
для этого на закладке File View открой ветку Header Files. Здесь дважды щёлкни по файлу MainFrm.h, для редактирования заголовочного файла. Здесь опять, перед самым объявлением карты сообщений (строка DECLARE_MESSAGE_MAP()) нужно добавить объявление функции OnUpdateInd.
protected:
//{{AFX_MSG(CMainFrame)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnSetFocus(CWnd *pOldWnd);
//}}AFX_MSG
afx_msg void OnUpdateInd(CCmdUI *pCmdUI); //Наша функция
DECLARE_MESSAGE_MAP()
Теперь возвращаемся в файл MainFrm.cpp и добавляем саму функцию и её реализацию в конец файла:
void CMainFrame::OnUpdateInd(CCmdUI *pCmdUI)
{
CToolBarMenuApp *pApp = (CToolBarMenuApp*)(AfxGetApp());
ASSERT_VALID(pApp);
if (pApp->Pressed)
pCmdUI->SetText("You has press on button");
else
pCmdUI->SetText("Hello from VR-online");
}
Сейчас можешь запустить прогу и посмотреть результат. Ну а мне осталось показать тебе, как добавить менюшку.
Рис 6. Редактор меню
Перейди на закладку Resource. Щёлкни дважды по пункту IDR_MAINFRAME. Перед тобой откроется редактор меню (рис 6). Выбери в редакторе пункт File, а затем Exit. Теперь нажми кнопку Insert. Перед пунктом Exit появится пустой пункт. Если он не выделился, то выдели его внаглую. Теперь щёлкни по нему правой кнопкой и выбери в появившемся меню пункт Properties.
Здесь в поле Caption введи "Press me", а в поле ID должно появиться ID_FILE_PRESSME. Если не так, то поправь. Можешь ещё написать что-нибудь в поле "Prompt". Это поле отвечает за подсказку, появляющуюся в нормальном поле строки состояния (это не то поле, которое создали мы).
Теперь создадим обработчик события для менюшки. Для этого вызви Class Wizard (Ctrl+W). Здесь выдели всё, как на рис 7.
Рис 7. ClassWizard. Создание обработчика для меню
Поле "Project" должно содержать пункт "ToolBarMenu" - текущий проект
Поле "Class name" должно содержать "CToolBarMenuApp" - Главный класс
Поле "Object ID's" должно содержать "ID_FILEPRESSME" - наша менюшка
Поле "Messages" должно содержать "COMMAND" - сообщение по нажатию кнопки
Теперь нажми Add Function и затем Edit Code. Здесь напишем просто
void CToolBarMenuApp::OnFilePressme()
{
// TODO: Add your command handler code here
Pressed=Pressed ? FALSE :TRUE;
}
Здесь мы просто меняем состояние переменной Pressed. Это значит, что после запуска проги, и нажатия менюшки будет менятся состояние надписи в строке состояния.
Вот и всё. Мы познакомились с простенькими возможностями менюшек, кнопок и строки состояния.