
- •1. Сообщение wm_paint
- •2. Рисование графических примитивов
- •2.1. Создание кистей и перьев
- •2.2. Выбор объектов
- •2.3. Рисование прямоугольника
- •2.4. Рисование эллипса
- •2.5. Рисование линий
- •3. Обработка нажатий клавиш мыши
- •4. Обработка сообщений от клавиатуры
- •5.Порядок выполнения лабораторной работы
- •6. Контрольные вопросы
- •Приложение
5.Порядок выполнения лабораторной работы
Создать проект на VC 6 – Win 32 Application и добавить файл из приложения.
Разобраться в работе демонстрационной программы.
Модифицировать программу, таким образом, чтобы в верхнем левом углу окна рисовался прямоугольник со следующими параметрами: обрамление – цвет: красный, толщина: 3; цвет для закрашивания: синий. В нижнем правом углу окна отображается эллипс со следующими параметрами: обрамление – цвет: зеленый, толщина 5; цвет для закрашивания: желтый; По центру окна рисуется треугольник со следующими параметрами: обрамление – цвет: черный, толщина: 2.
При щелчке левой клавиши мыши внутри прямоугольника должно выводится сообщение “Вы попали в прямоугольник!”. При нажатии правой клавиши мыши внутри эллипс должно выдаваться сообщение “Вы попали в эллипс!”. В любых других случаях щелчки на клавиши мыши должны выдавать сообщение ”Здравствуй мир!”. Все сообщения выводить в левом верхнем углу окна.
При нажатии на клавишу Escape на клавиатуре должен осуществляться выход из программы.
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);
}
}