- •Министерство образования и науки Российской Федерации
- •1. Стандартные диалоги
- •1.2. Работа с Common Dialogs
- •1.3. Стандартные диалоги открытия - сохранения файлов
- •1.3.1. Инициализация структуры перед вызовом диалога открытия или сохранения файла
- •1.3.2. Вызов диалога открытия файла
- •1.3.3. Вызов диалога сохранения файла
- •1.4. Стандартный диалог выбора цвета
- •1.4.1. Инициализация структуры перед вызовом диалога выбора цвета
- •2. Операции с файлами. Создание, открытие файлов. Запись - чтение данных из файлов.
- •2.1. Создание - открытие файла
- •2.2. Чтение из файла
- •2.3. Запись в файл
- •2.4. Перемещение указателя файла
- •3. Порядок выполнения работы
- •4. Контрольные вопросы
- •Приложение Файл cmdlg.Cpp
- •Файл cmdlg.Rc
- •Файл resource.H
3. Порядок выполнения работы
Создать пустой проект на VC 6.0. Добавить к проекту файлы из приложения. Откомпилировать, отлинковать и запустить программу.
Разобраться во внутреннем строении программы. Найти точки инициализации и вызова стандартных диалогов. Найти в программе чтение и запись в файл. Просмотреть созданные программой файлы.
Изменить программу так, чтобы в окне рисовался эллипс. Цвет эллипса задается с помощью стандартного диалога выбора цвета (вызов диалог осуществить из меню). В файл необходимо сохранять цвет эллипса и фона. При загрузке файла цвет эллипса и фона считывается из файла и сразу применяется.
Примечание: для разбора строки из файла удобно пользоваться функцией sscanf. Работает функция подобно функции scanf, только данные берет не из стандартного устройства ввода, а из строки, которая идет первым параметром.
Пример вызова: // дана строка s = “10 20”
sscanf(s, “%d %d”,&x,&y); // данные из строки запишутся в переменные x и y: x=10 y=20
4. Контрольные вопросы
Что такое стандартные диалоги? Какой заголовочный файл необходимо подключить, чтобы их использовать?
Опишите порядок использования стандартных диалогов для сохранения и загрузки файлов, а также для выбора цвета.
Какая функция используется для создания и открытия файла? В каких режимах можно открыть и создать файл? Какие наиболее значимые параметры у этой функции?
Какие функция предназначена для чтения и записи данных из файла/ в файл? Каким образом происходит чтение? Опишите наиболее значимые параметры данных функций.
Приложение Файл cmdlg.Cpp
#include <windows.h>
#include "resource.h"
#include <commdlg.h>
/* прототип главной функции */
LRESULT CALLBACK WindowFunc(HWND,UINT,WPARAM,LPARAM);
/* функция рисующая прямоугольник с заливкой */
void DrawColorRect(HWND hwnd);
/* дескриптор приложения */
HANDLE hInstance;
/* редактор (поле ввода)*/
HWND EdtHwnd;
/* массив из шестнадцати цветов */
COLORREF crCustColors[16];
/* структура - диалог для выбора цвета */
CHOOSECOLOR cc;
/* структура - диалог для открытия и сохранения файла */
OPENFILENAME ofn;
/* для операций с файлами */
HANDLE hSrc,hDest;
// буфер для хранения данных из файла
char pBuffer[50];
char szWinName[] ="MyWin"; /* имя класса окна */
/* главная функция */
int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst,
LPSTR lpszArgs, int nWinMode )
{
HWND hwnd;
MSG msg;
WNDCLASSEX wcl;
/* определение класса окна */
wcl.hInstance=hThisInst; /* дескриптор данного экземпляра */
wcl.lpszClassName=szWinName; /* имя класса окна */
wcl.lpfnWndProc=WindowFunc; /* функция окна */
wcl.style=0; /* стиль по умолчанию */
wcl.cbSize = sizeof(WNDCLASSEX); /*размер структуры */
/* WNDCLASSEX */
wcl.hIcon = LoadIcon(NULL,IDI_APPLICATION);/* большая */
/* пиктограмма */
wcl.hIconSm = LoadIcon(NULL,IDI_WINLOGO); /* малая */
/* пиктограмма */
wcl.hCursor = LoadCursor(NULL,IDC_ARROW); /* форма курсора */
wcl.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1); /* меню не используется */
wcl.cbClsExtra = 0; /* дополнительная информация отсутствует */
wcl.cbWndExtra = 0;
/* фон окна задается белым */
wcl.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
/* регистрация класса окна */
if(!RegisterClassEx(&wcl)) return 0;
/* Создание окна */
hwnd = CreateWindow (
szWinName, /* имя класса окна */
"Load - Save Routine", /* заголовок */
WS_OVERLAPPEDWINDOW, /* стандартное окно */
CW_USEDEFAULT, /* координата Х - определяется Windows */
CW_USEDEFAULT, /* координата Y - определяется Windows */
CW_USEDEFAULT, /* ширина - определяется Windows */
CW_USEDEFAULT, /* высота - определяется Windows */
HWND_DESKTOP, /* родительского окна нет */
NULL, /* меню определено в классе окна */
hThisInst, /* дескриптор данного экземпляра приложения */
NULL /* дополнительных аргументов нет */
);
hInstance = hThisInst;
/* отображение окна */
ShowWindow(hwnd,nWinMode);
UpdateWindow(hwnd);
/* цикл сообщений */
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg); /* разрешает
использование клавиатуры */
DispatchMessage(&msg); /* возвращает управление Windows */
}
return msg.wParam;
}
/* Эта функция вызывается Windows 95, которая передает ей */
/* сообщения из очереди сообщений */
LRESULT CALLBACK WindowFunc(HWND hwnd, UINT message, WPARAM wParam,
LPARAM lParam)
{
char *filename; // указатель на строку, содержащую
// имя файла диалога
/* обработка соообщений */
switch (message)
{
case WM_DESTROY: /* завершение программы */
PostQuitMessage(0);
break;
case WM_COMMAND:
/* отклик на пункт меню - LOAD */
if(LOWORD(wParam)==IDM_LOAD)
{
DWORD fsize; // размер файла
DWORD read; // количество прочитанных байтов
// выделение памяти под строку для имени файла
filename=new char[100];
// иниц-ция строки
lstrcpy(filename,"");
// иниц-ция структуры
memset(&ofn, 0, sizeof(ofn));
// установка указателя на буфер для имени файла
ofn.lpstrFile=filename;
// максимальное количество символов в пути
ofn.nMaxFile=100;
// задаем размер структуры
ofn.lStructSize = sizeof(OPENFILENAME);
// вызываем диалог открытия файла
if (GetOpenFileName(&ofn))
{
// открываем файл
hSrc = CreateFile(ofn.lpstrFile, GENERIC_READ, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
// определяем размер файла
fsize=GetFileSize(hSrc,NULL);
// читаем строку из файла
ReadFile(hSrc, pBuffer, fsize, &read, NULL);
// закрываем файл
CloseHandle(hSrc);
// удаляем выделенную память
delete filename;
// посылаем текст в редактор
SendMessage(EdtHwnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)pBuffer);
}
}
/* сообщение от пункта меню SAVE */
if(LOWORD(wParam)==IDM_SAVE)
{
int txt_length; // длина текста
DWORD written; // количество записанных байтов в файл
// выделение памяти под строку для имени файла
filename=new char[100];
// инициализация строки
lstrcpy(filename,"");
// иниц-ция структуры
memset(&ofn, 0, sizeof(ofn));
// установка указателя на буфер для имени файла
ofn.lpstrFile=filename;
// максимальное количество символов в пути
ofn.nMaxFile=100;
// задаем размер структуры
ofn.lStructSize = sizeof(OPENFILENAME);
// вызываем диалог сохранения
if (GetSaveFileName(&ofn))
{
// открытие файла для записи
hDest = CreateFile(ofn.lpstrFile, GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
/* перевод компонент цвета в строку */
wsprintf(pBuffer,"%d %d %d",GetRValue(cc.rgbResult),
GetGValue(cc.rgbResult),GetBValue(cc.rgbResult));
/* определение размера строки */
txt_length=lstrlen(pBuffer);
// запись в файл текста
WriteFile(hDest, pBuffer, txt_length+1, &written, NULL);
/* закрытие файла */
CloseHandle(hDest);
/* удаление динамически созданного элемента */
delete filename;
}
}
/* сообщение от пункта меню - выбор цвета */
if(LOWORD(wParam)==IDM_COLOR)
{
// обнуление структуры диалога для выбора цвета
memset(&cc, 0, sizeof(cc));
// обнуление массива дополнительных цветов
memset(crCustColors, 0, sizeof(crCustColors));
// задаем размер структуры
cc.lStructSize = sizeof(cc);
// инициализация поля - указатель на дополнительные цвета
cc.lpCustColors = crCustColors;
// вызов диалога
if (ChooseColor(&cc))
// перерисовка окна
InvalidateRect(hwnd,NULL,true);
}
break;
case WM_PAINT:
// отрисовка прямоугольника
DrawColorRect(hwnd);
break;
case WM_CREATE:
/* начальный цвет прямоугольника */
cc.rgbResult=0x00777777;
/* создание редактора (поля ввода) */
EdtHwnd = CreateWindow (
"EDIT", /* имя класса окна */
"0", /* заголовок */
WS_CHILD|WS_VISIBLE|WS_BORDER|WS_THICKFRAME,
60,
10,
70,
70,
hwnd,
NULL,
hInstance,
NULL
);
default:
/* позволяет Windows обрабатывать любые сообщения
неуказанные в предыдущем случае */
return DefWindowProc(hwnd, message,wParam,lParam);
}
return 0;
}
/* функция - отрисовка прямоугольника с заливкой */
void DrawColorRect(HWND hwnd)
{
/* контекст устройства */
HDC hDC;
/* структура для рисования */
PAINTSTRUCT paintStruct;
/* объявление прямоугольника */
RECT clientRect;
/* объявление кисти*/
HBRUSH br1;
/* объявление цветов */
COLORREF color2;
/* объявление пера */
HPEN pen1;
/* 32 битная структура цвета */
/* старшие два байта = 0
следующие задают синюю компоненту
следущие зеленую
следующие красную */
/* 0x00bbggrr */
color2=0x00990099;
/* создание кисти */
br1=CreateSolidBrush(cc.rgbResult);
/* создание пера
1-ый параметр задает стиль
PS_DASH - штрих
PS_DOT - пунктир
PS_SOLID - сплошной
PS_DASHDOT - штрих - пунктир
PS_NULL - нет пера
2-ой толщину
3-ий цвет */
pen1=CreatePen(PS_DASH,0,color2);
/* получение контекста клиентской области окна */
hDC = BeginPaint(hwnd, &paintStruct);
if (hDC != NULL)
{
// получение прямоугольника клиентского окна
GetClientRect(hwnd, &clientRect);
// выбор кисти
SelectObject(hDC,br1);
// выбор пера
SelectObject(hDC,pen1);
/* рисует прямоугольник */
Rectangle(hDC,clientRect.top,clientRect.left,
clientRect.right,clientRect.bottom);
/* удаляет перо */
DeleteObject(pen1);
/* удаляет кисть */
DeleteObject(br1);
/* окончания отрисовки */
EndPaint(hwnd, &paintStruct);
}
}