15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Как показать ProgressBar на StatusBar'е ?

Предположим, что вы хотите показать CProgressCtrl на весь StatusBar. Для этого необходимо проделать следующее: - Выберите пункт меню View - Resource Symbols. Нажмите кнопку New и добавьте новое имя, в нашем примере это будет ID_PROGRBAR. - В файле MainFrm.cpp найдите объявление массива indicators (он находиться сразу после END_MESSAGE_MAP) и отредактируйте его к следующиему виду

static UINT indicators[] =
             {
                 ID_PROGRBAR
              };

- В файле _MainFrm.h создайте protected переменную m_bCreated типа BOOL и public переменную m_progress типа CProgressCtl. - В файле MainFrm.cpp отредактируйте конец функции int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) таким образом:

к участку кода:

if (!m_wndStatusBar.Create(this ) ||
                       !m_wndStatusBar.SetIndicators(indicators,
                       sizeof(indicators)/sizeof (UINT)))
                   {
                       TRACE0("Failed to create status bar\n" );
                       return -1; // fail to create
                   }

добавьте следующую строку:

            else {
              m_wndStatusBar.SetPaneInfo(0,ID_PROGRBAR,SBPS_STRETCH,10);
               }

Кроме того, добавьте инициализацию нашей переменной m_bCreated

                     .........
                     m_bCreated=FALSE;
                     ..........

- Теперь мы можем использовать ProgressBar в строке статуса, естественно не забыв создать этот объект. Предположим, у нас есть функция CMainFrame::OnWork(). Она будет выглядеть примерно так:

void CMainFrame::OnWork()
         {
           RECT rc;
             m_wndStatusBar.GetItemRect(0,&rc);
            if (m_bCreated==FALSE)
            {
              // создаем  m_progress
              m_progress.Create(WS_VISIBLE|WS_CHILD, rc,&m_wndStatusBar, 1);
// Устанавливаем размер от 0 до 100
              m_progress.SetRange(0,100);
              m_progress.SetStep(1);
              m_bCreated=TRUE;
             }
             for (int I = 0; I < 100; I++)
             {
               Sleep(20);
               m_progress.StepIt();
             }
         }

-Если откомпилировать проект на этой фазе, то все будет работать, но при изменении размера окна линейка ProgressBar'а размеры менять не будет, поэтому необходимо перекрыть событие OnSize:

void CMainFrame::OnSize(UINT nType, int cx, int cy)
            {
                CFrameWnd::OnSize(nType, cx, cy);
                 if (m_bCreated)
                  {
                      RECT rc;
                      m_wndStatusBar.GetItemRect(0,&rc);
                      m_progress.SetWindowPos(&wndTop, rc.left, rc.top,
                      rc.right - rc.left,rc.bottom - rc.top, 0);
                    }
              }

- Вот теперь все /-))))) Откомпилируйте проект и убедитесь, что все работает.