Шаг 17 - Вывод данных в панель состояния

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

Дополняем наш проект. В нашем проекте необходимо создать ресурс содержащий две строки. Перейти на вкладку ResourceView и выбираем меню Insert, появиться диалоговое окно, в нем нам нужно выбрать тип ресурса - String Table.

17_1.gif (3667 b)

Далее нажать на кнопку NEW и у Вас появиться новый ресурс. Он называется String Table и используется для хранения текстовых строк.

17_2.gif (2186 b)

В него нужно добавить две строки. В него нужно добавить две строки. Щелкаем в правом окне и выбираем пункт меню New String.

17_3.gif (1884 b)

Вы должны создать две строки. Обратите внимание на то, что я специально сделал много символов подчеркивания. Это не просто так. На основе количества символов будет резервироваться место в стоке состояния.

17_4.gif (1674 b)

Не забудьте сохранить. Посмотрите в ресурсах, теперь у нас есть идентификаторы строк.

// 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;
}

Уже сейчас запустив программу у Вас есть возможность посмотреть на них.

17_5.gif (2631 b)

В таблицу откликов реакцию на движение мыши.

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); // выводим вторую панель
}

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

17_6.gif (5802 b)

Описание

Для отображения в панели состояния необходимо создать массив идентификаторов. Это необходимо для начал работы панели, а массив служит как шаблон. При запуске будет выведено именно то, что есть в строках, которые в ресурсах.

Функция 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);		// выводим  первую панель

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