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

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

  1. Создать проект на VC 6 – Win 32 Application и добавить файл из приложения.

  2. Разобраться в работе демонстрационной программы.

  3. Модифицировать программу, таким образом, чтобы в верхнем левом углу окна рисовался прямоугольник со следующими параметрами: обрамление – цвет: красный, толщина: 3; цвет для закрашивания: синий. В нижнем правом углу окна отображается эллипс со следующими параметрами: обрамление – цвет: зеленый, толщина 5; цвет для закрашивания: желтый; По центру окна рисуется треугольник со следующими параметрами: обрамление – цвет: черный, толщина: 2.

  4. При щелчке левой клавиши мыши внутри прямоугольника должно выводится сообщение “Вы попали в прямоугольник!”. При нажатии правой клавиши мыши внутри эллипс должно выдаваться сообщение “Вы попали в эллипс!”. В любых других случаях щелчки на клавиши мыши должны выдавать сообщение ”Здравствуй мир!”. Все сообщения выводить в левом верхнем углу окна.

  5. При нажатии на клавишу Escape на клавиатуре должен осуществляться выход из программы.

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

  1. Какое сообщение посылается окну, когда необходимо перерисовать все окно или какую-то его область?

  2. Как необходимо обрабатывать сообщение перерисовки?

  3. Как программно вызвать перерисовку окна?

  4. Каким образом рисуются графические примитивы в окне? Какие графические примитивы вы знаете? Какие параметры можно задавать для них?

  5. Какие сообщения посылаются окну при нажатии в его области на клавиши мыши?

  6. Какие сообщения посылаются окну при нажатии клавиш на клавиатуре?

Приложение

Листинг программы gdi_kb_mouse.cpp

#include <windows.h>

/* прототип функции окна */

LRESULT CALLBACK WindowFunc(HWND,UINT,WPARAM,LPARAM);

/* прототип функции отрисовки графических примитивов и вывода текста */

void DrawMessageAndEllipse(HWND hwnd,int x,int y,char *msg);

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_WINLOGO);/* большая */

/* пикторграмма */

wcl.hIconSm = LoadIcon(NULL,IDI_WINLOGO); /* малая */

/* пиктограмма */

wcl.hCursor = LoadCursor(NULL,IDC_ARROW); /* форма курсора */

wcl.lpszMenuName = NULL; /* меню не используется */

wcl.cbClsExtra = 0; /* дополнительная информация отсутствует */

wcl.cbWndExtra = 0;

/* фон окна задается белым */

wcl.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);

/* регистрация класса окна */

if(!RegisterClassEx(&wcl)) return 0;

/* Создание окна */

hwnd = CreateWindow (

szWinName, /* имя класса окна */

"Демонстрация рисования графических примитивов и работы с мышью", /* заголовок */

WS_CAPTION|WS_BORDER|WS_SYSMENU, /* стиль окна */

CW_USEDEFAULT, /* координата Х - определяется Windows */

CW_USEDEFAULT, /* координата Y - определяется Windows */

CW_USEDEFAULT, /* ширина - определяется Windows */

CW_USEDEFAULT, /* высота - определяется Windows */

HWND_DESKTOP, /* родительского окна нет */

NULL, /* меню нет */

hThisInst, /* дескриптор данного экземпляра приложения */

NULL /* дополнительных аргументов нет */

);

/* отображение окна */

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)

{

/* контекст устройства */

HDC hDC;

/* координаты */

int xPos,yPos;

/* буфер для текста */

char buf[40];

/* обработка сообщений */

switch (message){

case WM_DESTROY: /* завершение программы */

PostQuitMessage(0);

break;

/* ообработка сообщения от нажатия левой клавиши мыши */

case WM_LBUTTONDOWN:

/* позиция курсора по горизонтали */

xPos = LOWORD(lParam);

/* позиция курсора по вертикали */

yPos = HIWORD(lParam);

/* форматированый вывод в строку */

wsprintf(buf,"Координаты X=%d Y=%d ",xPos,yPos);

/* получение контекста клиентской области окна */

hDC=GetDC(hwnd);

/* вывод сообщения */

TextOut(hDC,30,30,buf,lstrlen(buf));

//MessageBox(hwnd,buf,"Координаты точки",MB_OK);

ReleaseDC(hwnd,hDC);

break;

/* обработка сообщения перерисовки */

case WM_PAINT:

/* отрисовка графических примитивов и вывод сообщения*/

DrawMessageAndEllipse(hwnd,10,10,"Hi World !!!");

break;

default:

/* позволяет Windows обрабатывать любые сообщения

неуказанные в предыдущем случае */

return DefWindowProc(hwnd, message,wParam,lParam);

}

return 0;

}

/* выводит сообщение в окно в позицию с координатами x,y */

void DrawMessageAndEllipse(HWND hwnd,int x,int y,char *msg)

{

HDC hDC;

PAINTSTRUCT paintStruct;

RECT clientRect;

/* объявление кисти*/

HBRUSH br1;

HBRUSH br2;

/* объявление цветов */

COLORREF color1,color2,color3;

/* объявление */

HPEN pen1;

/* 32 битная структура цвета */

/* старшие два байта = 0

следующие задают синюю компоненту

следущие зеленую

следующие красную */

/* 0x00bbggrr */

color1=0x00777777;

color2=0x00990099;

color3=0x00007700;

/* создание кистей */

br1=CreateSolidBrush(color1);

br2=CreateSolidBrush(color3);

/* создание пера

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

// выбор кисти

SelectObject(hDC,br2);

/* рисует эллипс */

Ellipse(hDC,clientRect.top,clientRect.left,

clientRect.right,clientRect.bottom);

// задает цвет текста

SetTextColor(hDC, RGB(255,0,0));

/* вывод сообщения */

TextOut(hDC,x,y,msg,lstrlen(msg));

/* рисует треугольние по линиям */

/* задает текущую позицию */

/* 1-ый параметр - контекст окна */

/* 2-ой и 3-ий координаты позиции */

/* 4-ая указатель на структуру - пред позицию */

MoveToEx(hDC,100,200,NULL);

/* рисует линию от пред позиции к заданной и переносит

текущую позицию в новую точку

1-ый параметр - контекст окна

2-ой параметр - новая точка

*/

LineTo(hDC,200,100);

LineTo(hDC,200,200);

LineTo(hDC,100,200);

/* удаляет перо */

DeleteObject(pen1);

/* удаляет кисти */

DeleteObject(br1);

DeleteObject(br2);

/* окончания отрисовки */

EndPaint(hwnd, &paintStruct);

}

}