Дополняем наш проект. В нашем проекте необходимо создать ресурс содержащий две строки. Перейти на вкладку ResourceView и выбираем меню Insert, появиться диалоговое окно, в нем нам нужно выбрать тип ресурса - String Table.
Далее нажать на кнопку NEW и у Вас появиться новый ресурс. Он называется String Table и используется для хранения текстовых строк.
В него нужно добавить две строки. В него нужно добавить две строки. Щелкаем в правом окне и выбираем пункт меню New String.
Вы должны создать две строки. Обратите внимание на то, что я специально сделал много символов подчеркивания. Это не просто так. На основе количества символов будет резервироваться место в стоке состояния.
Не забудьте сохранить. Посмотрите в ресурсах, теперь у нас есть идентификаторы строк.
// Used by step17.rc // #define IDS_STRING1 1 #define IDS_STRING2 2 #define IDR_MENU 101 #define IDR_MENU_RUS 102 ......
Нам нужен массив в котором будут находиться наши идентификаторы строк.
static UINT indicators[] =
{
IDS_STRING2, // идентификатор второй строки в ресурсах
IDS_STRING1 // идентификатор первой строки в ресурсах
};
Изменяем функцию OnCreate для того что бы установить индикаторы.
int CMainWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1;
m_wndStatusBar.Create(this); // создать строку состояния
m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT)); // установить в строку идентификаторы
m_wndMenu.LoadMenu(IDR_MENU); // Загрузить меню из файла ресурса
SetMenu(&m_wndMenu); // Установить меню
return 0;
}
Уже сейчас запустив программу у Вас есть возможность посмотреть на них.
В таблицу откликов реакцию на движение мыши.
BEGIN_MESSAGE_MAP(CMainWnd, CFrameWnd) // таблица откликов на сообщения
........
ON_WM_CREATE() // событие создания окна
ON_WM_MOUSEMOVE() // мышь двигается
ON_WM_PAINT() // Это реакция. Если нету этой строчки ,
............
END_MESSAGE_MAP()
И описание соответствующей функции в классе рамки окна.
class CMainWnd : public CFrameWnd
{
public:
...........
void OnOpen(); // эта функция вызовется при выборе меню Open
afx_msg void OnMouseMove( UINT, CPoint cp); // эта функция будет вызываться при движении мыши
afx_msg void OnLButtonDblClk( UINT, CPoint ); // виртуальная процедура ответа на левую кнопку
...........
};
Реализация нужна, таковы правила.
void CMainWnd::OnMouseMove( UINT, CPoint cp)
{
char chX[10]; // буфер для координат
char chY[10]; // буфер для координат
itoa(cp.x,chX,10); // число переводим в строку
itoa(cp.y,chY,10); // число переводим в строку
CString csStatusX(chX); // Формируем строку
CString csStatusY(chY); // Формируем строку
m_wndStatusBar.SetPaneText(0,csStatusX); // выводим первую панель
m_wndStatusBar.SetPaneText(1,csStatusY); // выводим вторую панель
}
Собрав и запустив проект Вы должны увидеть что при перемещении курсора его координаты показываться в строке состояния.
Для отображения в панели состояния необходимо создать массив идентификаторов. Это необходимо для начал работы панели, а массив служит как шаблон. При запуске будет выведено именно то, что есть в строках, которые в ресурсах.
Функция SetIndicators говорит панели состояния что у нее будут наши панельки. В параметры, массив идентификаторов и количество элементов.
BOOL SetIndicators( const UINT* lpIDArray, int nIDCount );
// lpIDArray указатель на массив
// nIDCount количество элементов в массиве
Мы с Вами вычисляем этот размер из массива. Это сделано для того, что бы в последствии добавляя новые панели, не приходилось заглядывать и сюда.
sizeof(indicators)/sizeof(UINT); // размер массива/размер одного элемента
В принципе если на этом остановиться то надписи выведутся. Но нам интересно, если будет показываться положение курсора. Ну, мне интересно, по крайней мере. А для этого необходимо отслеживать движение мыши. ON_WM_MOUSEMOVE() это делает, и функцию нужную вызывает OnMouseMove. Этой функции передается положение мыши в виде CPoint. Дальше мы обрабатываем. itoa перевод числа в строку , собирается обьект CString и SetPaneText с параметрами куда и что выводится в строку состояния.
BOOL SetPaneText( int nIndex, LPCTSTR lpszNewText, BOOL bUpdate = TRUE );
//nIndex номер панели для вывода
//lpszNewText текст для вывода
//bUpdate обновлять
Запускайте, водите мышкой, наслаждайтесь.
Создать массив идентификаторов.
static UINT indicators[] =
{
IDS_STRING2, // идентификатор второй строки в ресурсах
IDS_STRING1 // идентификатор первой строки в ресурсах
};
Связать массив с классом строки состояния.
m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT)); // установить в строку идентификаторы
Вывод в строку состояния.
m_wndStatusBar.SetPaneText(0,csStatusX); // выводим первую панель