Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лаба8.doc
Скачиваний:
2
Добавлен:
12.11.2019
Размер:
982.02 Кб
Скачать

3. Порядок выполнения работы

  1. Создать пустой проект на VC 6.0. Добавить к проекту файлы из приложения. Откомпилировать, отлинковать и запустить программу.

  2. Разобраться во внутреннем строении программы. Найти точки инициализации и вызова стандартных диалогов. Найти в программе чтение и запись в файл. Просмотреть созданные программой файлы.

  3. Изменить программу так, чтобы в окне рисовался эллипс. Цвет эллипса задается с помощью стандартного диалога выбора цвета (вызов диалог осуществить из меню). В файл необходимо сохранять цвет эллипса и фона. При загрузке файла цвет эллипса и фона считывается из файла и сразу применяется.

Примечание: для разбора строки из файла удобно пользоваться функцией sscanf. Работает функция подобно функции scanf, только данные берет не из стандартного устройства ввода, а из строки, которая идет первым параметром.

Пример вызова: // дана строка s = “10 20”

sscanf(s, “%d %d”,&x,&y); // данные из строки запишутся в переменные x и y: x=10 y=20

4. Контрольные вопросы

  1. Что такое стандартные диалоги? Какой заголовочный файл необходимо подключить, чтобы их использовать?

  2. Опишите порядок использования стандартных диалогов для сохранения и загрузки файлов, а также для выбора цвета.

  3. Какая функция используется для создания и открытия файла? В каких режимах можно открыть и создать файл? Какие наиболее значимые параметры у этой функции?

  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);

}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]