- •Лекция 6
- •Графический вывод в окно
- •Сообщение WM_PAINT
- •Структура PAINTSTRUCT описана следующим образом: typedef struct{
- •Функции получения и освобождения контекста устройства
- •Пример
- •Вывод в окно (1 вариант) case WM_PAINT:{ PAINTSTRUCT ps;
- •Принудительное обновление окна
- •Пример
- •Обработчики нажатия клавиш мыши: case WM_LBUTTONDOWN:{
- •Виды контекста отображения
- •Общий контекст отображения отличает высшая скорость работы доступа к нему. Для получения этого
- •Контекст отображения для класса окон создается для всех окон определенного класса. Для этого
- •Личный контекст отображения определяется для окно со стилем CS_OWNDC. Его получают один раз
- •Функции установки атрибутов
- •Функция установки режима рисования: int SetROP2(HDC hdc, int fnDrawMode);
- •Функция установки цвета текста:
- •Функция создания сплошной кисти: HBRUSH CreateSolidBrush(COLORREF crColor);
- •Функция выбора в контекст созданного объекта: HGDIOBJ SelectObject(HDC hdc, HGDIOBJ hgdiobj); Возвращает дескриптор
- •Функция создания пера:
- •Функция установки позиции пера:
- •Функция смены режима отображения: int SetMapMode(HDC hdc, int fnMapMode);
- •Настройка параметров шрифта
- •Функции вывода текста
- •Функции рисования
- •Функция рисования дуги эллипса или окружности:
- •Функция рисования ломаной: BOOL PolyLine(
- •Функция рисования прямоугольника:
- •Функция рисования прямоугольника с закругленными углами: BOOL RoundRect(
- •Функция рисования закрашенного прямоугольника:
- •Функция рисования эллипса:
- •Функция рисования сегмента эллипса: BOOL Chord(
- •Функция рисования сектора эллипса: BOOL Pie(
- •Функция рисования полигона:
- •Пример
- •int regWin(HINSTANCE hInstance){ WNDCLASS wc;
- •int _stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
- •Более подробно о рисовании в WinAPI:
Функция рисования эллипса:
BOOL Ellipse(HDC hdc, // идентификатор контекста отображения int nxTL, // координата x верхнего левого угла
int nyTL, // координата y верхнего левого угла int nxBR, // координата x правого нижнего угла int nyBR ); // координата y правого нижнего угла
Функция рисования сегмента эллипса: BOOL Chord(
HDC hdc, // идентификатор контекста отображения int nxLeft, int nyTop, // верхий левый угол
int nxRight, int nyBottom, // правый нижний угол int nxStart, int nyStart, // начало дуги
int nxEnd, int nyEnd); // конец дуги
Функция рисования сектора эллипса: BOOL Pie(
HDC hdc, // идентификатор контекста отображения int nxLeft, int nyTop, // верхний левый угол
int nxRight, int nyBottom, // правый нижний угол int nxStart, int nyStart, // начало дуги
int nxEnd, int nyEnd); // конец дуги
Функция рисования полигона:
BOOL Polygon( |
|
HDC hdc, |
// идентификатор контекста отображения |
const POINT FAR* lppt,// указатель на массив структур POINT int cPoints); // размер массива
Пример
Программа создает окно, в котором на синем фоне выводится красный текст «Привет!!!». Кроме того, на экран выводится черная прямоугольная рамка, внутри которой находится прямоугольник с цветным фоном и наклонной клетчатой штриховкой.
#include <windows.h>
LRESULT _stdcall WndProc(HWND hWnd, UINT massege, WPARAM wParam, LPARAM IParam);
BOOL regWin(HINSTANCE hInstance);
int regWin(HINSTANCE hInstance){ WNDCLASS wc;
wc.style = CS_OWNDC; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(6); wc.lpszMenuName = 0;
wc.lpszClassName = "class"; RegisterClass(&wc);
return 1;
}
LRESULT _stdcall WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_DESTROY: PostQuitMessage(0); return 0;
default:
return DefWindowProc(hWnd, msg, wParam, lParam);
}
}
int _stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
regWin(hInstance);
HWND hWnd = CreateWindow("class", "GDI", WS_OVERLAPPEDWINDOW, 100, 100, 320, 340, NULL, NULL, hInstance, NULL);
ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd);
MSG msg;
HDC hDC = GetDC(hWnd); Rectangle(hDC, 50, 50, 250, 250);
HBRUSH brush = CreateHatchBrush(HS_DIAGCROSS, RGB(100,100,0)); SetBkColor(hDC,RGB(150,150,100));
RECT FllRct = {60,60,240,240}; FillRect(hDC,&FllRct,brush);
SetTextColor(hDC,RGB(255,0,0));
SetBkColor(hDC,RGB(0,0,255));
char str[] = "Привет!!!"; int len = sizeof(str) - 1; TextOut(hDC, 5, 5, str, len);
ReleaseDC(hWnd, hDC);
while(GetMessage(&msg, 0, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg);
}
return 0;}
Более подробно о рисовании в WinAPI:
http://www.frolov-lib.ru/books/bsp/v14/index.html