Чтобы решить эту задачу, достаточно вспомнить, что строка состояния - это самое обыкновенное окно, на котором можно создавать дочерние окна. В данном случае нам потребуется создать контрол типа progress bar, задав для него стиль WS_CHILD и строку состояния в качестве родительского окна. Когда индикатор прогресса создан, мы работаем с ним, а затем уничтожаем его.
Следующий фрагмент демонстрирует создание индикатора прогресса на строке состояния.
// Получаем указатель на главное окно. CMainFrame *pFrame = dynamic_cast<CMainFrame *>(AfxGetMainWnd()); // Находим объект строки состояния. CStatusBar &sb = pFrame->m_wndStatusBar; // Определяем прямоугольник, в котором будет размещаться индикатор прогресса. // В нашем примере он будет занимать всю первую панель строки состояния. CRect rect; sb.GetItemRect(0, rect); // Создаём индикатор прогресса. CProgressCtrl pc; pc.Create(WS_CHILD | WS_VISIBLE, rect, &sb, 0); pc.SetRange(0, 100); pc.SetPos(0); pc.SetStep(1); // Имитируем выполнение длительного процесса. for(int i=0; i<100; i++) { Sleep(30); pc.StepIt(); } // Уничтожаем индикатор прогресса. pc.DestroyWindow(); |
В этом фрагменте используется приведение типов с помощью dynamic_cast. Этот оператор в свою очередь использует механизм RTTI (информацию о типах на этапе выполнения). Поэтому необходимо включить поддержку RTTI, чтобы приведённый фрагмент мог работать в вашей программе. Поддержка RTTI включается, если задать компилятору ключ /GR. В настройках проекта (Project->Settings) ему соответствует настройка Enable Run-Time Type Information (RTTI) (вкладка C/C++, категория C++ Language). |