2.5 Pasek postępu
W tej lekcji nauczymy się posługiwać paskiem postępu. Używamy go do przedstawienia postępu jakiejś czynności, np. podczas instalacji programów. Ale przejdźmy do rzeczy.
Zakładam, że mamy już gotowe okno w projekcie, dołączone odpowiednie pliki, windows.h i commctrl.h, oraz bibliotekę do obsługi kontrolek.
Aby móc używać tej kontrolki musimy dodatkowo zainicjować klasę pasków, robimy to przy pomocy struktury INITCOMMONCONTROLSEX i funkcji InitCommonControlsEx().
INITCOMMONCONTROLSEX cc;
cc.dwSize=sizeof(INITCOMMONCONTROLSEX);
cc.dwICC=ICC_BAR_CLASSES;
InitCommonControlsEx(&cc);
...
Gdybyśmy teraz spróbowali skompilować projekt, kompilator zgłosił by, że nie istnieje struktura INITCOMMONCONTROLSEX. Dzieje się tak dlatego, że jedna ze zmiennych w kompilatore Dev C++, a dokładniej określająca wersję Internet Explorer, jest nie ustawiona. A dla poprawnego działania tej struktury jest postawiony warunek, że wersja Internet Explorer nie może być mniejsza niż 3.0 Oczywiście ta wersja jest już dostępna w Widnows 95, dlatego możemy spokojnie założyć, że użytkowanik ma wersję większą bądź równą 3.0 Robimy to deklarując definicję tej zmiennej dyrektywą define, przed dołączonymi plikami nagłówkowymi! W przykładzie deklaruję, że wersja IE wynosi 6.0 :
#include <windows.h>
#include <commctrl.h>
hProgress=CreateWindowEx(
...
Mylę, że wszystko jasne i nic nie trzeba tłumaczyć. Jedynie mogę zaznaczyć, że w drugim parametrze podajemy PROGRESS_CLASS.
Tutaj jak zwykle jeżeli chcemy coś ustawiać w kontrolce, wysyłamy odpowiednie komunikaty. Teraz poznamy kilka z nich.
PBM_SETRANGE
Komunikat ten służy do ustawienia zasięgu paska postępu. Trzeci parametr jest ignorowany, zaś czwarty to właśnie zasięg. Tutaj posługujemy się makrem MAKELONG, do stworzenia liczby 32 bitowej, z dwóch 16 bitowych. Pierwsza liczba 16 bitowa, to początek zasięgu pasak, zaś druga to koniec.
PBM_SETPOS
Ten komunikat służy do ustawiania aktualnej pozycji postępu. Trzeci parametr to numer postępu we wcześniej ustalonym zakresie. Czwarty jest ignorowany.
PBM_SETSTEP
Tym komunikatem ustawiamy długość pojedynczego kroku postępu paska. Standardowo jest on ustawiony na 10. Wartość kroku podajemy w trzecim parametrze, czwarty ignorujemy.
PBM_STEPIT
Służy do wykonywania kroku, czyli dodaniu do aktualnego stanu paska długości kroku, który wczeniej ustaliliśmy. Oba dodatkowe parametry ignorujemy.
PBM_SETBARCOLOR
Tym komunikatem ustawiamy kolor paska postępu. Zmienna na kolor to COLORREF, a makro RGB służy do ustawienia koloru, podajemy w nim 3 kolejne składowe barwy koloru (więcej na ten temat w dziale GDI).
COLORREF clr=RGB(
SendMessage(hProgress,PBM_SETBARCOLOR,
...
PBM_SETBKCOLOR
Ten komunikat służy do ustawiania koloru tła w pasku, czyli pola pod paskiem.
COLORREF clr=RGB(
SendMessage(hProgress,PBM_SETBKCOLOR,
...
Oto przykład programu z paskiem postępu:
#include <windows.h>
#include <commctrl.h>
HWND hWnd,hProgress,hButton;
CHAR szClassName[]=
HINSTANCE* hInst;
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
INT WINAPI WinMain(HINSTANCE hInstance,HINSTANCE,LPSTR lStart,INT nShow)
{
hInst=&hInstance;
WNDCLASSEX wc;
wc.hInstance=*hInst;
wc.lpszClassName=szClassName;
wc.lpfnWndProc=WndProc;
wc.style=
wc.cbSize=sizeof(WNDCLASSEX);
wc.hIcon=LoadIcon(
wc.hIconSm=LoadIcon(
wc.hCursor=LoadCursor(
wc.lpszMenuName=
wc.cbClsExtra=
wc.cbWndExtra=
wc.hbrBackground=(HBRUSH)COLOR_BACKGROUND;
if(!RegisterClassEx(&wc)) return
hWnd=CreateWindowEx(
WS_OVERLAPPEDWINDOW,
ShowWindow(hWnd,nShow);
//inicjacja klasy pasków
INITCOMMONCONTROLSEX cc;
cc.dwSize=sizeof(INITCOMMONCONTROLSEX);
cc.dwICC=ICC_BAR_CLASSES;
InitCommonControlsEx(&cc);
MSG msgs;
while(GetMessage(&msgs,
{
TranslateMessage(&msgs);
DispatchMessage(&msgs);
}
return msgs.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wPar,LPARAM lPar)
{
COLORREF clr;
switch(msg)
{
case WM_CREATE:
hProgress=CreateWindowEx(
SendMessage(hProgress,PBM_SETRANGE,
SendMessage(hProgress,PBM_SETPOS,(WPARAM)
clr=RGB(33,99,256);
SendMessage(hProgress,PBM_SETBARCOLOR,
clr=RGB(255,200,100);
SendMessage(hProgress,PBM_SETBKCOLOR,
SendMessage(hProgress,PBM_SETSTEP,(WPARAM)
hButton=CreateWindowEx(
break;
case WM_COMMAND:
if(wPar==
break;
case WM_DESTROY:
DestroyWindow(hProgress);
DestroyWindow(hButton);
PostQuitMessage(
break;
default:
return DefWindowProc(hwnd,msg,wPar,lPar);
}
return
}