Kurz1 - Kapitola9

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

3.3 Velikosti okna

Text zobrazený v okně aplikace je zatím omezen na 15 řádků a počátek jeho umístění jsme stanovili odhadem. Můžeme se tedy pustit do úprav těchto hodnot.
Pro stanovení velikosti okna je velmi vhodná zpráva WM_SIZE, která je volána vždy, když se změní velikost okna. Její význam je nesporný u Windows 95 a vyšších, kde může často docházet k přesouvání či změně velikosti programového okna. U kapesních počítačů je obrazovka natolik malá, že se nepočítá s umístěním více oken aplikací současně na plochu. Přesto zpráva WM_SIZE i ve Windows CE funguje.
WM_SIZE fwSizeType = wParam; nWidth = LOWORD(lParam); nHeight = HIWORD(lParam);
I když tato zpráva přináší ve svém parametru lParam velikost okna, pro náš účel bude vhodné uložit si celé souřadnice klientské části okna do proměnné typu obdélník rctKlient. Podobně jako u programu Nazdar v minulé kapitole si stejným způsobem zjistíme souřadnice okna. Do procedury okna WndProc vložíme zpracování zprávy WM_SIZE:
   GetClientRect(hWnd, &rctKlient);
rctKlient.top += (CommandBar_Height(hwndCB));
Protože jsme aplikaci založili jako WCE (pro Windows CE 2.11), je nabídkový pruh, který je součástí klientské oblasti, na horní straně okna (u Pocket PC aplikace je dole). Na druhém řádku je proto horní souřadnice okna upravena o šířku nabídkového pruhu získanou funkcí CommandBar_Height (u Pocket PC aplikace je nutno odečíst od spodní souřadnice).
Při programování pro Windows CE počítače je dobré mít na paměti, že variabilita přístrojů a možnosti použití tohoto systému jsou široké. V následující tabulce jsou pro příklad uvedeny některé hodnoty souřadnic oken, které je možné získat na různých přístrojích.
PřístrojPalmPCHPC ProPocketPCPocketPC
Program vytvořen jako aplikaceWCEWCEWCEPocketPC
Klient.horní0000
Klient.dolní294454294294
Menu.horní0026294
Menu.dolní242450320
Velikost okna vertikálně294454294294
Velikost okna horizontálně240640240240
Výška menu242424294
Pozn.: Souřadnice klientské oblasti (Klient) získány funkcí GetClientRect(hWnd,...)
Souřadnice Nabídkového pruhu (Menu) získány funkcí GetWindowRect(hwndCB,...)
Velikost okna získána z parametru lParam zprávy WM_SIZE
Výška menu - nabídkového pruhu - získána z CommandBar_Height(hwndCB)
Z tabulky je vidět, že univerzálně připravený program musí počítat s různými souřadnicemi oken, se kterými pracuje. Také lze v tabulce nahlédnout, že funkce CommandBar_Height v aplikaci pro Pocket PC nepracuje zcela korektně. Pokud by jste ji chtěli využívat, je možné si vytvořit vlastní funkci např. takto:
int MyCommandBar_Height(HWND hCB)
{
RECT rt;
GetWindowRect(hCB, &rt);
return (rt.bottom - rt.top);
}
Máme připravené rozměry klientské části okna, můžeme tedy opravit odhadnutý počet řádků vypisovaných na obrazovce na reálnou hodnotu. V minulém díle jsme si do proměnné nVyskaRadku uložili výšku fontu, který používáme. Snadno spočítáme:
   nLinek = ((rctKlient.bottom - rctKlient.top) / nVyskaRadku) + 1;                                
Počet řádků je zvýšen o 1, protože při celočíselném dělení může být část řádku "ukryta" ve zbytku dělení. Při vypisování na obrazovku Windows za nás přesahující část automaticky oříznou.
Jelikož jsme horní hranu klientské oblasti spočítali přesně, můžeme zrušit náš původní odhad ve zprávě WM_CREATE. Zrušte v ní řádek
   rctKlient.top = 28;
Výsledek zpracování zprávy WM_SIZE vypadá takto:
   case WM_SIZE:
GetClientRect(hWnd, &rctKlient);
rctKlient.top += (CommandBar_Height(hwndCB));
nLinek = ((rctKlient.bottom - rctKlient.top) / nVyskaRadku) + 1;
break;
Program můžeme přeložit a spustit. Na obrazovce by mělo být něco podobného jako na tomto obrázku:

obr. 18 "HexaView" po úpravě rozměrů

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

  • Různé verze systému na různých počítačích mají odlišné velikosti a umístění oken.
  • Pokud funkce nepracuje přesně podle našich předpokladů, můžeme si napsat vlastní. :-)
 

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.