В отчет по лабораторной работе следует включить программный код (в соответствии с пунктами задания) с текстовым описанием и подробными комментариями
Лабораторная работа 6
Основы GDI
Подготовка к лабораторной работе
Для выполнения лабораторной работы необходимо ознакомиться (по литературе или в сети) и сделать краткое описание следующих функций и параметров, а также используемых событий.
1). Дескриптор контекста устройства и функции для получения и освобождения контекста:
- GetWindowDC;
HDC GetWindowDC – возвращает контекст устройства всего окна
(
HWND hWnd
);
- GetDC;
HDC GetWindowDC возвращает контекст устройства клиентской части окна
(
HWND hWnd
);
- ReleaseDC(HWND, HDC); - освобождение КУ (обязательно)
2). Выбор и создание инструментов рисования:
- GetStockObject извлекает дескриптор одного из предопределенных (стандартных) перьев, кистей, шрифтов или палитр
HGDIOBJ GetStockObject( int fnObject // тип предопределенного объекта);
SelectObject выбирает объект в заданный контекст устройства (DC). Новый объект заменяет предыдущий объект того же самого типа.
HGDIOBJ SelectObject( HDC hdc, // дескриптор контекста устройства (DC) HGDIOBJ hgdiobj // дескриптор объекта);
- CreateSolidBrush создает логическую кисть, которая имеет заданный сплошной тон.
HBRUSH CreateSolidBrush( COLORREF crColor // код цвета кисти);
- CreatePen - создает логическое перо, которое имеет заданные стиль, ширину и цвет. Перо может быть впоследствии выбрано в контекст устройства и использовано, чтобы рисовать линии и кривые.
HPEN CreatePen( int fnPenStyle, // стиль пера int nWidth, // ширина пера COLORREF crColor // цвет пера);-
|
|
- DeleteObject удаляет логическое перо, кисть, шрифт, точечную картинку, регион или палитру, освобождая все системные ресурсы, связанные с объектом. После того, как объект удаляется, его дескриптор более не допустим.
BOOL DeleteObject( HGDIOBJ hObject // дескриптор графического объекта);-
- SetBkColor – установка цвета фона
COLORRED SetBkColor(HDC,COLORREF)
3). Функции рисования.
4). Функции заливки ExtFloodFill и FillRect.
ExtFloodFill function fills an area of the display surface with the current brush.
BOOL ExtFloodFill(
HDC hdc, // handle to device context
int nXStart, // x-coordinate where filling begins
int nYStart, // y-coordinate where filling begins
COLORREF crColor, // fill color
UINT fuFillType // fill type
);
int FillRect(HDC hDC, CONST RECT *lprc, HBRUSH hbr); - закраска прямоугольника
5). Функции для работы с пикселами: GetPixel и SetPixel.
GetPixel(DC: HDC; X, Y: Integer): Longint;
Считывает цвет RGB в указанной точке
SetPixel(DC: HDC; X, Y: Integer; Color: TColorRef): Longint;
Рисует элемент изобpажения в указанной точке.
6). Режимы рисования: (функция SetROP2) R2_XORPEN, R2_NOTXORPEN и т.д.
Функция SetROP2 установливает текущий режим смешивания фона. GDI использует режим смешивания фона для комбинирования перьев и внутреннего содержимого объектов с цветами, которы уже на экране. Режим смешивания фона определяет как будут комбинированы цвета кисти ли пера и цвета в существующем изображении.int SetROP2( HDC hdc, // дескриптор контекста устройства int fnDrawMode // режим прорисовки);Режим смешивания: | Описание: |
R2_BLACK | Пиксель черного цвета. |
R2_COPYPEN | Пиксель цвета пера. |
R2_MASKNOTPEN | Пиксель – это комбинация цвета экрана и инверсированного цвета пера. |
R2_MASKPEN | Пиксель – это комбинация цвета пера и цвета экрана. |
R2_MASKPENNOT | Пиксель – это комбинация цвета пера и инверсированного цвета экрана. |
R2_MERGENOTPEN | Пиксель – это комбинация цвета экрана и инверсированного цвета пера. |
R2_MERGEPEN | Пиксель – это комбинация цвета пера и цвета экрана. |
R2_MERGEPENNOT | Пиксель – это комбинация цвета пера и инверсированного цвета экрана. |
R2_NOP | Пиксель не изменяется. |
R2_NOT | Пиксель – это инверсированный цвет экрана. |
R2_NOTCOPYPEN | Пиксель – это инверсированный цвет пера. |
R2_NOTMASKPEN | Пиксель – это инверсированный цвет R2_MASKPEN. |
R2_NOTMERGEPEN | Пиксель – это инверсированный цвет R2_MERGEPEN. |
R2_NOTXORPEN | Пиксель – это инверсированный цвет R2_XORPEN. |
R2_WHITE | Пиксель белого цвета. |
R2_XORPEN | Пиксель – это комбинация цвета пера и цвета эрана, но не обоих. |
|
|
7). COLORREF
8). COLORREF RGB (BYTE red , BYTE gr, Byte blue)
|
|
9). Методы
- InvalidateRect Указывает прямоугольник для перерисовки окна:
- BOOL InvalidateRect- ( - HWND hWnd, // указатель на окно- CONST RECT *lpRect, // прямоугольник перерисовки- BOOL bErase // режим перерисовки- );
- Функция ShowWindow() устанавливает режим отображения окна:
- BOOL ShowWindow- ( - HWND hWnd, // указатель на окно- int nCmdShow // режим- );- Функция UpdateWindow() обновляет клиентскую область указанного окна, посылая WM_PAINT сообщение к окну. Функция посылает WM_PAINT сообщение непосредственно процедуре указанного окна, обходя прикладную очередь.
- BOOL UpdateWindow- ( - HWND hWnd // указатель на окно- );
Задание
Для выполнения работы создать приложение Win32 Project (в Microsoft Visual Studio).
1. Закрасить окно приложения основным (преобладающим) цветом рабочего стола и нарисовать на нем геометрические фигуры и надписи (по событию WM_PAINT).
2. На рабочем столе, в рабочей области окна приложения и на поверхности окна приложения нарисовать флаг России.
3. В окне чужой программы (эту программу можно создать на С#, разместив в ее окне управляющие компоненты) и на рабочем столе нарисовать круг, движущийся по окну. Сравнить работу программы при рисовании в рабочей области окна, на поверхности окна и на рабочем столе. Программу написать в двух вариантах:
|
|
- с использованием функций: InvalidateRect и UpdateWindow;
- с использованием различных режимов рисования (SetROP2).
В отчет по лабораторной работе следует включить программный код (в соответствии с пунктами задания) с текстовым описанием и подробными комментариями.
1.
HWND dsk_wnd = GetDesktopWindow();
HDC dsk_hdc = GetDC(dsk_wnd);
RECT dsktp_rect;
int s = 0;
int sn = 0;
int r = 0;
int g = 0;
int b = 0;
GetWindowRect(dsk_wnd, &dsktp_rect);
COLORREF cur_col;
// получение преобладающего цвета рабочего стола
for(int i = 0;i<dsktp_rect.right;i+=100)
for (int j = 0; j < dsktp_rect.bottom; j+=100) {
s++;
cur_col = GetPixel(dsk_hdc, i, j);
r += GetRValue(cur_col);
g += GetGValue(cur_col);
b += GetBValue(cur_col);
}
r = int(r/s);
g = int(g / s);
b = int(b / s);
COLORREF main_col = RGB(r, g, b);
ReleaseDC(dsk_wnd,dsk_hdc);
HPEN my_pen = CreatePen(PS_DASHDOT, 5, RGB(0, 255, 0));
SelectObject(hdc,my_pen);
SelectObject(hdc, (HBRUSH)CreateSolidBrush(RGB(255, 0, 0)));
RECT wnd_rect;
GetWindowRect(hWnd,&wnd_rect);
wnd_rect.top = 0;
wnd_rect.left = 0;
FillRect(hdc,&wnd_rect, (HBRUSH)CreateSolidBrush(main_col));
Ellipse(hdc, 100, 100, 200, 200);
LineTo(hdc, 200, 200);
SetBkColor(hdc,main_col);
SetTextColor(hdc,RGB(255,255,0));
TextOut(hdc,400,100,TEXT("my text"),8);
2.
HDC cur_hdc;
HPEN my_pen;
cur_hdc = GetDC(hWnd);
my_pen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
SelectObject(cur_hdc, my_pen);
SelectObject(cur_hdc, (HBRUSH)CreateSolidBrush(RGB(255, 255, 255)));
Rectangle(cur_hdc, 400, 0, 600, 25);
SelectObject(cur_hdc, (HBRUSH)CreateSolidBrush(RGB(0, 0, 255)));
Rectangle(cur_hdc, 400, 25, 600, 50);
SelectObject(cur_hdc, (HBRUSH)CreateSolidBrush(RGB(255, 0, 0)));
Rectangle(cur_hdc, 400, 50, 600, 75);
ReleaseDC(hWnd, cur_hdc);
cur_hdc = GetWindowDC(hWnd);
my_pen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
SelectObject(cur_hdc, my_pen);
SelectObject(cur_hdc, (HBRUSH)CreateSolidBrush(RGB(255, 255, 255)));
Rectangle(cur_hdc, 0, 0, 200, 25);
SelectObject(cur_hdc, (HBRUSH)CreateSolidBrush(RGB(0, 0, 255)));
Rectangle(cur_hdc, 0, 25, 200, 50);
SelectObject(cur_hdc, (HBRUSH)CreateSolidBrush(RGB(255, 0, 0)));
Rectangle(cur_hdc, 0, 50, 200, 75);
ReleaseDC(hWnd, cur_hdc);
HWND dsk_wnd = GetDesktopWindow();
cur_hdc = GetDC(dsk_wnd);
my_pen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
SelectObject(cur_hdc, my_pen);
SelectObject(cur_hdc, (HBRUSH)CreateSolidBrush(RGB(255, 255, 255)));
Rectangle(cur_hdc, 0, 0, 200, 25);
SelectObject(cur_hdc, (HBRUSH)CreateSolidBrush(RGB(0, 0, 255)));
Rectangle(cur_hdc, 0, 25, 200, 50);
SelectObject(cur_hdc, (HBRUSH)CreateSolidBrush(RGB(255, 0, 0)));
Rectangle(cur_hdc, 0, 50, 200, 75);
ReleaseDC(dsk_wnd, cur_hdc);
3.
case IdCclW: {
HWND hCurWnd = FindWindow(NULL, _T("Form1"));
HDC cur_dc = GetDC(hCurWnd);
SelectObject(cur_dc, (HBRUSH)CreateSolidBrush(RGB(250, 250, 250)));
for (int i = 1; i <= 100; i++) {
RECT inv_rect;
inv_rect.top = i-25;
inv_rect.left = i-25;
inv_rect.bottom = i + 75;
inv_rect.right = i + 75;
InvalidateRect(hCurWnd,&inv_rect,true);
UpdateWindow(hCurWnd);
Ellipse(cur_dc, i, i, i + 50, i + 50);
Sleep(5);
}
ReleaseDC(hCurWnd,cur_dc);
}
break;
case IdCW: {
HWND hCurWnd = FindWindow(NULL, _T("Form1"));
HDC cur_dc = GetWindowDC(hCurWnd);
RECT inv_rect;
inv_rect.top = 0;
inv_rect.left = 200;
inv_rect.bottom = 160;
inv_rect.right = 360;
SelectObject(cur_dc, (HBRUSH)CreateSolidBrush(RGB(250, 0, 0)));
for (int i = 25; i <= 100; i+=5) {
InvalidateRect(hCurWnd, &inv_rect, true);
UpdateWindow(hCurWnd); Sleep(300);
Ellipse(cur_dc, i+200, i, i + 250, i + 50);
// Sleep(5);
}
ReleaseDC(hCurWnd, cur_dc);
}
break;
case IdCdB: {
HWND hCurWnd = GetDesktopWindow();;
HDC cur_dc = GetWindowDC(hCurWnd);
SelectObject(cur_dc, (HBRUSH)CreateSolidBrush(RGB(250, 250, 250)));
for (int i = 26; i <= 100; i++) {
RECT inv_rect;
inv_rect.top = i - 25;
inv_rect.left = i - 25;
inv_rect.bottom = i + 75;
inv_rect.right = i + 75;
InvalidateRect(hCurWnd, &inv_rect, true);
UpdateWindow(hCurWnd);
Ellipse(cur_dc, i+200, i, i + 250, i + 50);
//Sleep(5);
}
ReleaseDC(hCurWnd, cur_dc);
}
Дата добавления: 2018-04-05; просмотров: 251; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!