В отчет по лабораторной работе следует включить программный код (в соответствии с пунктами задания) с текстовым описанием и подробными комментариями

Лабораторная работа 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; Мы поможем в написании вашей работы!

Поделиться с друзьями:




Мы поможем в написании ваших работ!