- •Содержание
- •1. Цели и задачи курсовой работы
- •2. Тематика курсовых работ
- •3. Порядок выполнения курсовой работы
- •4. Основные требования к выполнению и оформлению курсовой работы
- •5. Оценка курсовой работы.
- •6. Список рекомендуемой литературы
- •2. Работа с графикой.
- •4. Работа с файлами с помощью mfc(классы cFile, cStdioFile, ... )и стандартный классMfc cFileDialog.
- •5. Использование таймера.
2. Работа с графикой.
CDC – класс, содержащий методы рисования.
Например, создание объекта класса CDC:
СDС MyDC;
вызов методов созданного объекта:
MyDC.MoveTo(0,0);
MyDC.LineTo(10,10);
CClientDC( CWnd* pWnd ); – класс, наследующий методы класса CDC и инициализирующий окно для рисования pWnd, в котором будет выводиться вся графика, например, создание объекта класса CClientDC:
CWnd* pWnd = GetDlgItem(IDC_DIALOG);
CClientDC NewDC( pWnd );
NewDC.MoveTo(0,0);
NewDC.LineTo(10,10);
где метод CWnd* GetDlgItem( int nID );
возвращает указатель на окно элемента диалога с идентификатором:
nID = IDC_DIALOG;
COLORREF – тип возвращаемый макросом RGB(r,g,b), где r – красная, g –зеленая, b – синяя компонента от 0 до 255.
например: COLORREF с = RGB(255,0,0,); – светло-красный;
с = RGB(128,128,0,); – темно-желтый;
Функции вывода текста.
SetTextColor( RGB(255,0,0,) ); – устанавливает красный цвет текста.
virtual BOOL TextOut( int x, int y, LPCTSTR lpszString, int nCount );
или
BOOL TextOut( int x, int y, const CString& str );
Функция выводит в точку (x,y) текст из объекта класса CString или массива символов lpszString в количестве nCount символов.
[ СОЗДАТЬ ПЕРО ]
Объект перо служит для изображения линий и контуров графических элементов.
CPen ( int nPenStyle, int nWidth, COLORREF crColor );
nPenStyle – тип пера:
· PS_SOLID – сплошное
· PS_DASH – пунктирное (при толщине 1)
· PS_DOT – точечное (при толщине 1)
· PS_DASHDOT – тире-точка (при толщине 1)
· PS_DASHDOTDOT – тире-точка-точка (при толщине 1)
· PS_NULL – прозрачное перо
nWidth – ширина пера;
crColor – цвет пера.
Например:
CPen pen(PS_SOLID, 3, RGB(0,255,0) ); – сплошное зеленое перо толщиной 3 пиксела.
[ СОЗДАТЬ КИСТЬ ]
Объект кисть предназначен для закрашивания внутренней области в графических объектах.
CBrush( COLORREF crColor );
или
CBrush( int nIndex, COLORREF crColor );
crColor – цвет пера
nIndex – тип пера
· HS_BDIAGONAL \\\\\\\\\\
· HS_CROSS ++++++++++
· HS_DIAGCROSS XXXXXXXXXX
· HS_FDIAGONAL //////////
· HS_HORIZONTAL ----------
· HS_VERTICAL |||||||||||
например: CBrush brush(HS_CROSS, RGB(255,0,0) ); – красное перо "в клеточку".
Функция выбора созданного пера или кисти текущим.
CPen* SelectObject( CPen* pPen );
CBrush* SelectObject( CBrush* pBrush ); – выбирает ТЕКУЩЕЕ перо pPen или кисть pBrush соответственно.
[ ТОЧКА ]
CPoint – класс, содержащий структуру POINT, содержит переменные:
LONG x,y – координаты задаваемой точки.
LPPOINT – указатель на объект класса CPoint или структуру POINT. Пример инициализации объекта класса CPoint:
CPoint p;
p.x = 10;
p.y = 20;
LPPOINT pp = &p;
Функции с применением класса CPoint:
CPoint GetCurrentPosition(); возвращает точку, на которой установлено текущее перо.
CPoint MoveTo( int x, int y );
или
CPoint MoveTo( POINT point );
Функция перемещает перо в указанную точку и возвращает координаты предыдущей точки пера.
BOOL LineTo( int x, int y );
или
BOOL LineTo( POINT point );
Функция изображает линию текущим пером из текущей точки в указанную.
[ ПРЯМОУГОЛЬНИК ]
CRect – класс, содержащий структуру RECT, содержит переменные:
LONG left – левая координата прямоугольника;
LONG right – правая координата прямоугольника;
LONG top – верхняя координата прямоугольника;
LONG bottom – нижняя координата прямоугольника;
LPCRECT – указатель на объект класса CRect или структуру RECT.
Пример инициализации объекта класса CRect:
CRect r(1,1, 10,10);
или
CRect r();
r.SetRect(1,1, 10,10);
LPCRECT pr = &r;
[ ДУГА ]
BOOL Arc( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4 );
или
BOOL Arc( LPCRECT lpRect, POINT ptStart, POINT ptEnd );
Функция изображает текущим пером эллиптическую кривую внутри прямоугольника: lpRect или (x1,y1; x2,y2) от начальной точки ptStart; (x3,y3) до конечной точки ptEnd; (x4,y4).
BOOL AngleArc( int x, int y, int nRadius, float fStartAngle, float fSweepAngle );
Функция изображает текущим пером эллиптическую кривую вокруг центральной точки (x,y) радиусом nRadius от угла fStartAngle до угла fSweepAngle, заданных в градусах относительно ординаты x
int SetArcDirection( int nArcDirection );
int GetArcDirection();
Соответственно задается и возвращается направление обрисовки дуги.
Параметр nArcDirection принимает значения:
· AD_COUNTERCLOCKWISE – против ч.с.
· AD_CLOCKWISE – по ч.с
[ ПОЛИЛИНИЯ ]
BOOL Polyline( LPPOINT lpPoints, int nCount );
Функция последовательно рисует текущим пером отрезки по точкам, заданным в массиве lpPoints, количеством nCount
[ Закрашенный прямоугольник ]
void FillRect( LPCRECT lpRect, CBrush* pBrush );
Функция закрашивает прямоугольник lpRect кистью pBrush.
void FrameRect( LPCRECT lpRect, CBrush* pBrush );
Функция закрашивает единичную рамку вокруг прямоугольника lpRect кистью pBrush.
BOOL Rectangle( int x1, int y1, int x2, int y2 );
или
BOOL Rectangle( LPCRECT lpRect );
Функция закрашивает текущей кистью прямоугольник lpRect или (x1,y1; x2,y2).
BOOL RoundRect( int x1, int y1, int x2, int y2, int x3, int y3 )
Функция закрашивает текущей кистью прямоугольник lpRect или (x1,y1; x2,y2) со скругленными углами, которые задаются эллипсом шириной x3 и высотой y3
void FillSolidRect( LPCRECT lpRect, COLORREF clr );
или
void FillSolidRect( int x, int y, int cx, int cy, COLORREF clr );
Функция закрашивает прямоугольник lpRect; (x,y; cx,cy – ширина, высота) цветом clr.
[ ЭЛЛИПС ]
BOOL Ellipse( int x1, int y1, int x2, int y2 );
или
BOOL Ellipse( LPCRECT lpRect );
Функция изображает текущим пером и закрашивает текущей кистью эллипс внутри прямоугольника: lpRect или (x1,y1; x2,y2).
[ Закрашенный СЕКТОР]
BOOL Pie( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4 );
или
BOOL Pie( LPCRECT lpRect, POINT ptStart, POINT ptEnd );
Функция рисует текущим пером и закрашивает текущей кистью сектор (против ч.с) внутри прямоугольника: lpRect или (x1,y1; x2,y2) от начальной точки ptStart; (x3,y3) до конечной точки ptEnd; (x4,y4).
[ ЗакрашеннАЯ ЗАМКНУТАЯ ОБЛАСТЬ ]
BOOL Polygon( LPPOINT lpPoints, int nCount );
Функция рисует текущим пером и закрашивает текущей кистью замкнутую область, ограниченную отрезками, которые задаются точками массива lpPoints, количеством nCount.
Пример использования графических функций класса CClientDC.
CClientDC MyDC(GetDlgItem(IDC_STATIC1));
// создали объект класса CClientDC, который инициализирует графическое
//окно в элементе диалога приложения с идентификатором IDC_STATIC1.
CRect Rect; // объявили объект класса CRect
CWnd *pWnd = MyDC.GetWindow();
// инициализировали pWnd как указатель на окно, закрепленное за объектом
//MyDC(с идентификатором IDC_STATIC1)
pWnd->GetClientRect(&Rect);
// передали объекту Rect координаты этого окна, т.е. определили область
//экрана, где будем выводить графику.
MyDC.FillSolidRect( &Rect, RGB(50,100,150) );
// закрасили прямоугольник Rect
int w, h;
w = Rect.Width()/3;
// определили ширину прямоугольника Rect и уменьшили ее в 3 раза
h = Rect.Height()/4;
// определили высоту прямоугольника Rect и уменьшили ее в 4 раза
CRect SmallRect = Rect;
//инициализировали малый прямоугольник, объявили его равным
//прямоугольнику Rect
SmallRect.DeflateRect( w, h );
// уменьшили ширину и высоту малого прямоугольника до значений w и h
//соответственно, сохраняя координаты центральной точки прямоугольника.
CBrush Br (RGB(100,0,150)); // инициализировали кисть
MyDC.SelectObject(&Br); // выбрали ее
MyDC.Ellipse( &SmallRect );
// изобразили закрашенный эллипс выбранной кистью, вписанный в малый
//прямоугольник.
Рис. 1. Полученное изображение
3. Работа с файлами в C / C++.
FILE *fopen(const char * filename, const char *mode);
Функция fopen() открывает файл и инициализирует связанный с ним поток данных. Аргумент mode устанавливает режим открытия файла (табл. 2).
• Спецификация режима может быть дополнена символами t или b, указывающими, в текстовом или двоичном режиме открывается файл.
• Возвращаемое значение: Функция возвращает указатель на структуру типа FILE (см. 8). Этот указатель затем передается в качестве аргумента следующим функциям, работающим с потоком. Если файл не может быть открыт, возвращается NULL-указатель.
Таблица 2
Режимы открытия файлов
Режим |
Описание |
r |
Файл открывается только для чтения |
w |
Файл открывается только для записи с усечением. Если файл не существует, он создается в каталоге, заданном в параметре filename. Указатель записи-чтения устанавливается в нуль. После закрытия файл имеет новый размер, соответствующий текущему положению указателя записи-чтения |
а |
Файл открывается для пополнения, т.е. после его открытия указатель записи-чтения устанавливается на позицию конца файла |
r+ |
Файл открывается для обновления. Он доступен для чтения и записи, но после закрытия не происходит усечения файла. Сразу после открытия указатель записи-чтения устанавливается в начало файла |
W+ |
Файл открывается для обновления, т.е. доступен для чтения и записи. Если файл не существует, он создается в каталоге, заданном в параметре filename. Указатель записи-чтения устанавливается в нуль. После закрытия файл имеет новый размер, соответствующий текущему положению указателя записи-чтения |
а+ |
Файл открывается для обновления, т.е. доступен для чтения и записи. После его открытия указатель записи-чтения устанавливается в позицию конца файла. После закрытия файла не происходит его усечения |
int fprintf (FILE *stream, const char *format...);
Функция формирует по заданным аргументам символьную строку, которая записывается в поток stream. Форматирование символьной строки происходит таким же образом, как и в функции printf().
Параметр Описание
stream Указатель на структуру FILE потока данных format Символьная строка формата (см. printf()) ... Переменное число аргументов
• Возвращаемое значение: число записанных в поток символов. В случае ошибки возвращается отрицательное значение (чаще всего EOF (WEOF)).
__________________________________________________________________
int fscanf (FILE *stream, const char *format, ...);
Функция считывает данные из потока данных stream. Она использует аргумент format для преобразования считываемых символов по заданному формату. Следующие аргументы являются указателями на переменные, которым присваиваются вводимые значения.
• Возвращаемое значение: число успешно преобразованных и присвоенных полей либо EOF в случае попытки считывания конца файла.
__________________________________________________________________
int fputc(int character, FILE *stream);
Функция выводит отдельный символ из потока ввода-вывода.
• Возвращаемое значение: записанный в поток символ или EOF в случае ошибки.
__________________________________________________________________
int fputs(const char*string, FILE *stream);
Функция записывает символьную строку в поток данных. Перенос завершается при достижении символа конца строки '\0'. Сам нуль-терминатор в файл не передается и не заменяется символом '\n'.
• Возвращаемое значение: код последнего записанного в файл символа. В случае ошибки возвращается EOF.
__________________________________________________________________
int fgetc(FILE*stream);
Функция считывает символ из потока stream. После считывания указатель записи-чтения файла устанавливается в новую позицию.
• Возвращаемое значение: считанный символ в виде целого беззнакового значения типа int; EOF означает ошибку или конец файла.
__________________________________________________________________
char*fgets(char *string, int n, FILE*stream);
Функция считывает строку из потока stream до тех пор, пока не будут считаны n символов, либо символ конца строки '\n', либо символ конца файла. Символ '\n' не передается в считанную строку. Функция автоматически дополняет полученную строку нуль-терминатором '\0'.
• Возвращаемое значение: указатель на string, а в случае ошибки или при получении символа конца файла — NULL-указатель.
__________________________________________________________________
size_t fread(void*buffer, size_t size, size_t nelem, FILE* stream);
Функция считывает nelem элементов размером size байт каждый в область памяти, на которую указывает buffer, из открытого потока stream.
• Возвращаемое значение: количество безошибочно считанных элементов данных.
__________________________________________________________________
size_t fwrite(const void *buffer, size_t size, size_t nelem, FILE *stream);
Функция записывает в поток stream nelem элементов данных размером size байтов каждый из области памяти, на которую указывает buffer. После записи указатель записи-чтения потока устанавливается на новое место. Если поток открыт в текстовом режиме, то каждый символ '\n' преобразуется в пару символов: перевода строки и возврата каретки.
Возвращаемое значение: число фактически записанных элементов данных.
__________________________________________________________________
int fseek(FILE *stream, long offset, int from_where);
Функция передвигает указатель записи-чтения файла на заданное аргументом offset количество байтов. Аргумент from_where задает точку отсчета для сдвига.
• Для файлов, открытых в двоичном режиме, количество байтов смещения указателя соответствует числу символов, на которые должен передвинуться указатель записи-чтения файла (может быть также и отрицательным).
• Для файлов, открытых в текстовом режиме, количество байтов смещения должно вычисляться с помощью функции ftell(), причем аргумент from_where должен быть равен SEEK_SET. Для аргумента from_where могут быть заданы три различные константы.
SEEK_CUR сдвиг выполняется от текущей позиции указателя чтения-записи файла
SEEK_END сдвиг выполняется от конца файла SEEK_SET сдвиг выполняется от начала файла
• Возвращаемое значение: нуль в случае успеха, в противном случае — любое ненулевое значение.
__________________________________________________________________
long ftell(FILE *stream);
Функция возвращает текущее значение указателя записи-чтения файла, связанного с потоком stream.
Возвращаемое значение: текущая позиция указателя записи-чтения файла.
• Если файл открыт в двоичном режиме, функция возвращает число байтов от начала файла до текущей позиции.
• Если файл открыт в MS DOS текстовом режиме, то каждый символ '\n' преобразуется в пару символов: перевода строки и возврата каретки (CR/LF). В этом случае значение, возвращаемое ftell(), не соответствует физическому байтовому смещению. В случае ошибки возвращаемым значением является 1L.
__________________________________________________________________
Пример использования приведенных выше функций работы с файлами.
#include <iostream.h>
#include <stdio.h>
void main( void )
{
FILE *file;
char* file_name = "file.txt";
char load_string[50] = "none";
file = fopen( file_name, "w" );
//открываем файл с именем file.txt на запись
fputs( "string", file ); // записываем в него слово string
fclose( file ); //закрываем файл
file = fopen( file_name, "r" );
// открываем этот же файл на чтение
if( file != 0 )
//если файл был действительно открыт, т.е. указатель file содержит адрес
//открываемого файла и, следовательно, не равен 0, то
{
fgets( load_string, 50 , file );
//считываем из файла строку длиной 50 в переменную load_string символов
// из открытого файла (указатель на него file)
cout << "load_string = " << load_string << endl;
// выводим считанную строку на экран
}
else
cout << "File not found !!!" << endl;
// иначе (если файл не был открыт) – сообщаем об ошибке
fclose(file); // закрываем файл
}