1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
// Hello2.cpp #include "stdafx.h" #include <windows.h> LRESULT CALLBACK WinFun(HWND, UINT, WPARAM, LPARAM); char WinName[] = "Мое окно"; // Имя класса окна int WINAPI WinMain(HINSTANCE hIns, HINSTANCE hPrevIns, LPSTR arg, int WinMode) { HWND hwnd; // Дескриптор окна MSG msg; // Содержит инф. о сообщении, посылаемом Windows WNDCLASSEX wcl; // Определяет класс окна // Определение класса окна wcl.hInstance = hIns; // Дескриптор данного экземпляра wcl.lpszClassName = WinName; //Имя класса wcl.lpfnWndProc = WinFun; //Функция окна wcl.style = 0; //стиль по умолчанию wcl.cbSize = sizeof(WNDCLASSEX); //Размер структуры wcl.hIcon = LoadIcon(NULL, IDI_APPLICATION); //Большая пиктограмма 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( WinName, // Имя класса окна "Мое простое окно", // Заголовок WS_OVERLAPPEDWINDOW, // Стандартное окно CW_USEDEFAULT, // Координата X- определяется Windows CW_USEDEFAULT, // Координата Y- определяется Windows CW_USEDEFAULT, // ширина- определяется Windows CW_USEDEFAULT, // высота- определяется Windows HWND_DESKTOP, // Родительского окна нет NULL, // Меню нет hIns, // дескриптор данного экземпляра приложения NULL); // дополнительных аргументов нет // Отображение окна ShowWindow(hwnd, WinMode); UpdateWindow(hwnd); // Цикл сообщений while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); // Разрешает использование клавиатуры DispatchMessage(&msg); } return msg.wParam; } // Эта функция вызывается Windows, которая передает ей сообщение // из очереди сообщений struct Line { int x1, x2, y1, y2; }; struct LineList // Список линий { Line L; LineList *pNext; }; LineList *pFirst = 0, *p; void add(LineList *&pF, LineList *p) { // Добавляем элемент в начало списка p->pNext = pF; pF = p; } int x1, x2, y1, y2; HPEN pW; HBRUSH pB; LRESULT CALLBACK WinFun(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; switch (message) { case WM_CREATE: pB = (HBRUSH)GetStockObject(BLACK_PEN); pW = (HPEN)GetStockObject(WHITE_PEN); break; case WM_RBUTTONDOWN: x2 = x1 = LOWORD(lParam); y2 = y1 = HIWORD(lParam); break; case WM_MOUSEMOVE: if (wParam & MK_RBUTTON) // Определяем нажата ли правая кнопка мыши { hdc = GetDC(hwnd); SelectObject(hdc, pW); MoveToEx(hdc, x1, y1, (LPPOINT)NULL); LineTo(hdc, x2, y2); x2 = LOWORD(lParam); y2 = HIWORD(lParam); SelectObject(hdc, pB); MoveToEx(hdc, x1, y1, (LPPOINT)NULL); LineTo(hdc, x2, y2); ReleaseDC(hwnd, hdc); } break; case WM_RBUTTONUP: // Отпускаем правую кнопку мыши p = new LineList; p->L.x1 = x1; p->L.x2 = x2; p->L.y1 = y1; p->L.y2 = y2; add(pFirst, p); break; case WM_PAINT: // Перерисовка hdc = BeginPaint(hwnd, &ps); p = pFirst; while (p)// Прсматриваем спикок и рисуем линии { MoveToEx(hdc, p->L.x1, p->L.y1, (LPPOINT)NULL); LineTo(hdc, p->L.x2, p->L.y2); p = p->pNext; } EndPaint(hwnd, &ps); break; case WM_DESTROY: // Завершение программы PostQuitMessage(0); break; default: // Позволяет Windows обрабатывать любые сообщения, // не указанные в предыдущем случае return DefWindowProc(hwnd, message, wParam, lParam); } return 0; } |
Для рисования графических примитивов в оконных приложениях используются 4 основных типа объектов:
- точка (Pixel);
- перо (Pen);
- кисть (Brush);
- фон (Background).
Точка
Цвет точки задается с помощью функции
COLORREF SetPixel(
_In_ HDC hdc, // дескриптор контекста устройства
_In_ int X, // x-координата точки
_In_ int Y, // y-координата точки
_In_ COLORREF crColor ); // цвет точки
В случае удачного завершения возвращаемое значение функции дублирует цвет точки, в случае ошибки возвращает -1.
Цвет точки представляет собой 32-битное число, заданное в системе RGB:
Можно также воспользоваться функцией
RGB(
_ Red As Integer, // красный
_ Green As Integer, // зеленый
_ Blue As Integer); // синий
Значения красного, зеленого и синего используются в диапазоне 0…255.
Перо
Перо используется для рисования линий и контуров замкнутых фигур. Цвет пера задается функцией
HPEN CreatePen(
_In_ int fnPenStyle, // стиль пера
_In_ int nWidth, // ширина пера (в пикселях)
_In_ COLORREF crColor ); // цвет пера
Стили пера fnPenStyle могут быть заданы согласно таблице
При успешном завершении функция возвращает дескриптор пера, в случае неудачи — константу NULL.
Кисть
Кисть используется для закрашивания замкнутых объектов. Цвет кисти задается с помощью функции
HBRUSH CreateSolidBrush(
_In_ COLORREF crColor ); // цвет кисти
При успешном завершении функция возвращает дескриптор кисти, в случае неудачи — константу NULL.
Эта же функция используется для задания цвета фона.
Можно заранее создать несколько кистей и перьев, а затем выбирать нужные с помощью функции
HGDIOBJ SelectObject(
_In_ HDC hdc, // дескриптор контекста устройства
_In_ HGDIOBJ hgdiobj ); // дескриптор объекта
Рисование графических примитивов
Перемещение в указанную точку осуществляется функцией:
BOOL MoveToEx(
_In_ HDC hdc, // дескриптор контекста устройства
_In_ int X, // координата x точки
_In_ int Y, // координата y точки
_Out_ LPPOINT lpPoint ); // указатель на структуру POINT
Координаты точки x и у определяются в пикселях относительно левого верхнего угла.
В случае успешного выполнения возвращает ненулевое значение.
Структура POINT имеет вид
typedef struct tagPOINT {
LONG x;
LONG y; } POINT, *PPOINT;
Рисование отрезков осуществляется функцией:
BOOL LineTo(
_In_ HDC hdc, // дескриптор контекста устройства
_In_ int nXEnd, // координата x конечной точки
_In_ int nYEnd ); // координата y конечной точки
В случае успешного выполнения возвращает ненулевое значение.
Рисование прямоугольника осуществляется функцией:
BOOL Rectangle(
_In_ HDC hdc, // дескриптор контекста устройства
_In_ int nLeftRect, // x-координата верхнего левого угла
_In_ int nTopRect, // y-координата верхнего левого угла
_In_ int nRightRect, // x-координата нижнего правого угла
_In_ int nBottomRect); // координата нижнего правого угла
Рисование прямоугольника начинается из точки, в которую осуществлено перемещение с помощью функции MoveTo().
В случае успешного выполнения возвращает ненулевое значение.
Рисование эллипса осуществляется функцией:
BOOL Ellipse(
_In_ HDC hdc, // дескриптор контекста устройства
_In_ int nLeftRect, // x-координата верхнего левого угла
_In_ int nTopRect, // y-координата верхнего левого угла
_In_ int nRightRect, // x-координата нижнего правого угла
_In_ int nBottomRect); // координата нижнего правого угла
В случае успешного выполнения возвращает ненулевое значение.
Рисование дуги осуществляется функцией:
BOOL ArcTo(
_In_ HDC hdc, // дескриптор контекста устройства
_In_ int nLeftRect, // x-координата верхнего левого угла
_In_ int nTopRect, // y-координата верхнего левого угла
_In_ int nRightRect, // x-координата нижнего правого угла
_In_ int nBottomRect, // y-координата нижнего правого угла
_In_ int nXRadial1, // x- координата конца первого радиуса
_In_ int nYRadial1, // y- координата конца первого радиуса
_In_ int nXRadial2, // x- координата конца второго радиуса
_In_ int nYRadial2 ); // y- координата конца второго радиуса
В случае успешного выполнения возвращает ненулевое значение.
Вывод текста в окно
Для вывода текста в поле окна используется функция
BOOL TextOut(
_In_ HDC hdc, // дескриптор контекста устройства
_In_ int nXStart, // x-координата начала вывода текста
_In_ int nYStart, // y-координата начала вывода текста
_In_ LPCTSTR lpString, // указатель на строку текста
_In_ int cchString ); // количество символов для вывода
В случае успешного выполнения возвращает ненулевое значение.
Задать цвет фона под буквами можно с помощью функции
COLORREF SetBkColor(
_In_ HDC hdc, // дескриптор контекста устройства
_In_ COLORREF crColor ); // цвет
Задать цвет букв можно с помощью функции
COLORREF SetЕTextColor(
_In_ HDC hdc, // дескриптор контекста устройства
_In_ COLORREF crColor ); // цвет
В случае неудачного завершения эти функции возвращают константу CLR_INVALID=0xFFFF.
Использование графических функций
Для перерисовки окна, в котором будут отображаться графические объекты, будем использовать обработку сообщения WM_PAINT.
Обработка сообщения WM_PAINT почти всегда начинается с вызова функции:
HDC BeginPaint(
_In_ HWND hwnd,
_Out_ LPPAINTSTRUCT lpPaint );
При обработке вызова BeginPaint(), Windows обновляет фон рабочей области с помощью кисти, заданной в поле hbrBackground структуры WNDCLASS, описанной здесь. Вызов BeginPaint() делает всю рабочую область действительной (не требующей перерисовки) и возвращает описатель контекста устройства. Контекст устройства описывает физическое устройство вывода информации (например, экран) и его драйвер. Описатель контекста устройства необходим для вывода в рабочую область окна текста и графики.
Аргументы функции:
- hwnd – дескриптор окна;
- lpPaint – указатель на структуру PAINTSTRUCT.
Структура PAINTSTRUCT имеет вид
typedef struct tagPAINTSTRUCT {
HDC hdc;
BOOL fErase;
RECT rcPaint;
BOOL fRestore;
BOOL fIncUpdate;
BYTE rgbReserved[32]; } PAINTSTRUCT, *PPAINTSTRUCT;
Члены структуры:
- hdc – дескриптор контекста устройства.
- fErase – ненулевое значение стирает фон.
- rcPaint – структура RECT, определяющая верхний левый и нижний правый углы рабочей области.
typedef struct _RECT {
LONG left; LONG top;
LONG right; LONG bottom; } RECT, *PRECT; - fRestore, fIncUpdate, rgbReserved – зарезервировано, используется системой.
Обработка сообщения WM_PAINT почти всегда заканчивается вызовом функции:
BOOL EndPaint(
_In_ HWND hWnd,
_In_ const PAINTSTRUCT *lpPaint );
Функция EndPaint() освобождает описатель контекста устройства, после чего его значение нельзя использовать. Возвращает всегда ненулевое значение.
Получение дескриптора контекста устройства осуществляется вызовом функции:
HDC GetDC(_In_ HWND hWnd);
hWnd – дескриптор окна, для которого используется контекст устройства.
Возвращаемое значение – дескриптор контекста устройства.
Функция
int ReleaseDC(
_In_ HWND hWnd,
_In_ HDC hDC );
освобождает контекст устройства hDC для данного окна hWnd, после чего значение контекста устройства нельзя использовать. Возвращает всегда ненулевое значение.
Пример График функции y=sin(x).
Назад: Создание Windows-приложений
Кисти
Кисти
CreatePatternBrush
Функция CreatePatternBrush создает логическую кисть с указанным шаблоном в виде битового изображения. Битовое изображение не может быть независимым от оборудования битовым изображением ( DIB ), которое создано функцией CreateDIBSection .
HBRUSH CreatePatternBrush (
HBITMAP hbmp // дескриптор битового изображения
);
Параметры
hbmp — идентифицирует битовый образ, используемый для создания логической кисти.
Windows 95: Создание кистей из битовых образов размером более 8 x 8 пикселей не поддерживается. Если указан битовый образ большего размера, используется его часть.
Возвращаемые значения
В случае успеха возвращается дескриптор логической кисти.
В случае неудачи возвращается NULL .
Комментарии
Шаблонная кисть — это битовый образ, который Windows использует для рисования внутренних частей закрашенных фигур.
После того, как приложение создало кисть, вызвав функцию CreatePatternBrush , оно может выбрать эту кисть в любой контекст устройства при помощи функции SelectObject .
Вы можете удалить шаблонную кисть без воздействия на связанный битовый образ, используя функцию DeleteObject . Таким образом, вы можете использовать этот битовый образ для создания какого угодно числа шаблонных кистей.
Кисть, созданная с использованием монохромного битового образа, имеет цвета текста и фона того контекста устройства, в котором происходит рисование. Пиксели, представляемые нулевым битом, отрисовываются текущим цветом текста; пиксели, представляемые единичным битом, отрисовываются текущим цветом фона.
Битовое изображение, идентифицируемое значением параметра hbmp , не может быть независимым от оборудования битовым изображением ( DIB ), которое создано функцией CreateDIBSection . Если оно является независимым от оборудования битовым изображением, то вызов CreatePatternBrush завершается неудачей.
См. также
CreateBitmap, CreateBitmapIndirect, CreateCompatibleBitmap, CreateDIBPatternBrush, CreateDIBPatternBrushPt, CreateDIBSection, CreateHatchBrush, DeleteObject, GetBrushOrgEx, LoadBitmap, SelectObject, SetBrushOrgEx .
Читайте также
Кисти
Кисти
Начнем с самого классического инструмента – Brush Tool (Кисть). Его месторасположение на панели инструментов отмечено на рис. 3.1.
Рис. 3.1. На панели инструментов выбран инструмент Brush Tool (Кисть)Кисть позволяет нам непосредственно рисовать мышкой. Выделите данный
Панель Brushes (Кисти)
Панель Brushes (Кисти)
Панель Brushes (Кисти) содержит в себе необходимые опции для быстрой, удобной и точной настройки штриха Кисти и остальных инструментов, работающих со штрихом (рис. 4.23).
Рис. 4.23. Панель Brushes (Кисти)Соответственно, содержимое данной панели является активным
Кисти
Кисти
CreatePatternBrush
Функция CreatePatternBrush создает логическую кисть с указанным шаблоном в виде битового изображения. Битовое изображение не может быть независимым от оборудования битовым изображением ( DIB ), которое создано функцией CreateDIBSection . HBRUSH CreatePatternBrush ( HBITMAP hbmp //
Перья и кисти внутри классов
Перья и кисти внутри классов
Рисование перьями и раскрашивание кистямиПеревод А. И. ЛегаловаАнглоязычный оригинал находится на сервере компании Reliable SoftwareПодобно живописцу, Вы нуждаетесь в перьях и кистях, чтобы создать шедевр на вашем холсте. Когда Вы вызываете метод
Стили кисти
Стили кисти
Стили кисти задаются перечислимым типом BrushStyleType:
type BrushStyleType = (bsSolid, bsClear, bsHatch, bsGradient);
Константы имеют следующий смысл:
bsSolid
Сплошная кисть (по умолчанию)
bsClear
Прозрачная кисть
bsHatch
Штриховая кисть
bsGradient
Градиентная кисть
Для всех
Стили штриховки кисти
Стили штриховки кисти
Стили штриховки кисти задаются перечислимым типом HatchStyle. Кроме того, для стилей штриховки кисти определены следующие константы:
9.8. Палитра Brushes (Кисти)
9.8. Палитра Brushes (Кисти)
Как известно, кистью в Photoshop называется не только инструмент, но и своего рода аналог реального изделия. То есть существуют разные наборы кистей со своими свойствами, которые могут использоваться как шаблоны при работе с такими инструментами, как Brush