Как изменить цвет кисти winapi

Как поменять характеристики кисти? C++ WinAPI Решение и ответ на вопрос 1638807
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

Можно также воспользоваться функцией

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

Понравилась статья? Поделить с друзьями:
  • Как изменить цвет кирпича пропиткой
  • Как изменить цвет керамогранита
  • Как изменить цвет керамической плитки на полу
  • Как изменить цвет керамической плитки на кухне
  • Как изменить цвет кепки