Ovládací prvek Progress Bar - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



C/C++

Ovládací prvek Progress Bar

winapi_logo

21. března 2003, 00.00 | V tomto článku si ukážeme práci s prvkem Progress Bar, kterému se česky říká indikátor průběhu.

Ovládací prvek Progress Bar

V tomto článku se podíváme na práci s ovládacím prvkem Progress Bar Control.

Ovládací prvek Progress Bar Control se běžně používá jako indikátor průběhu nějaké obvykle déletrvající akce. K běžnému uživatelskému folklóru sice patří vtipkování na téma "plynulosti" tohoto zobrazení při kopírování velkého množství souborů nebo různých instalacích. Zde však není na vině Progress Bar, ale obtížnost nebo praktické nemožnost správného algoritmu výpočtu aktuálního řekněme procenta prováděné akce.

K základním úkonům, které se musíme naučit s tímto prvkem provádět, patří následující akce a jim odpovídající zprávy Windows:

  • nastavení logického rozsahu - PBM_SETRANGE32
  • nastavení aktuální logické pozice - PBM_SETPOS
  • zjištění aktuální logické pozice - PBM_GETPOS

V ukázkovém projektu máme ukazatel průběh (Progress Bar). Na stisk tlačítka nastavíme logický rozsah na 20. Znamená to, že indikátor průběhu bude moci nabývat dvacet různých logických pozic. Spustíme časovač (Timer), na který budeme každou sekundu zvětšovat logickou pozici Progress Baru a při zjištění konce zastavíme časovač a pozici vrátíme na počátek (hodnota 0).

Spouštění průběhu budeme volat v obsluze příkazu tlačítka IDC_SPUSTIT (zpráva WM_COMMAND, jak čtenáři seriálu již určitě vědí):

void Spustit(HWND hWnd)
{
  // Nastavíme rozsah
  SendDlgItemMessage(hWnd, IDC_PROGRESSBAR, PBM_SETRANGE32, 0,20);
  // Nastavíme (pro pořádek:-)) pozici na počátek
  SendDlgItemMessage(hWnd, IDC_PROGRESSBAR, PBM_SETPOS, 0,0);
  SetTimer(hWnd, 1, 1000, NULL);
}

V obsluze zprávy WM_TIMER budeme pak volat následující funkci, která zvýší pozici o 1 logickou jednotku a bude hlídat dosažení konce (pozice 20):

void NaTimer(HWND hWnd)
{
  MessageBeep(0); // zvuková signalizace
  // Zjistíme aktuální log. pozici
  LRESULT Pozice = SendDlgItemMessage(hWnd, IDC_PROGRESSBAR, PBM_GETPOS, 0,0);
  if ( Pozice < 20 )
  {
    Pozice++;
    // Nastavíme novou pozici
    SendDlgItemMessage(hWnd, IDC_PROGRESSBAR, PBM_SETPOS, Pozice,0);
  }
  else
  {
    KillTimer(hWnd, 1);
    // Vrátíme se na začátek
    SendDlgItemMessage(hWnd, IDC_PROGRESSBAR, PBM_SETPOS, 0,0);
  }
}

Dále si ukážeme, jak lze "animovat" prvek Progress Bar ve Windows XP. Abychom mohli následující kód přeložit, musíme nastavit verzi cílové platformy na Windows XP a mít k dispozici dostatečně aktuální verzi Windows SDK. Pokud vám nepůjde z uvedeného důvodu přeložit doprovodný projekt, musíte kód který si nyní ukážeme zapoznámkovat nebo odstranit. Před vložením hlavičkových souborů nastavíme cílovou verzi Windows.

#define WINVER 0x0501
#define _WIN32_WINNT 0x0501

#include <windows.h>
// ....

Samozřejmě že tento kód můžete přeložit a sestavit na jakékoli platformě, ale vlastní spuštění musíte provést pouze ve Windows XP (nebo vyšších...).

Animaci budeme spouštět a zastavovat na změnu zaškrtnutí Check Boxu (IDC_ANIMOVAT), kterou zachytíme v proceduře dialogu, kterou si nyní ukažme celou i s dříve uvedenými obsluhami zpráv.

/////////////////////////////////////////////////////////////////////////////
// Procedura dialogu

INT_PTR CALLBACK DialogProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
  switch ( uMsg )
  {
    case WM_COMMAND:
      switch ( LOWORD(wParam) )
      {
        case IDOK:
          EndDialog(hWnd, IDOK);
          break;
        case IDCANCEL:
          EndDialog(hWnd, IDCANCEL);
          break;
        case IDC_SPUSTIT:
          Spustit(hWnd);
          break;
        case IDC_ANIMOVAT:
          if ( IsDlgButtonChecked(hWnd, IDC_ANIMOVAT) )
            SpustitAnimaci(hWnd);
          else
            ZastavitAnimaci(hWnd);
          break;
      }
      break;
      
    case WM_INITDIALOG:
      SendMessage(hWnd, WM_SETICON, ICON_SMALL | ICON_BIG,
        (LPARAM)LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_HLAVNI)));
      break;
    case WM_TIMER:
      NaTimer(hWnd);
      break;
  }
  return FALSE;
}

Funkce pro spuštění a zastavení animace vypadají takto:

/////////////////////////////////////////////////////////////////////////////
// Spustí animaci ve Widnows XP
void SpustitAnimaci(HWND hWnd)
{
  // Nejdříve musíme přidat styl PBS_MARQUEE
  SetWindowLongPtr(GetDlgItem(hWnd, IDC_PROGRESSBAR), GWL_STYLE,
  GetWindowLongPtr(GetDlgItem(hWnd, IDC_PROGRESSBAR), GWL_STYLE)|PBS_MARQUEE);
  SendDlgItemMessage(hWnd, IDC_PROGRESSBAR, PBM_SETMARQUEE, TRUE, 100);
}

/////////////////////////////////////////////////////////////////////////////
// Zastaví animaci

void ZastavitAnimaci(HWND hWnd)
{
  SendDlgItemMessage(hWnd, IDC_PROGRESSBAR, PBM_SETMARQUEE, FALSE, 0);
  DWORD dwStyl = (DWORD)
    GetWindowLongPtr(GetDlgItem(hWnd, IDC_PROGRESSBAR), GWL_STYLE);
  dwStyl &=~ PBS_MARQUEE;
  SetWindowLongPtr(GetDlgItem(hWnd, IDC_PROGRESSBAR), GWL_STYLE, dwStyl);
}

Jak vidíte v kódu, před spuštěním animace musíme oknu prvku Progress Bar přidat styl PBM_SETMARQUEE, který po zastavení animace opět odebereme - vše pomocí funkce SetWindowLongPtr.

Zde si můžete stáhnout ukázkový projekt včetně spustitelného sestavení release (pro Windows XP) winapi_progressbar.zip (33 kB);

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » C/C++  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: