Wywoływanie i obsługa standardowych okien Otwórz i Zapisz oraz zapis do pliku
Stronę tą wyświetlono już: 2908 razy
Wstęp
Na poprzedniej stronie omawiany został projekt, w którym dodane zostało menu, ikonka, kursor oraz akceleratory oraz dodana została pierwsza kontrolka typu EDIT. Był to początek programu o wdzięcznej nazwie myNotepad i wszystko byłoby pięknie, gdyby nie fakt, że program ten wcale nie wczytuje tekstu z pliku ani też go nie zapisuje. Na tej stronie będę kontynuował poprzednio zaczęty projekt omawiając tym samym sposób wykorzystania dwóch z pośród rodziny okien standardowych systemu Windows. Te standardowe okna istnieją dlatego, że bardzo często różne programy korzystają z tej samej lub podobnej funkcjonalności a więc aby nie powielać ciągle tego samego kodu przez różne programy część obowiązku za dostarczenie pewnych narzędzi spoczywa na systemie. Do takich standardowych okien należą okno dialogowe Otwórz oraz Zapisz, które zasadniczo wykorzystuje większość programów do wczytywania lub zapisywania jakiegoś pliku z dysku twardego komputera.
W WinApi w celu wywołania okna dialogowego Otwórz używa się funkcji GetOpenFileName, natomiast do wywołania okna Zapisz wykorzystuje się funkcję GetSaveFileName. Obie wspomniane wcześniej funkcje przyjmują tylko jeden argument, którym jest wskaźnik do prawidłowo wypełnionej struktury typu OPENFILENAME. Jeżeli struktura ta została prawidłowo wypełniona, wcześniej wymienione funkcje wywołają okna dialogowe.
Modyfikacja kodu programu myNotepad
Czas najwyższy zakasać rękawy i czym prędzej dodać do programu nowe elementy, ale zanim to najpierw na samym początku projektu należy załączyć plik nagłówkowy locale.h:
po czym niezwłocznie w ciele funkcji WinMain na samym początku dodać następujące wywołanie funkcji setlocale:
Taki zabieg jest konieczny, aby w oknach dialogowych poprawnie wczytywane były polskie znaki i aby program poprawnie odczytywał polskie znaki w plikach, choć możliwe jest, że skoro wykorzystują w projekcie tryb z unicodem to obsługa polskich znaków powinna być poprawna.
W ciele funkcji hwndProc na samym jej początku konieczne będzie dodanie kilku nowych zmiennych statycznych:
Jak widać jest tu instancja struktury OPENFILENAME, oraz dwa łańcuchy znaków typu TCHAR*. Opis tych dodatkowych zmiennych zamieściłem w komentarzach powyższego kodu. W komunikacie WM_COMMAND należy dodać następujący kod programu:
I tutaj wszystko zostało omówione w komentarzach kodu programu. Teraz w komunikacie WM_COMMAND w switch-u z identyfikatorem pozycji menu ID_PLIK_OTWORZ należy zastąpić dotychczas wstawiony tam MessageBox następującym kodem:
W powyższym kodzie wykorzystana została funkcja MultiByteToWideChar a to z tego względu, że kontrolka EDIT wykorzystuje w projekcie tekst unicode, natomiast ja tutaj założyłem, że wczytywane dane są zapisane w standardowym kodowaniu używanym przez system użytkownika.
Podobnie wstawić należy kod dla identyfikatora pozycji w menu ID_PLIK_ZAPISZ:
W tej chwili już mamy jako - tako obsłużone wczytywanie danych z pliku i zapisywanie do pliku.
Spis nowych funkcji i struktur użytych w programie
Oto spis nowych funkcji:
- GetOpenFileName - wyświetla okno dialogowe Otwórz, funkcja ta związana jest ściśle z strukturą OPENFILENAME;
- GetSaveFileName - wyświetla okno dialogowe Zapisz, funkcja ta związana jest ściśle z strukturą OPENFILENAME;
- CloseHande - zwalnia uchwyt w kodzie programu funkcja została użyta do zamknięcia uchwytu pliku pozyskanego funkcją CreateFile;
- CreateFile - funkcja wykorzystana do utworzenia pliku i pozyskania jego uchwytu. Z tą funkcją powiązane są funkcje ReadFile, WriteFile oraz CloseHandle;
- GetWindowLong - umożliwia pozyskiwanie informacji związanych z danym uchwytem okna. W kodzie użyto tej funkcji do pozyskania uchwytu instancji programu typu HINSTANCE;
- MultiByteToWideChar - zamiana tekstu zapisanego z standardowym kodowaniem ustawionym w systemie na utf-8;
- ReadFile - czytanie danych z pliku, związane z funkcją CreateFile;
- setlocale - funkcja ustawia pewne parametry związane z lokalnymi ustawieniami wyświetlania i przetwarzania tekstu;
- SetWindwText - funkcja ustawia tekst wyświetlany w danym oknie programu. W kodzie funkcji tej użyto do ustawienia tekstu zawartego w kontrolce hedit;
- WideCharToMultiByte - zamiana z utf-8 na standardowe kodowanie Windowsa;
- WriteFile - zapisywanie danych do pliku, związane z funkcją CreateFile;
Wykorzystane w kodzie struktury:
- OPENFILENAME - struktura związana z wywoływaniem okien Otwórz i Zapisz za pomocą funkcji GetOpenFileName oraz GetSaveFileName.
Tytuł:
C++ Zbiór zadań z rozwiązaniami
Autor:
Tomasz Jaśniewski
Tytuł:
Mikrokontrolery dla hobbystów. Projekty DIY w języku C i C++
Autor:
Miguel Angel Garcia-Ruiz, Pedro Cesar Santana Mancilla
Tytuł:
Architektura oprogramowania bez tajemnic. Wykorzystaj język C++ do tworzenia wydajnych aplikacji i systemów
Autor:
Adrian Ostrowski, Piotr Gaczkowski
Tytuł:
Wprowadzenie do C++
Autor:
Michał Matlak
Tytuł:
Opus magnum C++ 11. Programowanie w języku C++. Wydanie II poprawione (komplet)
Autor:
Jerzy Grębosz
Tytuł:
Programowanie wieloplatformowe z C++ i wxWidgets 3
Autor:
Bartosz W. Warzocha
Tytuł:
Język C++ i przetwarzanie współbieżne w akcji. Wydanie II
Autor:
Anthony Williams
Tytuł:
C++ dla bystrzaków. Wydanie VII
Autor:
Stephen R. Davis
Tytuł:
Tablice informatyczne. Podstawy C++
Autor:
Radosław Sokół
Tytuł:
Opus magnum C++11. Programowanie w języku C++ (komplet)
Autor:
Jerzy Grębosz