[Grafika] [WebTip] [Fotografování] [Galerie] [MujMac] [Printing]
  Redakce: info (at) builder.cz   Inzerce: reklama (at) grafika.cz
Diskuzní fóra
.Net (68471)
ASP (1591)
ActiveX (168)
Allegro (136)
Assembler (3926)
C++ Builder (23160)
C/C++ (44499)
Databáze (30680)
Delphi (78808)
DelphiX (1655)
DirectX (1464)
Java (39508)
JavaScript (12598)
Matematické programy (2178)
OOP a UML (732)
OpenGL (6920)
Php (65224)
PowerBuilder (464)
Problémy a algoritmy (10473)
Programování v Linuxu (2000)
Právo a programování (3384)
Python (1353)
Ruby (136)
Visual Basic (12078)
Visual C++ (12956)
Wap (56)
Web (10895)
Web servery (5549)
Win32 (13553)
Windows CE (865)
XML/XSL (1860)
Textová inzerce
Služby Builder.cz
  • Bazar - koupím(0)
  • Bazar - prodám(0)
  • Hledám práci(0)
  • Nabízíme práci(0)
  • Projekty(0)
  • Ovládací prvek Progress Bar
    V tomto článku si ukážeme práci s prvkem Progress Bar, kterému se česky říká indikátor průběhu.
    Učíme se WinAPI
    Předchozí díl: Ovládací prvek TrackBar

    Autor: Radek Chalupa
    Rubrika: C/C++
    Publikováno: 21.03. 2003
     Tisk článku
    Poslat odkaz emailem
     

    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);


    Zpět na začátek stránky

    Radek Chalupa
    Autor pracuje jako samostatný vývojář
    a konzultant v oblasti programování.
    www.radekchalupa.cz

    Hodnocení článku
    1 | 2 | 3 | 4 | 5
    Aktuální známka: 2.68
    (Počet známek: 9271)

    Komentáře k článku
    zufan04.05.21:53pouziti progress bar
    Jifik30.07.4:08Problem s ikonkou
    Jifik01.08.15:50RE: Problem s ikonkou
    mandyboy04.05.17:31Api COM
    sklebak15.01.21:02Progress v C++ Builderu
    sklebak15.01.21:04RE: Progress v C++ Builderu
    Radek Chalupa15.01.21:08RE: RE: Progress v C++ Builderu
    .::]|DEAD|[::.Screamer05.07.15:36RE: RE: RE: Progress v C++ Builderu
    Aleš09.01.9:04poděkování
    Vláďa28.08.19:57Progress bar v normálním okně
    vrmk05.09.18:29RE: Progress bar v normálním okně
         





    info@builder.cz
    Vydává Grafika Publishing, s.r.o.
    Copyright (c) 1997-2002 Všechna práva vyhrazena