dev2/dev12
HexaView
Otevření souboru
Do tohoto okamžiku jsme si v programu prohlíželi pouze provizorní data vytvořená
v bufferu, což by asi nebylo moc užitečné... :-)
Nastal tedy čas, abychom se podívali na obsah skutečného souboru. Využijeme doposud
vytvořený program na to, aby se nám s co nejmenším počtem úprav na displeji objevila
data obsažená ve vybraném souboru.
Prvním krokem bude doplnění volby souboru. Nový soubor se bude otvírat pomocí volby
Open z vybrané v nabídce (menu). Do menu programu vložte novou položku pod File - Open.
Její ID by mělo být ID_FILE_OPEN. Volba File teď obsahuje dvě položky - Open a Exit.
Protože využijeme na získání jména souboru standardní dialog Windows, přidáme na úvod
programu hlavičkový soubor:
#include <commdlg.h>
Tento hlavičkový soubor umožňuje práci s běžnými dialogy, které se vyskytují ve Windows.
Dále přidejte globální proměnné...
#define FILE_NAME_DIM 256
TCHAR szFileName[FILE_NAME_DIM]; // Jmeno otevreneho souboru
HANDLE hFile; // Handle na tento soubor
...a také něco lokálních proměnných:
// Pro soubor
OPENFILENAME of;
DWORD dwBuduCist,dwCteno;
Nyní již lze ve zpracování zprávy WM_COMMAND doplnit novou možnost:
case ID_FILE_OPEN:
// Nastavime pozadovane parametry otviraneho souboru
szFileName[0] = '\0';
memset(&of, 0, sizeof(of));
of.lStructSize = sizeof(of);
of.hwndOwner = hWnd;
of.nMaxFile = FILE_NAME_DIM;
of.lpstrFilter = TEXT("All files (*.*)\0*.*\0\0");
of.lpstrFile = szFileName;
of.lpstrInitialDir = NULL;
// Pokud ziskame vhodne jmeno, zkusime jej vytvorit ...
if (GetOpenFileName(&of))
{
if (hFile)
CloseHandle(hFile);
hFile = CreateFile (szFileName,GENERIC_READ,FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
// ... nepovedlo se
if (hFile == INVALID_HANDLE_VALUE)
{
hFile = 0;
szFileName[0] = '\0';
}
// ... povedlo se a nastavim si podle souboru potrebne promenne
else
{
nMaxPocet = GetFileSize(hFile, NULL);
nZobrByte = 0;
si.cbSize = sizeof(si);
si.fMask = SIF_POS | SIF_RANGE;
si.nPos = 0;
si.nMin = 0;
si.nMax = nMaxPocet - 1 + nSloupce;
SetScrollInfo (hwndScroll,SB_CTL,&si,FALSE);
PostMessage(hWnd,WM_APP,0,0);
// a soucasne vykreslim novy soubor
InvalidateRect(hWnd,NULL,TRUE);
}
}
break;
Otevírání souboru se skládá ze tří kroků:
- Nejprve se v proměnné of nastaví požadované parametry pro dialog otevírání souboru.
Funkce GetOpenFileName získá jméno souboru.
- Pokud funkce GetOpenFileName uspěla, pokusí se funkce CreateFile otevřít soubor
takového jména (když před tím zavřela handle případného předcházejícího otevřeného soboru).
- Jestliže uspěla i CreateFile, nastaví se posuvník, proměnné a vykreslí se okno.
Abychom nemuseli příliš měnit zobrazovací část, využijeme dosavadní buffer. Před
každým zobrazením (zpracování WM_PAINT) pouze ze souboru z pozice dané nZobrByte
načteme funkcí ReadFile potřebný počet bajtů do bufferu.
Ve zprávě WM_PAINT doplníme nebo upravíme pouze 7 řádků. Pro informaci je zobrazena
celá zpráva WM_PAINT, změněné nebo doplněné řádky jsou očíslovány v komentáři.
Zbývá ve zprávě WM_DESTROY zrušit handle...
if (hFile) CloseHandle(hFile);
... a smazat z WM_CREATE cyklus pro naplnění bufferu čísly.
Nyní si již můžeme prohlížet první soubory:
Volba otevření souboru
... pokračování zde ...
Stránka byla už zobrazena: 1570 ×