
- •1. Анализ технического задания 12
- •Int fnPenStyle, // стиль пера 13
- •Int nWidth, // ширина пера 13
- •Int nxStart, int nyStart, // начальная точка 15
- •Int nxEnd, int nyEnd, // конечная точка 15
- •If(IsDlgButtonChecked(hwnd,idc_check1))//и она отмечена 21
- •4. Тестирование 25
- •2. Проектирование структуры классов
- •5. Руководство по програмному продукту
- •5.1. Руководство программиста
- •5.2 Руководство администратора
- •5.3 Руководство пользователя
- •Список литературы
- •42 Миву 230700.62-00.000 пз
Int fnPenStyle, // стиль пера 13
Int nWidth, // ширина пера 13
COLORREF clrref); // цвет пера 13
Другая возможность создать перо - вызвать функцию CreatePenIndirect : 13
HPEN WINAPI CreatePenIndirect(LOGPEN FAR* lplgpn); 14
Эта функция работает аналогично функции CreatePen, однако в качестве параметра ей необходимо передать указатель на структуру типа LOGPEN, в которой должны находиться характеристики создаваемого пера. 14
Структура LOGPEN и различные указатели на нее определены в файле windows.h: 14
typedef struct tagLOGPEN 14
{ 14
UINT lopnStyle; // стиль пера 14
POINT lopnWidth; // ширина пера 14
COLORREF lopnColor; // цвет пера 14
} LOGPEN; 14
typedef LOGPEN* PLOGPEN; 14
typedef LOGPEN NEAR* NPLOGPEN; 14
typedef LOGPEN FAR* LPLOGPEN; 14
Заметим, что ширина пера в данном случае находится в поле x структуры POINT. Поле y не используется. 14
Если создаем перо, его можно выбрать в контекст отображения при помощи макрокоманды SelectPen. После этого можно рисовать линии обычным образом, вызывая функции MoveToEx и LineTo. 14
Созданные данным приложением перья принадлежат GDI, соответствующие структуры данных располагаются в его сегменте данных. Поэтому если перо больше не нужно, его нужно удалить для освобождения памяти. 14
Прежде чем удалять созданное перо, следует выбрать в контекст отображения одно из встроенных перьев (например то, которое использовалось раньше). После этого для удаления вашего пера нужно вызвать макрокоманду DeleletePen , определенную в файле windowsx.h: 14
#define DeletePen(hpen) DeleteObject((HGDIOBJ)(HPEN)(hpen)) 14
В качестве параметра этой макрокоманде необходимо передать идентификатор удаляемого пера. 15
Нельзя удалять перо, если оно выбрано в контекст отображения. Нет никакого смысла в удалении встроенных перьев. 15
Рисование линий произвольного стиля. 15
Как уже говорилось, мы не можем создать перо для рисования пунктирных, штрих-пунктирных или штриховых линий толщиной больше одного пиксела. Однако в некоторых случаях может возникнуть необходимость в рисовании таких линий. 15
В программном интерфейсе GDI есть функция с именем LineDDA, которая позволяет рисовать любые линии (правда, основная работа по рисованию линий при этом будет возложена на программиста). 15
Функция LineDDA имеет следующий прототип: 15
void WINAPI LineDDA( 15
Int nxStart, int nyStart, // начальная точка 15
Int nxEnd, int nyEnd, // конечная точка 15
LINEDDAPROC lnddaprc, // адрес функции для рисования 15
LPARAM lParam); // дополнительные параметры 15
Первые четыре параметра этой функции определяют координаты начальной и конечной точки, между которыми надо нарисовать линию. 15
Через параметр lnddaprc передается указатель на функцию рисования, которая является функцией обратного вызова, определяемой программистом. Эта функция получает управление много раз, она вызывается для каждой точки рисуемой линии. 15
Для режима STRICT тип LINEDDAPROC определен в файле windows.h следующим образом: 15
typedef void (CALLBACK* LINEDDAPROC)(int, int, LPARAM); 15
Последний параметр предназначен для передачи дополнительных данных в функцию рисования. 15
Приведем прототип функции рисования (для функции можно использовать любое имя): 16
void CALLBACK _export 16
LineProc(int xPos, int yPos, LPARAM lParam); 16
Первые два параметра представляют собой координаты точки, для рисования которых вызвана функция. Последний параметр соответствует последнему параметру функции LineDDA и содержит передаваемое этой функции значение. 16
Пример использования функции LineDDA вы можете найти ниже в разделе "Приложение DASHLINE". 16
Рисование замкнутых фигур. 16
Помимо линий, приложения Windows могут использовать функции GDI для рисования замкнутых закрашенных или незакрашенных фигур, таких как прямоугольники, эллипсы, многоугольники с прямыми и скругленными углами и т. д. 16
Для закрашивания внутренней области замкнутых фигур используется кисть, задаваемая как атрибут контекста отображения. Внешний контур фигуры обводится пером, которое также выбирается в контекст отображения. Учитываются и остальные атрибуты, установку которых мы рассмотрели для функций рисования линий, такие, как режим отображения, режим фона, код растровой операции. 16
Мы начнем изучение функций GDI, предназначенных для рисования замкнутых фигур, с функций рисования прямоугольников. 16
Рисование прямоугольника. 16
Простейшая функция, с помощью которой можно нарисовать прямоугольник, называется Rectangle : 16
BOOL WINAPI Rectangle( 16
HDC hdc, // идентификатор контекста отображения 16
int nxTL, // координата x верхнего левого угла 16
int nyTL, // координата y верхнего левого угла 16
int nxBR, // координата x правого нижнего угла 17
int nyBR); // координата y правого нижнего угла 17
Функция Rectangle рисует прямоугольник для контекста отображения hdc, возвращая значение TRUE в случае успеха или FALSE при ошибке. 17
3. Программная реализация 20
Для реализации было создано окно window (в котором осуществлено движение фигур) и немодальное диалоговое окно выбора фигуры (в нем нужно выбрать фигуру которая должна двигаться, а также можно прекратить движение какой либо фигуры) . 20
В немодальном диалоговом окне находятся 4 фигуры (круг, квадрат, прямоугольник, треугольник). Для того что бы нужная фигура начала свое движение её нужно отметить, для того что бы она прекратила движение метку нужно снять. 20
Создание немоданьгого окна. 20
case WM_CREATE: //создание окна 20
{ 20
dlg=CreateDialogParam(hinst,MAKEINTRESOURCE(IDD_DIALOG1),hwnd,(DLGPROC)dlgproc,0); //создать немодальное окно с чекбоксами 20
ShowWindow(dlg,SW_SHOWNORMAL); 20
//показать его 20
return 0; //конец обработки сообщения 20
} 20
Проверка какая фигура отмечена, а какая нет осуществляется следующим кодом. 20
LRESULT CALLBACK dlgproc(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam) 20
{ 20
switch(uMessage) 20
{ 20
case WM_COMMAND: //нажатие кнопок 20
{ 20
if(LOWORD(wparam)==IDC_CHECK1) //если нажата кнопка окружности 20
{ 21