| Глава 4 | стр 37 |
Теперь будем наполнять наше приложение функциональностью.
В функцию OnInitDialog() внесем следующий код:
strFileName = "Впишите здесь имя файла и нажмите 'Выполнить' ";
//обновить значения в диалоговом окне
UpdateData(FALSE);
Теперь после компиляции мы видим, что в окне EditBox появилась надпись:
Впишите имя файла здесь и нажмите 'Выполнить'
Здесь функция UpdateData(FALSE); - ключ к работе с переменными, ассоциированными с элементами управления.
Эта функция получает доступ к данным, хранящихся в переменных (которые мы только что инициализировали) и обновляет на экране вид элементов управления так, чтобы отобразить значения этих переменных.
Она так же принимает данные от элементов управления, введенные пользователем, и заносит эти данные в переменные. Этот процесс управляется булевым параметром, передаваемом в качестве аргумента в функцию UpdateData(). Если значение параметра равно FALSE , то значениями которые хранятся в переменных, инициализируются элементы управления. Если значение параметра TRUE или он опущен, то в переменные записываются значения, которые в данный момент отображаются на экране в соответствующих им элементах управления.
------------------------
void CText_matrixDlg::OnBnClickedCancel()
{
Далее, реакция на нажатие кнопки "Выход":
Далее в функцию OnBnClickedOk() нажатия кнопки "Выполнить" внесем код
void CText_matrixDlg::OnBnClickedOk()
{
////////////////////
открытия и закрытия потоков для считывания и записи файлов:
if(!from1)
{
from1.close(); // always pays to be tidy
ofstream to1("text2" ); // open for writing
if(!to1)
{
to1.close(); // always pays to be tidy
//////////////////
from1.close(); // always pays to be tidy
to1.close(); // always pays to be tidy
Откомпилируем. Получаем сообщение об ошибке. Это потому, что надо подключить к файлу
#include <fstream>
библиотеку fstream, в которой описаны потоки. Ну и включить инструкцию об использовании
пространства имен using namespace std.
using namespace std;
Далее добавим в функцию код, который считает из входного файла данные побайтно
//////////////////
//считаем из файла в вектор
и поместит их в вектор (массив).
vector
char ch;
while (from1.get(ch)) {
Теперь данные считаны и хранятся в векторе.
Обратите внимание на лаконичность кода. Таков С++!
Чтобы этот код не вызывал ошибок при компиляции, надо добавить библиотеку
#include <vector>
//////////////////////////
для работы с векторами:
Далее считаем данные из префикса файла в локальные переменные.
////////////////////////////////////////
char first_ch = ' ';
//--------------------------------
temp_l = (int)charVec[2];
temp_l = (int)charVec[22];
temp_l = (int)charVec[34];
dlina_str = size_card/chislo_str;
////////////////////////////////////////
////////////////////////////////////////
int temp = 0;
int temp_l = 0;
int temp_h = 0;
int size_file = 0; //размер исходного bmp-файла (2-й, 3-й байты)
int chislo_str = 0; //размер картинки в байтах (34-й, 35-й байты)
int size_card = 0; //количество строк в картинке (22-й, 23-й байты)
int dlina_str = 0; //длина строки в выходном файле
char second_ch = ' ';
//считаем данные из префикса файла
if(temp_l<0)
temp_l = 256+temp_l;
temp_h = (int)charVec[3];
if(temp_h<0)
temp_h = 256+temp_h;
temp_h = 256*temp_h;
size_file = temp_h+temp_l;
if(temp_l<0)
temp_l = 256+temp_l;
temp_h = (int)charVec[23];
if(temp_h<0)
temp_h = 256+temp_h;
temp_h = 256*temp_h;
chislo_str = temp_h+temp_l;
if(temp_l<0)
temp_l = 256+temp_l;
temp_h = (int)charVec[35];
if(temp_h<0)
temp_h = 256+temp_h;
temp_h = 256*temp_h;
size_card = temp_h+temp_l;
//-------------------------------------------
Откомпилируем. Все в порядке!
Теперь выведем имя файла в переменную strFileName2 типа CString, ассоциированную
с компонентом IDC_STATIC_FILENAME типа StaticText.
Теперь выведем размер файла в переменную strSizeFile типа CString, ассоциированную
UpdateData(TRUE);
с компонентом IDC_STATIC_SIZEFILE типа StaticText.
strFileName2.Format(strFileName);
strSizeFile.Format("%d",size_file);
Теперь после нажатия на кнопку "Выполнить" на сером фоне формы, через элементы StaticText будет выведено то, что напечатает пользователь в EditBox и выведен размер файла в байтах.
Теперь выведем подобным же образом другие переменные.
strSizeCard.Format("%d",size_card);
strChisloStr.Format("%d",chislo_str);
strDlinaStr.Format("%d",dlina_str);
Все работает!
Теперь надо бы, чтобы пользователь мог вводить имя файла, который он хочет
UpdateData(TRUE);
обработать.
Следующий код делает это:
ifstream from1(strFileName);//открываем файл для считывания
Здесь возникает одна проблема:
В случае, если имя файла набрано верно и такой файл есть в директории, то программа выполняется правильно. Если имя набрано неверно или если такого файла нет в директории
то выходит сообщение "Входной файл не найден", а далее программа завершается аварийно.
Надо чтобы программа завершалась корректно предварительно попросить ввести правильное имя.
Для этого в программу надо ввести окно Yes/No.
Продолжить ввод? Завершить программу
/////////////////////////////////////
int iResults;
iResults = MessageBox("Press the Yes,No,or Cancel button ",
"Yes,No Cancel Dialog",MB_YESNOCANCEL | MB_ICONINFORMATION);
int iResults;
iResults = MessageBox("Press the Abort,Retry,or Ignore button ",
"Abort,Retry,Ignore Dialog",MB_ABORTRETRYIGNORE | MB_ICONINFORMATION);
/////////////////////////////
void CDialogsDlg::OnBnClickedBabortretryignore() {
switch(iResults) {
case IDRETRY:
m_strResults = "RETRY,RETRY,RETRY";
break;
case IDIGNORE:
m_strResults = "IGNORE,IGNORE,IGNORE";
break;
-------------------------
void CDialogsDlg::OnBnClickedByesnocancel()
{
switch(iResults) {
case IDNO:
m_strResults = "No,No,No,no";
break;
case IDCANCEL:
m_strResults = "Sorry,canceled";
break;
UpdateData(FALSE);
Назад |
Начало урока |
Вверх |
Вперед
Содержание