Kurz2 - Kapitola5

17. června 2007 v 16:00 | http://www.sweb.cz/kurz_evt/ |  Programování pro WinCE

4.5 Použití časovače

Připravená funkce MalujKostku už umožňuje "rozhýbat" náš program. Abychom mohli nechat vykreslovat jednotlivá "políčka filmu", je potřeba zajistit pravidelnost v zobrazování. Windows nám nabízejí prvek, který se jmenuje časovač. Pokud jej správně inicializujeme, časovač zařídí, že náš program dostane pravidelně (podle nastavené periody) zprávu WM_TIMER.
Do zprávy WM_CREATE doplníme příkaz pro vytvoření časovače:
   // Inicializace casovace
SetTimer(hWnd,1,50,NULL);
Kromě parametru hWnd (handle našeho okna) jsou důležité druhé 2 parametry:
  • druhý parametr udává pořadové číslo volaného časovače,
  • třetí určuje periodu v milisec., s níž se budou zprávy do programu doručovat.
Současně by bylo slušné zrušit časovač ve zprávě WM_DESTROY:
   // Zruseni casovace
KillTimer(hWnd,1);
Abychom při zpracování zprávy WM_TIMER věděli, kde se právě nacházíme, vložte do lokálních proměnných funkce WndProc několik pomocných proměnných. Protože jejich platnost je pro několik zpráv WM_TIMER, mělo by se jednat o statické proměnné:
   // Priznak probiha-li presun kostky
static BOOL bAkce=FALSE;
// Kolikaty krok presunu se provadi
static int nStep;
// Ktera kostka se presouva
static int nPosun;
// Priznaky posunu ve smeru X a Y (nabyvaji hodnot -1,0,1)
static int nXSmer, nYSmer;
Vše potřebné je připraveno, můžeme doplnit zpracování zprávy WM_TIMER:
case WM_TIMER:
POINT akPoz;
if (bAkce) {
// Probiha posun - budu zobrazovat
hdc=GetDC(hWnd);
// Inkrementuju krok a vykreslim kostku na novou pozici
nStep++;
akPoz.x=nStep*nXSmer*(cxBitmap/KROKY) + ptUmisteni[nPosun].x;
akPoz.y=nStep*nYSmer*(cyBitmap/KROKY) + ptUmisteni[nPosun].y;
MalujKostku(hdc,nCislo[nPosun],akPoz,nXSmer,nYSmer);
ReleaseDC(hWnd,hdc);
// Test, zda posun kostky neskoncil
if (nStep==8) {
// Ukoncim posouvani...
nStep=0;bAkce=FALSE;
// ... a prehodim kostky v poli nCislo[]
nCislo[nPosun+4*nYSmer+nXSmer]=nCislo[nPosun];
nCislo[nPosun]=0;
}
}
break;
Abychom vyzkoušeli, zda uvedený kód pracuje správně, doplňte na zkoušku na konec zpracování zprávy WM_PAINT nastavení proměnných pro řízení přesunu kostky. Po přeložení a startu pozorujte, co se stane na displeji (po testu opět smažte).
   nPosun=14;
nXSmer=1;
nYSmer=0;
bAkce=TRUE;
Pokud je vše v pořádku, mělo by dojít k posunu poslední kostky.
Poznámka: Zprávy WM_TIMER nejsou programu předávány, jestliže předchozí zpráva WM_TIMER nebyla ještě zpracována. Nelze tedy počítat s tím, že časová základna je naprosto pravidelná. Bude-li program zaneprázdněn delší dobu zpracováním nějaké jiné zprávy, dojde pravděpodobně ke ztrátě několika zpráv WM_TIMER.

Co bychom si měli z této lekce zapamatovat?

  • Časovou základnu programu vytvoříme pomocí časovače.
  • Ovládání časovače umožňují funkce SetTimer a KillTimer.
  • Časovač posílá pravidelně zprávy WM_TIMER.
 

Buď první, kdo ohodnotí tento článek.

Nový komentář

Přihlásit se
  Ještě nemáte vlastní web? Můžete si jej zdarma založit na Blog.cz.