Kurz2 - Kapitola10

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

4.11 Uložení nastavení programu

Posledním úkolem, který před námi při psaní tohoto programu leží, je zajistit, aby uživatelské nastavení zůstalo zachováno i při jeho příštím spuštění. Musíme zabezpečit uložení volby barvy pozadí a logické proměnné zvuku.
V dřívějších dobách starého dobrého DOSu se takovéto předvolby programu jednoduše uložily ve vhodném formátu do souboru. Windows 95 a následující verze (tedy i Windows CE) přišly s novou koncepcí. Aby se zabránilo plýtvání místem a rozšiřování dalších souborů s několika bajty, jsou do systémů implementovány registry.
Na registr lze pohlížet jako na databázi, která stromovou strukturou ukládá informace o nastavení počítače, nainstalovaných programů a předvoleb jednotlivých uživatelů. Windows CE podporují tři klíčové skupiny v registru:
  • HKEY_LOCAL_MACHINE - uchovává nastavení hardware a software pro tento počítač
  • HKEY_CURRENT_USER - udržuje uživatelsky specifikovaná nastavení
  • HKEY_CLASSES_ROOT - nastavení typů souborů a konfiguraci dat OLE.
V našem případě (protože nemáme uživatelsky specifické nastavení) budeme veškeré činnosti provádět v rámci klíče HKEY_LOCAL_MACHINE - nastavení pro daný počítač. Uložení provedeme obvyklým způsobem. V klíči HKEY_LOCAL_MACHINE si ve složce SOFTWARE vytvoříme složku se "jménem společnosti" (v tomto případě Kurz_eVT) a v ní složku odpovídající jménu programu (Fifteen). V takto vytvořené struktuře si pak vložíme požadované proměnné. Získání nastavení při startu programu je otázkou přečtení těchto dat z registru.
Na konec souboru Fifteen.cpp vložte tyto funkce a doplňte na úvod jejich prototypy:
 void CtiNastaveni()
{
HKEY hKey;
DWORD dwDisposition;
DWORD dwType,dwSize;

// Nastaveni standardnich hodnot
dwZvuk=1;
dwBarva=(DWORD)(RGB(128,128,128));
// Cteni hodnot z klice
if (RegCreateKeyEx(HKEY_LOCAL_MACHINE,TEXT("Software\KurzEVT\Fifteen"),0,NULL,0,0,NULL,
&hKey,&dwDisposition)==ERROR_SUCCESS) {
dwType=REG_DWORD;
dwSize=sizeof(DWORD);
RegQueryValueEx(hKey,TEXT("Color"),0,&dwType,(PBYTE)&dwBarva,&dwSize);
RegQueryValueEx(hKey,TEXT("Sound"),0,&dwType,(PBYTE)&dwZvuk,&dwSize);
RegCloseKey(hKey);
}
}

void UlozNastaveni()
{
HKEY hKey;
DWORD dwDisposition;
DWORD dwType,dwSize;

// Zapis hodnot do klice
if (RegCreateKeyEx(HKEY_LOCAL_MACHINE,TEXT("Software\KurzEVT\Fifteen"),0,NULL,0,0,NULL,
&hKey,&dwDisposition)==ERROR_SUCCESS) {
dwType=REG_DWORD;
dwSize=sizeof(DWORD);
RegSetValueEx(hKey,TEXT("Color"),0,dwType,(PBYTE)&dwBarva,dwSize);
RegSetValueEx(hKey,TEXT("Sound"),0,dwType,(PBYTE)&dwZvuk,dwSize);
RegCloseKey(hKey);
}
}
Při práci s registrovou databází jsou použity pouze 4 API funkce:
RegCreateKeyEx - Vytvoří specifikovaný klíč, pokud již existuje, otevře jej,
RegQueryValueEx - Přečte z otevřeného klíče hodnotu požadovaných dat,
RegSetValueEx - Zapíše do otevřeného klíče určená data a označí je zadaným jménem,
RegCloseKey - Uvolní specifikovaný klíč.
Práce s registry je na první pohled podobná práci se soubory. V uvedených funkcích jsem (pro jednoduchost) vynechal předávání parametrů a přímo jsou použity obě globální proměnné programu. Ve funkci CtiNastaveni se nejprve naplní proměnné přednastavenými hodnotami - to pro případ, že by čtení nebylo úspěšné. Dále se použijí zmíněné API funkce s tím, že je třeba nastavit požadované parametry. UlozNastaveni je pak pouze inverzní funkce pro zápis.
Funkce máme připravené, použijme je v programu:
1. Na úvod WinMain přečteme nastavení (abychom měli hodnotu pro štětec pozadí, který vytváříme):
    // Vytvoreni stetce pro pozadi
CtiNastaveni();
hPozadi=CreateSolidBrush(dwBarva);
2. Při změně nastavení ve zprávě WM_COMMAND doplníme jejich uložení, takže se tato část změní na:
    case ID_BACKGROUNDCOLOR:
if (DialogBox(hInst, (LPCTSTR)IDD_DIALOG_BG, hWnd, (DLGPROC)Pozadi)) {
dwBarva=RGB(byPozadi,byPozadi,byPozadi);
DeleteObject(hPozadi);
hPozadi=CreateSolidBrush(dwBarva);
UlozNastaveni();
InvalidateRect(hWnd,NULL,TRUE);
}
break;
case ID_SOUND:
hMenu=CommandBar_GetMenu(hwndCB,0);
if(dwZvuk) {
dwZvuk=0;
CheckMenuItem(hMenu,ID_SOUND,MF_UNCHECKED);
}
else {
dwZvuk=1;
CheckMenuItem(hMenu,ID_SOUND,MF_CHECKED);
}
UlozNastaveni();
break;
3. Protože nyní při startu programu může být položka menu se zatržením (nebo bez něj), doplníme ještě na konec zprávy WM_CREATE 3 řádky a zatržení nastavíme podle proměnné dwSound:
    // Oznaceni zvuku v menu
hMenu=CommandBar_GetMenu(hwndCB,0);
if (dwZvuk) CheckMenuItem(hMenu,ID_SOUND,MF_BYCOMMAND|MFS_CHECKED);
Ufff, a program by měl být hotov...
... moment! Zbývají poslední kosmetické úpravy, které již jistě zvládnete sami. Podle vlastních grafických chutí se můžete vyřádit na ikoně a dialogu About. Přeci je nutné si zajistit copyright na své dílo :-)

obr. 50 Hotový program

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

  • Menší objem dat (především nastavení) je možné uložit v registru Windows CE.
  • S registry se pracuje podobně jako se soubory.
  • "Otevření" a "zavření" zajistí RegCreateKeyEx a RegCloseKey.
  • Pro čtení a uložení hodnoty je pak možné použít RegQueryValueEx a RegSetValueEx.
 

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.