About Project

Win32 API в простых примерах

Содержание раздела

  • О проекте в целом
  • Как пользоваться справочником
  • Текущая комплектность
  • Участие в проекте

Внимание! Данный справочник должен быть быть в формате .chm и скачан вами лично с сайта http://FastGraphics.narod.ru. Если вы нашли его на любом другом сайте - просьба сообщить об этом мне (fastgraphics@narod.ru). Буду благодарен за брошенный в плагиатора камень.
Объясню почему: Данный справочник содержит множество небольших исполняемых (.exe) файлов-примеров, которые легко могут быть подменены злоумышленником на вредоносные программы.

О проекте в целом

С чем имеем дело

Данный документ является скомпилированным файлом помощи .chm (HTML help). В справочник включены исходники примеров ( .cpp итд) и сами примеры (.exe) использования функций Win32 API, а также, описания функций в русском переводе и оригинальные описания из MSDN (Platform SDK).

Соглашение

Проект "Win32 API в простых примерах" ( файл EasyWinAPISamples v№.chm ) распространяется исключительно с сайта http://FastGraphics.narod.ru для некоммерческого использования в обучающих целях. Никакая часть данного проекта (файла, справочника) не может быть изменена (декомпилирована) и распространяться из любых других источников кроме вышеуказанного сайта без письменного согласия автора. Любое коммерческое использование осуществляется с письменным согласием автора с изменённым им видом проекта, содержанием проекта и соглашением использования проекта. При этом разрешается использовать исходный код примеров по своему усмотрению, кроме включения в справочники подобного рода.

Автор проекта не несёт никакой ответственности за приченённый материальный или моральный вред, явившийся следствием использования данного проекта. Вы используете настоящее ПО и справочную информацию на условиях "как есть" на свой страх и риск.

Настоящее соглашение может быть изменено только автором проекта в одностороннем порядке.

В случае вашего несогласия с вышеизложенным соглашением вам запрещается использовать в любом виде данное ПО кроме его удаления или перемещения в корзину.

Ну и конечно, в ходе работы над проектом не пострадало ни одно животное за исключением комаров и мух.

Зачем нужен этот справочник

На создание этого справочника меня подтолкнуло практически полное отсутствие в MSDN примеров использования функций, и полное их (функций) нежелание работать правильно что называется "сходу". Кто с этим столкнулся, тот меня поймёт.

Таким образом, такой мощный и практически единственный инструмент необъектного программирования под Windows остаётся непринятым и непонятым многими программистами в силу своей недостаточной освещённости. Почему недостаточной ? Возьмите самый толстый учебник по WinAPI - вы там не найдёте и пол процента описания возможностей, которые дают функции. Очень удивляет скупость на примеры разработчиков Platform SDK.

В отличии от языка ( чтобы выучить который, надо писать на нём программы), единственный способ познакомиться с WinAPI (ИМХО)- смотреть, как "оно работает" на конкретных примерах программ. Тем более, что отдельно взятая функция ничего не даёт - для достижения требуемого эффекта нужно вызывать нехилый набор функций, применение каждой из которых имеет свои ньюансы. Вопрос о рациональности применения той или иной функции требует как минимум знания существующих альтернативных функций. Простые примеры этого справочника наглядно демонстрируют приёмы программирования на WinAPI.

Нужен ли справочник подобного рода ? НЕТ - по мнению Microsoft (иначе они бы его написали). ДА - ИМХО. А вы как считаете ? Выскажете своё мнение в опросе на сайте.

Состав справочника

  • Исходный код примера. Центральная часть проекта. Здесь я постарался написать одно или несколько простых приложений, демонстрирующих приёмы работы с функциями.
  • Исполняемый файл. Лучше один раз увидеть, чем сто раз перекомпилировать с разными параметрами - да, ComboBox и другие контролы зададут функции возможные параметры, наглядно демонстрируя что может, а что не может эта функция.
  • Описание функции на русском и английском - кому как нравится. А может я не так перевёл - сверьтесь с английской версией, или учите msdn-инглишь: вот текст, а вот - перевод.

Как пользоваться справочником

Поиск нужной функции и примера её использования может осуществлять:

  • C вкладки "Содержание"(Contents) - выбирая соответствующий раздел из дерева, одним щелчком;
  • С вкладки "Указатель"(Index) - набирая имя функции в поле "Ключевое слово"(Keyword) двойным щелчком;
  • В будущем планируется включить вкладку "Поиск"(Search).

Русское описание, английское описание, и примеры использования содержатся на одной html-странице. Для отображения нужной вкладки щёлкните по соответствующему значку в шапке страницы:

  • "RU" - переведенный мною текст описания функции
  • "EN" - английский документальный оригинал из MSDN online
  • "имя_примера" - простой (а-ля hello,world - и потому ИМХО понятный), но полный (показаны все необходимые для успешной компиляции исходные файлы) пример использования данной функции.

Вы встретите, гуляя по ссылкам, пустые страницы (Dolly -кукла). Сделаны они для того, чтобы не появлялось "The page cannot be displayed" и страница 404 на яндексе.

Текущая комплектность

На данный момент в справочнике даны русские переводы описания и примеры 39 функций Win32 API и 6 структур (без примеров).

Закончены следующие разделы (пока только Windows GDI):

  • Заливаемые Фигуры
  • Кисти
  • Линии и Кривые
  • Перья

Если не будет принципиальных возражений и пожеланий, в разработку взят раздел Шрифты и текст (Fonts and Text).

Руководящий принцип проекта - КОМПЛЕКТНОСТЬ, т.е каждый взятый в разработку раздел ,будет закончен полностью, и только после этого включён в .chm (off-line) справочник.

Каждый новый разработанный пример будет немедленно выложен на моём сайте в on-line, так что, следите за обновлениями.

Участие в проекте

Проект открытый, к участию в переводе функций и разработке примеров приглашаются все желающие. Пока что проект держится на чистом энтузиазме, в будущем - кто знает...

Пишите!


Chord

Chord

Функция Chord рисует хорду (регион, ограниченный эллипсом и отрезком линии, называемым секущим). Хорда очерчивается с использованием текущего пера и заливается текущей кистью.

BOOL Chord(
  HDC hdc,         // хэндл DC
  int nLeftRect,   // x-координата левого верхнего угла прямоугольника
  int nTopRect,    // y-координата левого верхнего угла прямоугольника
  int nRightRect,  // x-координата правого нижнего угла прямоугольника
  int nBottomRect, // y-координата правого нижнего угла прямоугольника
  int nXRadial1,   // x-координата первой радиальной конечной точки
  int nYRadial1,   // y-координата первой радиальной конечной точки
  int nXRadial2,   // x-координата второй радиальной конечной точки
  int nYRadial2    // y-координата второй радиальной конечной точки
);

Параметры

hdc
[in] Хэндл контекста устройства, в котором появляется хорда.
nLeftRect
[in] Указывает x-координату, в логических координатах, левого верхнего угла ограничивающего прямоугольника.
nTopRect
[in] Указывает y-координату, в логических координатах, левого верхнего угла ограничивающего прямоугольника.
nRightRect
[in] Указывает x-координату, в логических координатах, правого нижнего угла ограничивающего прямоугольника.
nBottomRect
[in] Указывает y-координату, в логических координатах, правого нижнего угла ограничивающего прямоугольника.
nXRadial1
[in] Указывает x-координату, в логических координатах, конечной точки радиально определённого начала хорды.
nYRadial1
[in] Указывает y-координату, в логических координатах, конечной точки радиально определённого начала хорды.
nXRadial2
[in] Указывает x-координату, в логических координатах, конечной точки радиально определённого конца хорды.
nYRadial2
[in] Указывает y-координату, в логических координатах, конечной точки радиально определённого конца хорды.

Возврат значения

Если функция успешна, возвращаемое значение не ноль.

Если функция не успешна, возвращаемое значение ноль.

Windows NT/2000/XP: Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Замечания

Кривая хорды определена по эллипсу, который соответствует ограничивающему прямоугольнику. Кривая начинается в точке, где эллипс пересекает первый радиальный луч и продолжается против часовой стрелки до точки, где эллипс пересекает второй радиальный луч. Хорда замыкается отрезком линии из точки пересечения первого радиального луча с кривой до точки пересечения второго радиального луча и кривой.

Если начальная и конечная точки кривой совпадают, рисуется полный эллипс.

Текущая позиция никогда не используется и не изменяется использованием функции Chord.

Windows 95/98/Me: Сумма координат ограничивающего прямоугольника не должна быть более 32,767. Сумма параметров nLeftRect и nRightRect или nTopRect и nBottomRect не должна превышать 32,767.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.
Библиотека: Используйте Gdi32.lib.

См. так же

AngleArc | Arc | ArcTo | Pie

Chord

The Chord function draws a chord (a region bounded by the intersection of an ellipse and a line segment, called a secant). The chord is outlined by using the current pen and filled by using the current brush.

BOOL Chord(
  HDC hdc,         // handle to DC
  int nLeftRect,   // x-coord of upper-left corner of rectangle
  int nTopRect,    // y-coord of upper-left corner of rectangle
  int nRightRect,  // x-coord of lower-right corner of rectangle
  int nBottomRect, // y-coord of lower-right corner of rectangle
  int nXRadial1,   // x-coord of first radial's endpoint
  int nYRadial1,   // y-coord of first radial's endpoint
  int nXRadial2,   // x-coord of second radial's endpoint
  int nYRadial2    // y-coord of second radial's endpoint
);

Parameters

hdc
[in] Handle to the device context in which the chord appears.
nLeftRect
[in] Specifies the x-coordinate, in logical coordinates, of the upper-left corner of the bounding rectangle.
nTopRect
[in] Specifies the y-coordinate, in logical coordinates, of the upper-left corner of the bounding rectangle.
nRightRect
[in] Specifies the x-coordinate, in logical coordinates, of the lower-right corner of the bounding rectangle.
nBottomRect
[in] Specifies the y-coordinate, in logical coordinates, of the lower-right corner of the bounding rectangle.
nXRadial1
[in] Specifies the x-coordinate, in logical coordinates, of the endpoint of the radial defining the beginning of the chord.
nYRadial1
[in] Specifies the y-coordinate, in logical coordinates, of the endpoint of the radial defining the beginning of the chord.
nXRadial2
[in] Specifies the x-coordinate, in logical coordinates, of the endpoint of the radial defining the end of the chord.
nYRadial2
[in] Specifies the y-coordinate, in logical coordinates, of the endpoint of the radial defining the end of the chord.

Return Values

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero.

Windows NT/2000/XP: To get extended error information, call GetLastError.

Remarks

The curve of the chord is defined by an ellipse that fits the specified bounding rectangle. The curve begins at the point where the ellipse intersects the first radial and extends counterclockwise to the point where the ellipse intersects the second radial. The chord is closed by drawing a line from the intersection of the first radial and the curve to the intersection of the second radial and the curve.

If the starting point and ending point of the curve are the same, a complete ellipse is drawn.

The current position is neither used nor updated by Chord.

Windows 95/98/Me: The sum of the coordinates of the bounding rectangle cannot exceed 32,767. The sum of nLeftRect and nRightRect or nTopRect and nBottomRect parameters cannot exceed 32,767.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

See Also

AngleArc | Arc | ArcTo | Pie

Описание примера Chord

В обработке события WM_CREATE создаётся кисть вызовом функции CreateSolidBrush; при завершении программы кисть удаляется вызовом функции DeleteObject.

В обработке события WM_PAINT:

  • созданная в событии WM_CREATE кисть выбирается в контекст устройства вызовом функции SelectObject;
  • вызывается функция Chord, отрисовывающая хорду и закрашивающая её текущей кистью.

Внешний вид примера Chord

Chord
достать/запустить пример Chord.exe

Исходный текст примера Chord

Chord.cpp

#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    static HBRUSH hBrush;
    switch(msg)
    {
    case WM_CREATE:
        hBrush=CreateSolidBrush(0x00ff00ff);
        break;
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        SelectObject(hdc,hBrush);
        Chord(hdc,50,75,150,125,200,0,0,200);
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        DeleteObject(hBrush);
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW|CS_VREDRAW;
    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)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "Chord",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,212, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}

Разработал: | Поздеев А.А.
Проверено: работает | Поздеев А.А.


Ellipse

Ellipse

Функция Ellipse рисует эллипс. Центр эллипса - центр указанного ограничивающего прямоугольника. Эллипс очерчивается текущим пером и заливается текущей кистью.

BOOL Ellipse(
  HDC hdc,        // Хэндл DC
  int nLeftRect,  // x-координата верхнего левого угла прямоугольника
  int nTopRect,   // y-координата верхнего левого угла прямоугольника
  int nRightRect, // x-координата нижнего правого угла прямоугольника
  int nBottomRect // y-координата нижнего правого угла прямоугольника
);

Параметры

hdc
[in] Хэндл контекста устройства.
nLeftRect
[in] Указывает x-координату, в логических координатах, верхнего левого угла ограничивающего прямоугольника.
nTopRect
[in] Указывает y-координату, в логических координатах, верхнего левого угла ограничивающего прямоугольника.
nRightRect
[in] Указывает x-координату, в логических координатах, нижнего правого угла ограничивающего прямоугольника.
nBottomRect
[in] Указывает y-координату, в логических координатах, нижнего правого угла ограничивающего прямоугольника.

Возврат значения

Если функция успешна, возвращаемое значение не ноль.

Если функция неуспешна, возвращаемое значение ноль.

Windows NT/2000/XP: Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Замечания

Текущая позиция никогда не используется и не изменяется функцией Ellipse.

Windows 95/98/Me: Сумма координат ограничивающего прямоугольника не должна превышать 32,767. Сумма параметров nLeftRect и nRightRect или nTopRect и nBottomRect не должна превышать 32,767.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.
Библиотека: Используйте Gdi32.lib.

См. так же

Arc | ArcTo

Ellipse

The Ellipse function draws an ellipse. The center of the ellipse is the center of the specified bounding rectangle. The ellipse is outlined by using the current pen and is filled by using the current brush.

BOOL Ellipse(
  HDC hdc,        // handle to DC
  int nLeftRect,  // x-coord of upper-left corner of rectangle
  int nTopRect,   // y-coord of upper-left corner of rectangle
  int nRightRect, // x-coord of lower-right corner of rectangle
  int nBottomRect // y-coord of lower-right corner of rectangle
);

Parameters

hdc
[in] Handle to the device context.
nLeftRect
[in] Specifies the x-coordinate, in logical coordinates, of the upper-left corner of the bounding rectangle.
nTopRect
[in] Specifies the y-coordinate, in logical coordinates, of the upper-left corner of the bounding rectangle.
nRightRect
[in] Specifies the x-coordinate, in logical coordinates, of the lower-right corner of the bounding rectangle.
nBottomRect
[in] Specifies the y-coordinate, in logical coordinates, of the lower-right corner of the bounding rectangle.

Return Values

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero.

Windows NT/2000/XP: To get extended error information, call GetLastError.

Remarks

The current position is neither used nor updated by Ellipse.

Windows 95/98/Me: The sum of the coordinates of the bounding rectangle cannot exceed 32,767. The sum of nLeftRect and nRightRect or nTopRect and nBottomRect parameters cannot exceed 32,767.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

See Also

Arc | ArcTo

Описание примера Ellipse

В обработке события WM_CREATE создаётся косметическое штриховое перо вызовом функции CreatePenIndirect; при завершении программы перо удаляется вызовом функции DeleteObject.

В обработке события WM_PAINT:

  • Выбирается в контекст устройства запасённая пустая кисть: SelectObject, GetStockObject;
  • Проводится прямая линия пером по умолчанию вызовом пары функций MoveToEx и LineTo;
  • Рисуется эллипс
Программа демонстрирует, как можно не зарисовывать внутреннюю часть фигуры. Обратите внимание, что перо эллипса перечёркивает прямую в точках пересечений.

Внешний вид примера Ellipse

Ellipse
достать/запустить пример Ellipse.exe

Исходный текст примера Ellipse

Ellipse.cpp

#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    static HPEN hPen;
    LOGPEN logpen;
    POINT point;
    switch(msg)
    {
    case WM_CREATE:
        point.x=1;
        logpen.lopnStyle=PS_DASH;
        logpen.lopnWidth=point;
        logpen.lopnColor=0x00ff00ff;
        hPen=CreatePenIndirect(&logpen);
        break;
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        SelectObject(hdc,GetStockObject(HOLLOW_BRUSH));
        MoveToEx(hdc,25,25,NULL);
        LineTo(hdc,175,175);
        SelectObject(hdc,hPen);
        Ellipse(hdc,25,50,175,150);
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        DeleteObject(hPen);
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW|CS_VREDRAW;
    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)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "Ellipse",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,212, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}

Разработал: | Поздеев А.А.


FillRect

FillRect

Функция FillRect заливает прямоугольник, используя указанную кисть. Этой функцией включаются верхняя и левая границы, но исключаются нижняя и правая границы прямоугольника.

int FillRect(
  HDC hDC,           // хэндл DC
  CONST RECT *lprc,  // прямоугольник
  HBRUSH hbr         // хэндл кисти
);

Параметры

hdc
[in] Хэндл контекста устройства.
lprc
[in] Указатель на структуру RECT, содержащую логические координаты заливаемого прямоугольника.
hbr
[in] Хэндл используемой для заливки прямоугольника кисти.

Возврат значения

Если функция успешна, возвращаемое значение не ноль.

Если функция неуспешна, возвращаемое значение ноль.

Windows NT/2000/XP: Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Замечания

Кисть, указанныя в параметре hbr может быть указана либо как хэдер логической кисти, либо значением цвета. Если указанное значение - хэдер логической кисти, для его получения вызовите одну из следущих функций:: CreateHatchBrush, CreatePatternBrush, или CreateSolidBrush. Дополнительно, вы можете получить хэдер одной из запасённых кистей, используя функцию GetStockObject. Если указанное значение - значение цвета в параметре hbr, это должно быть одно из стандартных значений цвета (число 1 должно быть добавлено к выбранному цвету). Например:

FillRect(hdc, &rect, (HBRUSH) (COLOR_WINDOW+1));

Список стандартных системных цветов, см. GetSysColor.

Когда заливается указанный прямоугольник, FillRect не должна содержать правую и нижнюю стороны прямоугольника. GDI заливает прямоугольник вверх, но не включая, правый столбец и нижнюю строку, независимо от текущего режима нанесения.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.
Библиотека: Используйте Gdi32.lib.

См. так же

CreateHatchBrush | CreatePatternBrush | CreateSolidBrush | GetStockObject | RECT

FillRect

The FillRect function fills a rectangle by using the specified brush. This function includes the left and top borders, but excludes the right and bottom borders of the rectangle.

int FillRect(
  HDC hDC,           // handle to DC
  CONST RECT *lprc,  // rectangle
  HBRUSH hbr         // handle to brush
);

Parameters

hDC
[in] Handle to the device context.
lprc
[in] Pointer to a RECT structure that contains the logical coordinates of the rectangle to be filled.
hbr
[in] Handle to the brush used to fill the rectangle.

Return Values

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero.

Windows NT/2000/XP: To get extended error information, call GetLastError.

Remarks

The brush identified by the hbr parameter may be either a handle to a logical brush or a color value. If specifying a handle to a logical brush, call one of the following functions to obtain the handle: CreateHatchBrush, CreatePatternBrush, or CreateSolidBrush. Additionally, you may retrieve a handle to one of the stock brushes by using the GetStockObject function. If specifying a color value for the hbr parameter, it must be one of the standard system colors (the value 1 must be added to the chosen color). For example:

FillRect(hdc, &rect, (HBRUSH) (COLOR_WINDOW+1));

For a list of all the standard system colors, see GetSysColor.

When filling the specified rectangle, FillRect does not include the rectangle's right and bottom sides. GDI fills a rectangle up to, but not including, the right column and bottom row, regardless of the current mapping mode.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

See Also

CreateHatchBrush | CreatePatternBrush | CreateSolidBrush | GetStockObject | RECT

Описание примера FillRect

В обработке события WM_CREATE:

  • Приложение создаёт монохромный битмап вызовом функции CreateBitmap;
  • Создаёт кисть с образцом этого битмапа CreatePatternBrush.

В обработке события WM_PAINT приложение заливает указанную область указанной кистью вызовом функции FillRect.

Созданные кисть и битмап удаляются при закрытии окна.

Внешний вид примера CreatePen

FillRect
достать/запустить пример FillRect.exe

Исходный текст примера FillRect

FillRect.cpp

#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    static HBRUSH hBrush;
    static HBITMAP hBmp;
    static RECT rect={25,40,175,160};
    const WORD bits[16]={0xffef,
                         0xffef,
                         0xffef,
                         0xffef,
                         0xffef,
                         0x0000,
                         0xefff,
                         0xefff,
                         0xefff,
                         0xefff,
                         0xefff,
                         0xefff,
                         0xefff,
                         0x0000,
                         0xffef,
                         0xffef};
    switch(msg)
    {
    case WM_CREATE:
        hBmp=CreateBitmap(16,16,1,1,bits);
        hBrush=CreatePatternBrush(hBmp);
        break;
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        FillRect(hdc,&rect,hBrush);
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE:
        DeleteObject(hBrush);
        DeleteObject(hBmp);
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW|CS_VREDRAW;
    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)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "FillRect",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,212, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}


FrameRect

FrameRect

Функция FrameRect рисует границу вокруг указанного прямоугольника, используя указанную кисть. Ширина и высота границы всегда одна логическая единица.

int FrameRect(
  HDC hDC,           // хэндл DC
  CONST RECT *lprc,  // прямоугольник
  HBRUSH hbr         // хэндл кисти
);

Параметры

hDC
[in] Хэндл контекста устройства, в которых рисуется граница.
lprc
[in] Указатель на структуру RECT, содержащую логические координаты верхнего левого и нижнего правого угла прямоугольника.
hbr
[in] Хэндл кисти, используемой для отрисовки границы.

Возврат значения

Если функция успешна, возвращаемое значение не ноль.

Если функция неуспешна, возвращаемое значение ноль.

Windows NT/2000/XP: Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Замечания

Кисть, определённая в параметре hbr, должна быть создана с использованием функции CreateHatchBrush, CreatePatternBrush, или CreateSolidBrush, или возвращённое функцией GetStockObject.

Если член bottom структуры RECT меньше чем или равен члену top, или, если член right меньше чем или равен члену left, функция не рисует прямоугольник.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.
Библиотека: Используйте Gdi32.lib.

См. так же

CreateHatchBrush | CreatePatternBrush | CreateSolidBrush | GetStockObject | RECT

FrameRect

The FrameRect function draws a border around the specified rectangle by using the specified brush. The width and height of the border are always one logical unit.

int FrameRect(
  HDC hDC,           // handle to DC
  CONST RECT *lprc,  // rectangle
  HBRUSH hbr         // handle to brush
);

Parameters

hDC
[in] Handle to the device context in which the border is drawn.
lprc
[in] Pointer to a RECT structure that contains the logical coordinates of the upper-left and lower-right corners of the rectangle.
hbr
[in] Handle to the brush used to draw the border.

Return Values

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero.

Windows NT/2000/XP: To get extended error information, call GetLastError.

Remarks

The brush identified by the hbr parameter must have been created by using the CreateHatchBrush, CreatePatternBrush, or CreateSolidBrush function, or retrieved by using the GetStockObject function.

If the bottom member of the RECT structure is less than or equal to the top member, or if the right member is less than or equal to the left member, the function does not draw the rectangle.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

See Also

CreateHatchBrush | CreatePatternBrush | CreateSolidBrush | GetStockObject | RECT

Описание примера FrameRect

В обработке события WM_CREATE:

  • Приложение получает хэндл запущеного экземпляра программы вызовом функции GetModuleHandle, он нам понадобится для згрузки битмапа;
  • Загружается битмап из ресурсов выполняющейся программы вызовом функции LoadBitmap;
  • Создаётся кисть с образцом этого битмапа CreatePatternBrush.

В обработке события WM_PAINT вызывается функция FrameRect, рисующая рамку толщиной в 1 логическую единицу указанной кистью.

Кисть не надо выбирать в контекст устройства.

Созданные кисть и битмап удаляются при закрытии окна.

Внешний вид примера FrameRect

FrameRect
достать/запустить пример FrameRect.exe

Исходный текст примера FrameRect

FrameRect.cpp

#include <windows.h>
#include "resource.h"
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    static HINSTANCE hInstance;
    static HBRUSH hBrush;
    static HBITMAP hBmp;
    static RECT rect={60,60,140,140};

    switch(msg)
    {
    case WM_CREATE:
        hInstance=(HINSTANCE)GetModuleHandle(NULL);
        hBmp=LoadBitmap(hInstance,MAKEINTRESOURCE(BITMAP_ID));
        hBrush=CreatePatternBrush(hBmp);
        break;
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        FrameRect(hdc,&rect,hBrush);
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE:
        DeleteObject(hBrush);
        DeleteObject(hBmp);
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW|CS_VREDRAW;
    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)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "FrameRect",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,212, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}

resource.rc

#include "resource.h"
BITMAP_ID BITMAP "ColorRounds.bmp"

resource.h

#define BITMAP_ID 10


InvertRect

InvertRect

Функция InvertRect инвертирует прямоугольник в окне, выполняя логическую операцию NOT со значениями цветов для каждого пикселя во внутренней части прямоугольника.

BOOL InvertRect(
  HDC hDC,           // хэндл DC
  CONST RECT *lprc   // прямоугольник
);

Параметры

hDC
[in] Хэндл контекста устройства.
lprc
[in] Указатель на структуру RECT, которая содержит логические координаты инвертируемого прямоугольника.

Возврат значения

Если функция успешна, возвращаемое значение не ноль.

Если функция неуспешна, возвращаемое значение ноль.

Windows NT/2000/XP: Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Замечания

На монохромном экране, InvertRect делает белые пиксели чёрными и чёрные пиксели белыми. На цветном экране, инвертирование зависит от того, сколько цветов генерирует экран. Вызов InvertRect дважды на один и тот же прямоугольник восстанавливает его первоначальные цвета.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.
Библиотека: Используйте Gdi32.lib.

См. так же

FillRect | RECT

InvertRect

The InvertRect function inverts a rectangle in a window by performing a logical NOT operation on the color values for each pixel in the rectangle's interior.

BOOL InvertRect(
  HDC hDC,           // handle to DC
  CONST RECT *lprc   // rectangle
);

Parameters

hDC
[in] Handle to the device context.
lprc
[in] Pointer to a RECT structure that contains the logical coordinates of the rectangle to be inverted.

Return Values

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero.

Windows NT/2000/XP: To get extended error information, call GetLastError.

Remarks

On monochrome screens, InvertRect makes white pixels black and black pixels white. On color screens, the inversion depends on how colors are generated for the screen. Calling InvertRect twice for the same rectangle restores the display to its previous colors.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

See Also

FillRect | RECT

Описание примера InvertRect

При создании окна в его классе кисть фона создаётся вызовом функции CreatePatternBrush с образцом битмапа, созданного функцией LoadBitmap.

В обработке события WM_PAINT вызывается функция InvertRect, меняющая все цвета в указанном прямоугольнике на обратные.

Внешний вид примера InvertRect

InvertRect
достать/запустить пример InvertRect.exe

Исходный текст примера InvertRect

InvertRect.cpp

#include <windows.h>
#include "resource.h"
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    static RECT rect={25,40,175,160};

    switch(msg)
    {
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        InvertRect(hdc,&rect);
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW|CS_VREDRAW;
    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 = CreatePatternBrush(LoadBitmap(hInstance,MAKEINTRESOURCE(BITMAP_ID)));
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "InvertRect",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,212, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}

resource.rc

#include "resource.h"
BITMAP_ID BITMAP "ColorRounds.bmp"

resource.h

#define BITMAP_ID 10


Pie

Pie

Функция Pie рисует клин в форма пирога, ограниченный пересечением эллипса и двух радиальных лучей. Пирог очерчивается с использованием текущего пера и заливается с использованием текущей кисти.

BOOL Pie(
  HDC hdc,         // хэндл DC
  int nLeftRect,   // x-координата верхнего левого угла прямоугольника
  int nTopRect,    // y-координата верхнего левого угла прямоугольника
  int nRightRect,  // x-координата нижнего правого угла прямоугольника
  int nBottomRect, // y-координата нижнего правого угла прямоугольника
  int nXRadial1,   // x-координата конечной точки первого радиального луча
  int nYRadial1,   // y-координата конечной точки первого радиального луча
  int nXRadial2,   // x-координата конечной точки второго радиального луча
  int nYRadial2    // y-координата конечной точки второго радиального луча
);

Параметры

hdc
[in] Хэндл контекста устройства.
nLeftRect
[in] Указывает x-координату, в логических координатах, верхнего левого угла ограничивающего прямоугольника.
nTopRect
[in] Указывает y-координату, в логических координатах, верхнего левого угла ограничивающего прямоугольника.
nRightRect
[in] Указывает x-координату, в логических координатах, нижнего правого угла ограничивающего прямоугольника.
nBottomRect
[in] Указывает y-координату, в логических координатах, нижнего правого угла ограничивающего прямоугольника.
nXRadial1
[in] Указывает x-координату, в логических координатах, конечной точки первого радиального луча.
nYRadial1
[in] Указывает y-координату, в логических координатах, конечной точки первого радиального луча.
nXRadial2
[in] Указывает x-координату, в логических координатах, конечной точки второго радиального луча.
nYRadial2
[in] Указывает y-координату, в логических координатах, конечной точки второго радиального луча.

Возврат значения

Если функция успешна, возвращаемое значение не ноль.

Если функция не успешна, возвращаемое значение ноль.

Windows NT/2000/XP: Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Замечания

Кривая пирога определяется по эллипсу, который соответствует указанному ограничивающему прямоугольнику. Кривая начинается в точке, где эллипс пересекает первый радиальный луч, проходит против часовой стрелки, где эллипс пересекает второй радиальный луч.

Текущая позиция никогда не используется и не изменяется функцией Pie.

Windows 95/98/Me: Сумма координат ограничивающего прямоугольника не должна превышать 32,767. Сумма параметров nLeftRect и nRightRect или nTopRect и nBottomRect не должна превышать 32,767.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.
Библиотека: Используйте Gdi32.lib.

См. так же

AngleArc | Arc | ArcTo | Chord

Pie

The Pie function draws a pie-shaped wedge bounded by the intersection of an ellipse and two radials. The pie is outlined by using the current pen and filled by using the current brush.

BOOL Pie(
  HDC hdc,         // handle to DC
  int nLeftRect,   // x-coord of upper-left corner of rectangle
  int nTopRect,    // y-coord of upper-left corner of rectangle
  int nRightRect,  // x-coord of lower-right corner of rectangle
  int nBottomRect, // y-coord of lower-right corner of rectangle
  int nXRadial1,   // x-coord of first radial's endpoint
  int nYRadial1,   // y-coord of first radial's endpoint
  int nXRadial2,   // x-coord of second radial's endpoint
  int nYRadial2    // y-coord of second radial's endpoint
);

Parameters

hdc
[in] Handle to the device context.
nLeftRect
[in] Specifies the x-coordinate, in logical coordinates, of the upper-left corner of the bounding rectangle.
nTopRect
[in] Specifies the y-coordinate, in logical coordinates, of the upper-left corner of the bounding rectangle.
nRightRect
[in] Specifies the x-coordinate, in logical coordinates, of the lower-right corner of the bounding rectangle.
nBottomRect
[in] Specifies the y-coordinate, in logical coordinates, of the lower-right corner of the bounding rectangle.
nXRadial1
[in] Specifies the x-coordinate, in logical coordinates, of the endpoint of the first radial.
nYRadial1
[in] Specifies the y-coordinate, in logical coordinates, of the endpoint of the first radial.
nXRadial2
[in] Specifies the x-coordinate, in logical coordinates, of the endpoint of the second radial.
nYRadial2
[in] Specifies the y-coordinate, in logical coordinates, of the endpoint of the second radial.

Return Values

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero.

Windows NT/2000/XP: To get extended error information, call GetLastError.

Remarks

The curve of the pie is defined by an ellipse that fits the specified bounding rectangle. The curve begins at the point where the ellipse intersects the first radial and extends counterclockwise to the point where the ellipse intersects the second radial.

The current position is neither used nor updated by the Pie function.

Windows 95/98/Me: The sum of the coordinates of the bounding rectangle cannot exceed 32,767. The sum of nLeftRect and nRightRect or nTopRect and nBottomRect parameters cannot exceed 32,767.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

See Also

AngleArc | Arc | ArcTo | Chord

Описание примера Pie

В обработке события WM_CREATE создаётся логическое перо вызовом функции CreatePen; при завершении программы перо удаляется вызовом функции DeleteObject.

В обработке события WM_PAINT:

  • созданная в событии WM_CREATE перо выбирается в контекст устройства вызовом функции SelectObject;
  • вызывается функция Pie, отрисовывающая пирог текущим пером и закрашивая его текущей кистью (по умолчанию - кистью класса окна).

Внешний вид примера Pie

Pie
достать/запустить пример Pie.exe

Исходный текст примера Pie

Pie.cpp

#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    static HPEN hPen;
    switch(msg)
    {
    case WM_CREATE:
        hPen=CreatePen(PS_SOLID,4,0x009932cc);
        break;
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        SelectObject(hdc,hPen);
        Pie(hdc,50,25,250,275,100,0,0,100);
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        DeleteObject(hPen);
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW|CS_VREDRAW;
    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)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "Pie",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,212, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}


Polygon

Polygon

Функция Polygon рисует полигон (он же многоугольник), состоящий из двух и более вершин, соединённых прямыми линиями. очерчивается текущим пером и заливается с использованием текущей кисти и режима заливки полигонов.

BOOL Polygon(
  HDC hdc,                // хэндл DC
  CONST POINT *lpPoints,  // вершины полигона
  int nCount              // число вершин полигона
);

Параметры

hdc
[in] Хэндл контекста устройства.
lpPoints
[in] Указатель на массив структур типа POINT, который устанавливает вершины полигона, в логических координатах.
nCount
[in] Указывает число вершин в массиве. Это значение должно быть больше или равно 2.

Возврат значения

Если функция успешна, возвращаемое значение не ноль.

Если функция неуспешна, возвращаемое значение ноль.

Windows NT/2000/XP: Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Замечания

Полигон автоматически замыкается, рисуя линию из последней вершины в первую.

Текущая позиция никогда не используется и не изменяется функцией Polygon.

Windows 95/98/Me: Функция Polygon ограничена в числе точек, которые она способна отрисовать, в зависимости от толщины линии (то есть, ширины пера, выбранного внутри DC), как показывает следующая таблица.

Ширина линии | Максимальное число точек
Ширина линии 1 | 16K
Ширина линии > 1 (то есть, широкая линия) и устройство поддерживает широкие линии | 16K
Ширина линии > 1 но устройство не поддерживает широкие линии | приблизительно 1360 (то есть, немного меньше чем 16K / 12)

Любые точки свыше игнорируются. Что бы отрисовать линию с большим числом точек, делите ваши данные на группы, в каждой из которых количество точек меньше максимального, и вызывайте функцию для каждой группы точек. Не забывайте соединять группы линий отрезком.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.
Библиотека: Используйте Gdi32.lib.

См. так же

GetPolyFillMode | POINT | Polyline | PolylineTo | PolyPolygon | SetPolyFillMode

Polygon

The Polygon function draws a polygon consisting of two or more vertices connected by straight lines. The polygon is outlined by using the current pen and filled by using the current brush and polygon fill mode.

BOOL Polygon(
  HDC hdc,                // handle to DC
  CONST POINT *lpPoints,  // polygon vertices
  int nCount              // count of polygon vertices
);

Parameters

hdc
[in] Handle to the device context.
lpPoints
[in] Pointer to an array of POINT structures that specify the vertices of the polygon, in logical coordinates.
nCount
[in] Specifies the number of vertices in the array. This value must be greater than or equal to 2.

Return Values

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero.

Windows NT/2000/XP: To get extended error information, call GetLastError.

Remarks

The polygon is closed automatically by drawing a line from the last vertex to the first.

The current position is neither used nor updated by the Polygon function.

Windows 95/98/Me: Polygon is limited in the number of points it can draw, depending on the line width (that is, the width of the pen selected into the DC), as shown in the following table.

Line width | Maximum number of points
line width is 1 | 16K
line width > 1 (that is, wideline) and device supports wideline | 16K
line width > 1 but the device does not support wideline | approximately 1360 (that is, a few less than 16K / 12)

Any extra points are ignored. To draw a line with more points, divide your data into groups, each of which have less than the maximum number of points, and call the function for each group of points. Remember to connect the line segments.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

See Also

GetPolyFillMode | POINT | Polyline | PolylineTo | PolyPolygon | SetPolyFillMode

Описание примера Polygon

В обработке события WM_CREATE приложение получает хэндл системной кисти системного цвета вызовом функции GetSysColorBrush;

В обработке события WM_PAINT:

  • созданная в событии WM_CREATE кисть выбирается в контекст устройства вызовом функции SelectObject;
  • вызывается функция Polygon, рисующая полигон из 14 точек и закрашивающая его текущей кистью.

Удачная функция для быстрой отрисовки шахматной доски. Осталось написать ИИ и утереть нос Карпову.

Внешний вид примера Polygon

Polygon
достать/запустить пример Polygon.exe

Исходный текст примера Polygon

Polygon.cpp

#include <windows.h>
#include
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    static HBRUSH hBrush;
    POINT points[14]={50,75,
                     150,75,
                     150,100,
                     50,100,
                     50,125,
                     150,125,
                     150,150,
                     125,150,
                     125,50,
                     100,50,
                     100,150,
                     75,150,
                     75,50,
                     50,50};
    switch(msg)
    {
    case WM_CREATE:
        hBrush=GetSysColorBrush(COLOR_BTNFACE);
        break;
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        SelectObject(hdc,hBrush);
        Polygon(hdc,points,14);
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW|CS_VREDRAW;
    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)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "Polygon",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,212, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}


PolyPolygon

PolyPolygon

Функция PolyPolygon рисует серию замкнутых полигонов. Каждый полигон обрисовывается с использованием текущего пера и заливается с использованием текущей кисти и режима заливки полигона. Полигоны, нарисованные этой функцией могут перекрываться.

BOOL PolyPolygon(
  HDC hdc,                  // хэндл DC
  CONST POINT *lpPoints,    // массив вершин
  CONST INT *lpPolyCounts,  // массив числа вершин
  int nCount                // число полигонов
);

Параметры

hdc
[in] Хэндл контекста устройства.
lpPoints
[in] Указатель на массив структур POINT, который определяет вершины полигона, в логических координатах. Полигоны определяются последовательно. Каждый полигон автоматически замыкаются рисованием линии из последней вершины до первой. Каждая вершина должна быть указана один раз.
lpPolyCounts
[in] Указатель на массив целых чисел, каждое из которых определяет число точек в соответствующем полигоне. Каждое целое должно быть больше или равно 2.
nCount
[in] определяет полное число полигонов.

Возврат значения

Если функция успешна, возвращаемое значение не ноль.

Если функция неуспешна, возвращаемое значение ноль.

Windows NT/2000/XP: Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Замечания

Текущая позиция никогда не используется и не изменяется этой функцией.

Windows 95/98/Me: Polypolygon в числе точек, которые могут отрисоваться, в зависимости от ширины линии (то есть, ширины линии, выбранной в DC), как показано в следующей таблице:

Ширина линии | Максимально позволено точек
ширина линии 1 | 16K
ширина линии > 1 (то есть, широкая линия) и устройство поддерживает широкую линию | 16K
ширина линии > 1 но устройство не поддерживает широкую линию | приблизительно 1360 (то есть, приблизительно 16K / 12)

Любые точки свыше игнорируются. Чтобы отрисовать полигоны с большим количеством точек, делите ваши данные на группы, каждая из которых содержит меньше максимального числа точек, и вызывайте функцию для каждой группы точек. Заметьте, что лучше иметь полигон внутри одной из этих групп.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.
Библиотека: Используйте Gdi32.lib.

См. так же

GetPolyFillMode | POINT | Polygon | Polyline | PolylineTo | SetPolyFillMode

PolyPolygon

The PolyPolygon function draws a series of closed polygons. Each polygon is outlined by using the current pen and filled by using the current brush and polygon fill mode. The polygons drawn by this function can overlap.

BOOL PolyPolygon(
  HDC hdc,                  // handle to DC
  CONST POINT *lpPoints,    // array of vertices
  CONST INT *lpPolyCounts,  // array of count of vertices
  int nCount                // count of polygons
);

Parameters

hdc
[in] Handle to the device context.
lpPoints
[in] Pointer to an array of POINT structures that define the vertices of the polygons, in logical coordinates. The polygons are specified consecutively. Each polygon is closed automatically by drawing a line from the last vertex to the first. Each vertex should be specified once.
lpPolyCounts
[in] Pointer to an array of integers, each of which specifies the number of points in the corresponding polygon. Each integer must be greater than or equal to 2.
nCount
[in] Specifies the total number of polygons.

Return Values

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero.

Windows NT/2000/XP: To get extended error information, call GetLastError.

Remarks

The current position is neither used nor updated by this function.

Windows 95/98/Me: Polypolygon is limited in the number of points it can draw, depending on the line width (that is, the width of the pen selected into the DC), as shown in the following table.

Line width | Maximum number of points
line width is 1 | 16K
line width > 1 (that is, wideline) and device supports wideline | 16K
line width > 1 but the device does not support wideline | approximately 1360 (that is, a few less than 16K / 12)

Any extra points are ignored. To draw the polygons with more points, divide your data into groups, each of which have less than the maximum number of points, and call the function for each group of points. Note, it is best to have a polygon in only one of the groups.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

See Also

GetPolyFillMode | POINT | Polygon | Polyline | PolylineTo | SetPolyFillMode

Описание примера PolyPolygon

В обработке события WM_CREATE:

  • Приложение получает хэндл предопределённого битмапа вызовом функции LoadBitmap;
  • Создаёт кисть с образцом этого предопределённого битмапа CreatePatternBrush

В обработке события WM_PAINT:

  • созданная в событии WM_CREATE кисть выбирается в контекст устройства вызовом функции SelectObject;
  • вызывается функция PolyPolygon, рисующая два полигона по три точки в каждом (два треугольника) и закрашивающая их текущей кистью.

Созданные кисть и битмап удаляются при закрытии окна.

Заметьте, что ни один треугольник не перекрывает другой, как это было бы, если бы мы вызывали функцию Polygon для каждого треугольника отдельно.

С текущим режим ом закраски многоугольников, середина не закрашивается, что можно изменить вызовом функции SetPolyFillMode.

Внешний вид примера PolyPolygon

PolyPolygon
достать/запустить пример PolyPolygon.exe

Исходный текст примера PolyPolygon

PolyPolygon.cpp

#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    static HBRUSH hBrush;
    static HBITMAP hPredBmp;
    POINT points[6]={100,20,
                     175,140,
                     25,140,
                     25,60,
                     175,60,
                     100,180};
    int polyCount[2]={3,3};
    switch(msg)
    {
    case WM_CREATE:
        hPredBmp=LoadBitmap(NULL,MAKEINTRESOURCE(OBM_BTSIZE));
        hBrush=CreatePatternBrush(hPredBmp);
        break;
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        SelectObject(hdc,hBrush);
        PolyPolygon(hdc,points,polyCount,2);
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE:
        DeleteObject(hBrush);
        DeleteObject(hPredBmp);
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wc;
    wc.cbSize         = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW|CS_VREDRAW;
    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)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm         = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "PolyPolygon",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,212, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}


Rectangle

Rectangle

Функция Rectangle рисует прямоугольник. Прямоугольник обрисовывается с использованием текущего пера и закрашивается с использование текущей кисти.

BOOL Rectangle(
  HDC hdc,         // хэндл DC
  int nLeftRect,   // x-координата верхнего левого угла прямоугольника
  int nTopRect,    // y-координата верхнего левого угла прямоугольника
  int nRightRect,  // x-координата нижнего правого угла прямоугольника
  int nBottomRect  // y-координата нижнего правого угла прямоугольника
);

Параметры

hdc
[in] Хэндл контекста устройства.
nLeftRect
[in] Определяет координату x, в логических координатах, верхнего левого угла прямоугольника.
nTopRect
[in] Определяет координату y, в логических координатах, верхнего левого угла прямоугольника.
nRightRect
[in] Определяет координату x, в логических координатах, нижнего правого угла прямоугольника.
nBottomRect
[in] Определяет координату y, в логических координатах, нижнего правого угла прямоугольника.

Возврат значения

Если функция успешна, возвращаемое значение не ноль.

Если функция неуспешна, возвращаемое значение ноль.

Windows NT/2000/XP: Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Замечания

Текущая позиция никогда не используется и не изменяется функцией Rectangle.

Из рисуемого прямоугольника искючаются нижнее и правое ребро.

Если используется перо PS_NULL, размер прямоугольника на 1 пиксель меньше в высоте и на 1 пиксель меньше в ширине.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.
Библиотека: Используйте Gdi32.lib.

См. так же

RoundRect

Rectangle

The Rectangle function draws a rectangle. The rectangle is outlined by using the current pen and filled by using the current brush.

BOOL Rectangle(
  HDC hdc,         // handle to DC
  int nLeftRect,   // x-coord of upper-left corner of rectangle
  int nTopRect,    // y-coord of upper-left corner of rectangle
  int nRightRect,  // x-coord of lower-right corner of rectangle
  int nBottomRect  // y-coord of lower-right corner of rectangle
);

Parameters

hdc
[in] Handle to the device context.
nLeftRect
[in] Specifies the x-coordinate, in logical coordinates, of the upper-left corner of the rectangle.
nTopRect
[in] Specifies the y-coordinate, in logical coordinates, of the upper-left corner of the rectangle.
nRightRect
[in] Specifies the x-coordinate, in logical coordinates, of the lower-right corner of the rectangle.
nBottomRect
[in] Specifies the y-coordinate, in logical coordinates, of the lower-right corner of the rectangle.

Return Values

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero.

Windows NT/2000/XP: To get extended error information, call GetLastError.

Remarks

The current position is neither used nor updated by Rectangle.

The rectangle that is drawn excludes the bottom and right edges.

If a PS_NULL pen is used, the dimensions of the rectangle are 1 pixel less in height and 1 pixel less in width.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

See Also

RoundRect

Описание примера Rectangle

В обработке события WM_CREATE:

  • Приложение получает хэндл запущеного экземпляра программы вызовом функции GetModuleHandle, он нам понадобится для згрузки битмапов;
  • Загружаются битмапы из ресурсов выполняющейся программы вызовом функции LoadBitmap;
  • Создаются кисть и геометрическое перо с образцом этого битмапа вызовами функций CreatePatternBrush и ExtCreatePen.

В обработке события WM_PAINT:

  • Созданные в событии WM_CREATE кисть и перо выбирается в контекст устройства вызовом функции SelectObject;
  • Вызывается функция Rectangle, рисующая прямоугольник текущим пером и текущей кистью.

Созданные кисть, перо и битмапы удаляются при закрытии окна.

Внешний вид примера Rectangle

Rectangle
достать/запустить пример Rectangle.exe

Исходный текст примера Rectangle

Rectangle.cpp

#include <windows.h>
#include "resource.h"
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    static HINSTANCE hInstance;
    static LOGBRUSH logBrush;
    static HPEN hPen;
    static HBRUSH hBrush;
    static HBITMAP hBmpPen;
    static HBITMAP hBmpBrush;

    switch(msg)
    {
    case WM_CREATE:
        hInstance=(HINSTANCE)GetModuleHandle(NULL);
        hBmpPen=LoadBitmap(hInstance,MAKEINTRESOURCE(BITMAP_ID2));
        logBrush.lbStyle=BS_PATTERN;
        logBrush.lbColor=0;
        logBrush.lbHatch=(LONG)hBmpPen;
        hPen=ExtCreatePen(PS_GEOMETRIC,8,&logBrush,0,NULL);
        hBmpBrush=LoadBitmap(hInstance,MAKEINTRESOURCE(BITMAP_ID1));
        hBrush=CreatePatternBrush(hBmpBrush);
        break;
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        SelectObject(hdc,hPen);
        SelectObject(hdc,hBrush);
        Rectangle(hdc,25,40,175,160);
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE:
        DeleteObject(hBrush);
        DeleteObject(hPen);
        DeleteObject(hBmpBrush);
        DeleteObject(hBmpPen);
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW|CS_VREDRAW;
    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)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "Rectangle",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,212, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}

resource.rc

#include "resource.h"
BITMAP_ID1 BITMAP "ColorRounds.bmp"
BITMAP_ID2 BITMAP "gradient.bmp"

resource.h

#define BITMAP_ID1 10
#define BITMAP_ID2 20


RoundRect

RoundRect

Функция RoundRect рисует прямоугольник со скруглёнными углами. Прямоугольник обрисовывается с использованием текущего пера и закрашивается с использование текущей кисти.

BOOL RoundRect(
  HDC hdc,         // хэндл DC
  int nLeftRect,   // x-координата верхнего левого угла прямоугольника
  int nTopRect,    // y-координата верхнего левого угла прямоугольника
  int nRightRect,  // x-координата нижнего правого угла прямоугольника
  int nBottomRect, // y-координата нижнего правого угла прямоугольника
  int nWidth,      // ширина эллипса
  int nHeight      // высота эллипса
);

Параметры

hdc
[in] Хэндл контекста устройства.
nLeftRect
[in] Определяет координату x, в логических координатах, верхнего левого угла прямоугольника.
nTopRect
[in] Определяет координату y, в логических координатах, верхнего левого угла прямоугольника.
nRightRect
[in] Определяет координату x, в логических координатах, нижнего правого угла прямоугольника.
nBottomRect
[in] Определяет координату y, в логических координатах, нижнего правого угла прямоугольника.
nWidth
[in] Определяет ширину, в логических координатах, эллипса, используемого для рисования скруглённых углов.
nHeight
[in] Определяет высоту, в логических координатах, эллипса, используемого для рисования скруглённых углов.

Возврат значения

Если функция успешна, возвращаемое значение не ноль.

Если функция неуспешна, возвращаемое значение ноль.

Windows NT/2000/XP: Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Замечания

Текущая позиция никогда не используется и не изменяется этой функцией.

Windows 95/98/Me: Сумма координат ограничивающего прямоугольника не может превышать 32,767. Сумма параметров nLeftRect и nRightRect или nTopRect и nBottomRect не может превышать 32,767.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.
Библиотека: Используйте Gdi32.lib.

См. так же

Rectangle

RoundRect

The RoundRect function draws a rectangle with rounded corners. The rectangle is outlined by using the current pen and filled by using the current brush.

BOOL RoundRect(
  HDC hdc,         // handle to DC
  int nLeftRect,   // x-coord of upper-left corner of rectangle
  int nTopRect,    // y-coord of upper-left corner of rectangle
  int nRightRect,  // x-coord of lower-right corner of rectangle
  int nBottomRect, // y-coord of lower-right corner of rectangle
  int nWidth,      // width of ellipse
  int nHeight      // height of ellipse
);

Parameters

hdc
[in] Handle to the device context.
nLeftRect
[in] Specifies the x-coordinate, in logical coordinates, of the upper-left corner of the rectangle.
nTopRect
[in] Specifies the y-coordinate, in logical coordinates, of the upper-left corner of the rectangle.
nRightRect
[in] Specifies the x-coordinate, in logical coordinates, of the lower-right corner of the rectangle.
nBottomRect
[in] Specifies the y-coordinate, in logical coordinates, of the lower-right corner of the rectangle.
nWidth
[in] Specifies the width, in logical coordinates, of the ellipse used to draw the rounded corners.
nHeight
[in] Specifies the height, in logical coordinates, of the ellipse used to draw the rounded corners.

Return Values

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero.

Windows NT/2000/XP: To get extended error information, call GetLastError.

Remarks

The current position is neither used nor updated by this function.

Windows 95/98/Me: The sum of the coordinates of the bounding rectangle cannot exceed 32,767. The sum of nLeftRect and nRightRect or nTopRect and nBottomRect parameters cannot exceed 32,767.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

See Also

Rectangle

Описание примера RoundRect

В обработке события WM_CREATE:

  • Приложение получает хэндл запущеного экземпляра программы вызовом функции GetModuleHandle, он нам понадобится для загрузки битмапа;
  • Загружается битмап из ресурсов выполняющейся программы вызовом функции LoadBitmap;
  • Создаётся кисть с образцом этого битмапа CreatePatternBrush.

В обработке события WM_PAINT:

  • Созданная в событии WM_CREATE кисть выбирается в контекст устройства вызовом функции SelectObject;
  • Вызывается функция RoundRect, рисующая прямоугольник со скруглёнными по эллипсу углами.

Созданные кисть и битмап удаляются при закрытии окна.

Внешний вид примера RoundRect

RoundRect
достать/запустить пример RoundRect.exe

Исходный текст примера RoundRect

RoundRect.cpp

#include <windows.h>
#include "resource.h"
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    static HINSTANCE hInstance;
    static HBRUSH hBrush;
    static HBITMAP hBmp;

    switch(msg)
    {
    case WM_CREATE:
        hInstance=(HINSTANCE)GetModuleHandle(NULL);
        hBmp=LoadBitmap(hInstance,MAKEINTRESOURCE(BITMAP_ID));
        hBrush=CreatePatternBrush(hBmp);
        break;
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        SelectObject(hdc,hBrush);
        RoundRect(hdc,25,40,175,160,100,70);
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE:
        DeleteObject(hBrush);
        DeleteObject(hBmp);
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW|CS_VREDRAW;
    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)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "RoundRect",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,212, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}

resource.rc

#include "resource.h"
BITMAP_ID BITMAP "ColorRounds.bmp"

resource.h

#define BITMAP_ID 10


CreateBrushIndirect

CreateBrushIndirect

Функция CreateBrushIndirect создаёт логическую кисть, которая имеет указанный стиль, цвет, и образец.

HBRUSH CreateBrushIndirect(
  CONST LOGBRUSH *lplb   // информация о кисти
);

Параметры

lplb
[in] Указатель на структуру LOGBRUSH, которая содержит информацию об этой кисти.

Возврат значения

Если функция успешна, возвращаемое значение идентифицирует логическую кисть.

Если функция не успешна, возвращаемое значение NULL.

Windows NT/2000/XP: Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Замечания

Кисть это битмап, который система использует для рисования внутри заливаемых фигур.

После того, как приложение создало кисть вызовом функции CreateBrushIndirect, она может быть выбрана как кисть внутри любого контекста устройства вызовом функции SelectObject.

Кисть, созданная с использованием монохромного битмапа (один цвет, один бит на пиксель) рисуется с использованием текущего цвета текста и фона. Пиксели, представленные с битом, установленным в 0, рисуются текущим цветом текста; пиксели, представленные с битом, установленным в 1, рисуются текущим цветом фона.

Когда вы больше не нуждаетесь в кисти, вызовите функцию DeleteObject для удаления кисти.

ICM: Нет управления цветом при завершении создания кисти. Однако, управление цветом выполняется, когда кисть выбрана в ICM-видимый контекст устройства.

Windows 95: Создание кистей из битмапов или DIB-ов больше чем 8 на 8 пикселей не поддерживается. Если указан больший битмап, используется только его часть.

Windows 98/Me и Windows NT/2000/XP: Кисти могут создаваться из битмапов или DIB-ов больших чем 8 на 8 пикселей.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.
Библиотека: Используйте Gdi32.lib.

См. так же

DeleteObject | GetBrushOrgEx | LOGBRUSH | SelectObject | SetBrushOrgEx

CreateBrushIndirect

The CreateBrushIndirect function creates a logical brush that has the specified style, color, and pattern.

HBRUSH CreateBrushIndirect(
  CONST LOGBRUSH *lplb   // brush information
);

Parameters

lplb
[in] Pointer to a LOGBRUSH structure that contains information about the brush.

Return Values

If the function succeeds, the return value identifies a logical brush.

If the function fails, the return value is NULL.

Windows NT/2000/XP: To get extended error information, call GetLastError.

Remarks

A brush is a bitmap that the system uses to paint the interiors of filled shapes.

After an application creates a brush by calling CreateBrushIndirect, it can select it into any device context by calling the SelectObject function.

A brush created by using a monochrome bitmap (one color plane, one bit per pixel) is drawn using the current text and background colors. Pixels represented by a bit set to 0 are drawn with the current text color; pixels represented by a bit set to 1 are drawn with the current background color.

When you no longer need the brush, call the DeleteObject function to delete it.

ICM: No color is done at brush creation. However, color management is performed when the brush is selected into an ICM-enabled device context.

Windows 95: Creating brushes from bitmaps or DIBs larger than 8 by 8 pixels is not supported. If a larger bitmap is specified, only a portion of the bitmap is used.

Windows 98/Me and Windows NT/2000/XP: Brushes can be created from bitmaps or DIBs larger than 8 by 8 pixels.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

See Also

DeleteObject | GetBrushOrgEx | LOGBRUSH | SelectObject | SetBrushOrgEx

Описание примера CreateBrushIndirect

В обработке события WM_CREATE:

  • Заполняются структуры LOGBRUSH: hatchLogBrush, solidLogBrush и patternLogBrush;
  • Приложение получает хэндл запущеного экземпляра программы вызовом функции GetModuleHandle, он нам понадобится для загрузки битмапа;
  • Загружается битмап из ресурсов выполняющейся программы вызовом функции LoadBitmap;
  • Создаётся окно ComboBoxList-а, заполняется выпадающий список;
  • Инициализируется начальным значением указатель pLogBrush.

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

В обработке события WM_PAINT:

  • Создаётся кисть вызовом функции CreateBrushIndirect с параметром pLogBrush;
  • Созданная кисть выбирается в контекст устройства вызовом функции SelectObject;
  • Вызывается функция Pie, рисующая пирог, закрашенный текущей кистью;
  • Кисть удаляется вызовом функции DeleteObject

Загруженный битмап удаляется при закрытии окна.

Внешний вид примера CreateBrushIndirect

CreateBrushIndirect
достать/запустить пример CreateBrushIndirect.exe

Исходный текст примера CreateBrushIndirect

CreateBrushIndirect.cpp

#include <windows.h>
#include "resource.h"
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    HBRUSH hBrush;
    static HINSTANCE hInstance;
    static HWND hwndComboBox;
    static LOGBRUSH *pLogBrush;
    static LOGBRUSH hatchLogBrush;
    static LOGBRUSH solidLogBrush;
    static LOGBRUSH patternLogBrush;
    static HBITMAP hBmp;

    switch(msg)
    {
    case WM_CREATE:

        hatchLogBrush.lbStyle=BS_HATCHED;
        hatchLogBrush.lbColor=0x000000ff;
        hatchLogBrush.lbHatch=HS_DIAGCROSS;

        solidLogBrush.lbStyle=BS_SOLID;
        solidLogBrush.lbColor=0x00808000;
        solidLogBrush.lbHatch=0;

        hInstance=(HINSTANCE)GetModuleHandle(NULL);
        hBmp=LoadBitmap(hInstance,MAKEINTRESOURCE(BITMAP_ID));

        patternLogBrush.lbStyle=BS_PATTERN;
        patternLogBrush.lbColor=0;
        patternLogBrush.lbHatch=(LONG)hBmp;

        hwndComboBox=CreateWindow("COMBOBOX","Combo",
            WS_VISIBLE|WS_CHILD|WS_VSCROLL|CBS_DROPDOWNLIST,
            10,165,150,130,hwnd,NULL,
            (HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),
            NULL);
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"штриховая");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"сплошная");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"с образцом");
        SendMessage(hwndComboBox,CB_SETCURSEL,0,0);
        pLogBrush=&hatchLogBrush;
        break;
    case WM_COMMAND:
        if(lParam==(LPARAM)hwndComboBox)
            if(HIWORD(wParam)==CBN_SELCHANGE)
            {
                switch(SendMessage(hwndComboBox,CB_GETCURSEL,0,0))
                {
                case 0:
                    pLogBrush=&hatchLogBrush;
                    break;
                case 1:
                    pLogBrush=&solidLogBrush;
                    break;
                case 2:
                    pLogBrush=&patternLogBrush;
                    break;
            }
            InvalidateRect(hwnd,NULL,true);
            }
        break;
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        hBrush=CreateBrushIndirect(pLogBrush);
        SelectObject(hdc,hBrush);
        Pie(hdc,50,25,250,275,100,0,0,100);
        DeleteObject(hBrush);
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE:
        DeleteObject(hBmp);
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{

    HWND hwnd;

    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = 0;
    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)(COLOR_BTNFACE+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "CreateBrushIndirect",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,212, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    MSG msg;

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

resource.rc

#include "resource.h"
BITMAP_ID BITMAP "gradient.bmp"

resource.h

#define BITMAP_ID 10


CreateDIBPatternBrush

CreateDIBPatternBrush

Функция CreateDIBPatternBrush создаёт логическую кисть, которая имеет образец, указанный в указанном не зависимом от устройства битмапе (DIB). Кисть в последствии может быть выбрана в какой-нибудь конкекст устройства, который ассоциирован с устройством, которое поддерживает растровые операции.

Обратите внимание: Эта функция только обеспечивает совместимость с 16-битными версиями Windows. Приложения должны использовать функцию CreateDIBPatternBrushPt.

HBRUSH CreateDIBPatternBrush(
  HGLOBAL hglbDIBPacked,  // хэндл DIB
  UINT fuColorSpec        // данные таблицы цветов
);

Параметры

hglbDIBPacked
[in] Хэндл объекта в глобальной памяти, содержащий упакованный DIB, который содержит структуру BITMAPINFO и непосредственно следующующий за ней массив байтов, определяющий байты в битмапе.

Windows 95: Создание кистей из битмапов или DIB-ов больших чем 8 на 8 пикселей не поддерживается. Если указан больший битмап, используется только его часть.

Windows 98/Me и Windows NT/2000/XP: Кисти могут создаваться из битмапов и DIB-ов больших чем 8 на 8 пикселей.

fuColorSpec
[in] Определяет, инициализируется ли член bmiColors структуры BITMAPINFO и, если да, содержит ли этот член явные значения красного, зелёного и голубого (RGB), или индексы в логической палитре. Параметр fuColorSpec должен иметь одно из следующих значений:

Величина | Значение
DIB_PAL_COLORS | Таблица цветов обеспечивается и содержится в 16-битных индексах в логической палитре контекста устройства, в котором выбрана кисть.
DIB_RGB_COLORS | Таблица цветов обеспечивается и содержится в буквальных RGB значениях.

Возврат значения

Если функция успешна, возвращаемое значение идентифицирует логическую кисть.

Если функция не успешна, возвращаемое значение NULL.

Windows NT/2000/XP: Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Замечания

Когда приложение выбрало двух-цветную DIB кисть с образцом в монохромном контексте устройства, система не признает цвета, указанные в DIB; вместо этого, она отображает кисть с образцом, используя текущие цвета фона и переднего плана в контексте устройства. Пиксели, с первым цветом DIB (смещение 0 в таблице цветов DIB), отображаются цветом переднего плана; пиксели со вторым цветом (смещение 1 в таблице цветов), отображаются цветом фона.

Когда вы больше не нуждаетесь в кисти, вызовите функцию DeleteObject для удаления кисти.

ICM: Нет управления цветом при завершении создания кисти. Однако, управление цветом выполняется, когда кисть выбрана в ICM-видимый контекст устройства.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.
Библиотека: Используйте Gdi32.lib.

См. так же

BITMAPINFO | CreateDIBPatternBrushPt | CreateHatchBrush | CreatePatternBrush | CreateSolidBrush | DeleteObject | SetBkColor | SetTextColor

CreateDIBPatternBrush

The CreateDIBPatternBrush function creates a logical brush that has the pattern specified by the specified device-independent bitmap (DIB). The brush can subsequently be selected into any device context that is associated with a device that supports raster operations.

Note This function is provided only for compatibility with 16-bit versions of Windows. Applications should use the CreateDIBPatternBrushPt function.

HBRUSH CreateDIBPatternBrush(
  HGLOBAL hglbDIBPacked,  // handle to DIB
  UINT fuColorSpec        // color table data
);

Parameters

hglbDIBPacked
[in] Handle to a global memory object containing a packed DIB, which consists of a BITMAPINFO structure immediately followed by an array of bytes defining the pixels of the bitmap.

Windows 95: Creating brushes from bitmaps or DIBs larger than 8 by 8 pixels is not supported. If a larger bitmap is specified, only a portion of the bitmap is used.

Windows 98/Me and Windows NT/2000/XP: Brushes can be created from bitmaps or DIBs larger than 8 by 8 pixels.

fuColorSpec
[in] Specifies whether the bmiColors member of the BITMAPINFO structure is initialized and, if so, whether this member contains explicit red, green, blue (RGB) values or indexes into a logical palette. The fuColorSpec parameter must be one of the following values.

Value | Meaning
DIB_PAL_COLORS | A color table is provided and consists of an array of 16-bit indexes into the logical palette of the device context into which the brush is to be selected.
DIB_RGB_COLORS | A color table is provided and contains literal RGB values.

Return Values

If the function succeeds, the return value identifies a logical brush.

If the function fails, the return value is NULL.

Windows NT/2000/XP: To get extended error information, call GetLastError.

Remarks

When an application selects a two-color DIB pattern brush into a monochrome device context, the system does not acknowledge the colors specified in the DIB; instead, it displays the pattern brush using the current background and foreground colors of the device context. Pixels mapped to the first color of the DIB (offset 0 in the DIB color table) are displayed using the foreground color; pixels mapped to the second color (offset 1 in the color table) are displayed using the background color.

When you no longer need the brush, call the DeleteObject function to delete it.

ICM: No color is done at brush creation. However, color management is performed when the brush is selected into an ICM-enabled device context.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

See Also

BITMAPINFO | CreateDIBPatternBrushPt | CreateHatchBrush | CreatePatternBrush | CreateSolidBrush | DeleteObject | SetBkColor | SetTextColor

Описание примера CreateDIBPatternBrush

В обработке события WM_CREATE:

  • Приложение получает хэндл запущеного экземпляра программы вызовом функции GetModuleHandle, он нам понадобится для загрузки битмапа;
  • Получаем указатель на структуру BITMAPINFO упакованного битмапа DIB последовательным вызовом функций FindResource, LoadResource;
  • Создаётся кисть с образцом этого DIB CreateDIBPatternBrush.

В обработке события WM_PAINT:

  • Созданная в событии WM_CREATE кисть выбирается в контекст устройства вызовом функции SelectObject;
  • Вызывается функция RoundRect, рисующая прямоугольник со скруглёнными по эллипсу углами и заливающая его выбранной в контекст устройства кистью.

При закрытии окна не забываем убираем кисть DeleteObject.

Под Win16 программа, конечно, не пойдёт, но под Windows XP функция CreateDIBPatternBrush пока всё ещё, как видите, работает.

Внешний вид примера CreateDIBPatternBrush

CreateDIBPatternBrush
достать/запустить пример CreateDIBPatternBrush.exe

Исходный текст примера CreateDIBPatternBrush

CreateDIBPatternBrush.cpp

#include <windows.h>
#include "resource.h"
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    static HINSTANCE hInstance;
    static HRSRC hRsrc;
    static HGLOBAL hGlobal;
    static HBRUSH hBrush;

    switch(msg)
    {
    case WM_CREATE:
        hInstance=(HINSTANCE)GetModuleHandle(NULL);
        hRsrc=FindResource(hInstance,MAKEINTRESOURCE(BITMAP_ID),RT_BITMAP);
        hGlobal=LoadResource(hInstance,hRsrc);
        hBrush=CreateDIBPatternBrush(hGlobal,DIB_RGB_COLORS);
        break;
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        SelectObject(hdc,hBrush);
        RoundRect(hdc,50,50,150,150,70,50);
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE:
        DeleteObject(hBrush);
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW|CS_VREDRAW;
    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)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "CreateDIBPatternBrushPt",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,212, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}

resource.rc

#include "resource.h"
BITMAP_ID BITMAP "GrayRound.bmp"

resource.h

#define BITMAP_ID 10


CreateDIBPatternBrushPt

CreateDIBPatternBrushPt

Функция CreateDIBPatternBrushPt создаёт логическую кисть, имеющую образец, определённый независимым от устройства битмапом (DIB).

HBRUSH CreateDIBPatternBrushPt(
  CONST VOID *lpPackedDIB,  // биты битмапа
  UINT iUsage               // использование
);

Параметры

lpPackedDIB
[in] Указатель на упакованный DIB содержащий структуру BITMAPINFO и непосредственно следующующий за ней массив байтов, определяющий байты в битмапе..

Windows 95: Создание кистей из битмапов или DIB-ов больших чем 8 на 8 пикселей не поддерживается. Если указан больший битмап, используется только его часть.

Windows 98/Me and Windows NT/2000/XP: Кисти могут создаваться из битмапов и DIB-ов больших чем 8 на 8 пикселей.

iUsage
[in] Определяет, содержит ли член bmiColors структуры BITMAPINFO допустимую таблицу цветов и, если да, содержатся ли в ней явные значения красного, зелёного и голубого (RGB), или индексы в логической палитре. Параметр iUsage должен иметь одно из следующих значений:

Величина | Значение
DIB_PAL_COLORS | Таблица цветов обеспечивается и содержится в 16-битных индексах в логической палитре контекста устройства, в котором выбрана кисть.
DIB_RGB_COLORS | Таблица цветов обеспечивается и содержится в буквальных RGB значениях.

Возврат значения

Если функция успешна, возвращаемое значение идентифицирует логическую кисть.

Если функция не успешна, возвращаемое значение NULL.

Windows NT/2000/XP: Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Замечания

Кисть это битмап, который система использует для рисования внутри заливаемых фигур.

После того, как приложение создало кисть вызовом функции CreateDIBPatternBrushPt, она может быть выбрана как кисть внутри любого контекста устройства вызовом функции SelectObject.

Когда вы больше не нуждаетесь в кисти, вызовите функцию DeleteObject для её удаления.

ICM: Нет управления цветом при завершении создания кисти. Однако, управление цветом выполняется, когда кисть выбрана в ICM-видимый контекст устройства.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.
Библиотека: Используйте Gdi32.lib.

См. так же

BITMAPINFO | CreateDIBPatternBrush | CreateHatchBrush | CreatePatternBrush | CreateSolidBrush | DeleteObject | GetBrushOrgEx | SelectObject | SetBrushOrgEx

CreateDIBPatternBrushPt

The CreateDIBPatternBrushPt function creates a logical brush that has the pattern specified by the device-independent bitmap (DIB).

HBRUSH CreateDIBPatternBrushPt(
  CONST VOID *lpPackedDIB,  // bitmap bits
  UINT iUsage               // usage
);

Parameters

lpPackedDIB
[in] Pointer to a packed DIB consisting of a BITMAPINFO structure immediately followed by an array of bytes defining the pixels of the bitmap.

Windows 95: Creating brushes from bitmaps or DIBs larger than 8 by 8 pixels is not supported. If a larger bitmap is specified, only a portion of the bitmap is used.

Windows 98/Me and Windows NT/2000/XP: Brushes can be created from bitmaps or DIBs larger than 8 by 8 pixels.

iUsage
[in] Specifies whether the bmiColors member of the BITMAPINFO structure contains a valid color table and, if so, whether the entries in this color table contain explicit red, green, blue (RGB) values or palette indexes. The iUsage parameter must be one of the following values:

Value | Meaning
DIB_PAL_COLORS | A color table is provided and consists of an array of 16-bit indexes into the logical palette of the device context into which the brush is to be selected.
DIB_RGB_COLORS | A color table is provided and contains literal RGB values.

Return Values

If the function succeeds, the return value identifies a logical brush.

If the function fails, the return value is NULL.

Windows NT/2000/XP: To get extended error information, call GetLastError.

Remarks

A brush is a bitmap that the system uses to paint the interiors of filled shapes.

After an application creates a brush by calling CreateDIBPatternBrushPt, it can select that brush into any device context by calling the SelectObject function.

When you no longer need the brush, call the DeleteObject function to delete it.

ICM: No color is done at brush creation. However, color management is performed when the brush is selected into an ICM-enabled device context.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

See Also

BITMAPINFO | CreateDIBPatternBrush | CreateHatchBrush | CreatePatternBrush | CreateSolidBrush | DeleteObject | GetBrushOrgEx | SelectObject | SetBrushOrgEx

Описание примера CreateDIBPatternBrushPt

В обработке события WM_CREATE:

  • Приложение получает хэндл запущеного экземпляра программы вызовом функции GetModuleHandle, он нам понадобится для загрузки битмапа;
  • Получаем указатель на структуру BITMAPINFO упакованного битмапа DIB последовательным вызовом функций FindResource, LoadResource, LockResource;
  • Создаётся кисть с образцом этого DIB CreateDIBPatternBrushPt.

В обработке события WM_PAINT:

  • Созданная в событии WM_CREATE кисть выбирается в контекст устройства вызовом функции SelectObject;
  • Вызывается функция RoundRect, рисующая прямоугольник со скруглёнными по эллипсу углами и заливающая его выбранной в контекст устройства кистью.

При закрытии окна не забываем убирать за собой: DeleteObject.

Внешний вид примера CreateDIBPatternBrushPt

CreateDIBPatternBrushPt
достать/запустить пример CreateDIBPatternBrushPt.exe

Исходный текст примера CreateDIBPatternBrushPt

CreateDIBPatternBrushPt.cpp

#include <windows.h>
#include "resource.h"
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    static HINSTANCE hInstance;
    static HRSRC hRsrc;
    static HGLOBAL hGlobal;
    static BITMAPINFO *lpbi;
    static HBRUSH hBrush;

    switch(msg)
    {
    case WM_CREATE:
        hInstance=(HINSTANCE)GetModuleHandle(NULL);
        hRsrc=FindResource(hInstance,MAKEINTRESOURCE(BITMAP_ID),RT_BITMAP);
        hGlobal=LoadResource(hInstance,hRsrc);
        lpbi=(BITMAPINFO*)LockResource(hGlobal);
        hBrush=CreateDIBPatternBrushPt(lpbi,DIB_RGB_COLORS);
        break;
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        SelectObject(hdc,hBrush);
        RoundRect(hdc,50,50,150,150,70,50);
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE:
        DeleteObject(hBrush);
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW|CS_VREDRAW;
    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)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "CreateDIBPatternBrushPt",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,212, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}

resource.rc

#include "resource.h"
BITMAP_ID BITMAP "GrayRound.bmp"

resource.h

#define BITMAP_ID 10


CreateHatchBrush

CreateHatchBrush

Функция CreateHatchBrush создаёт логическую кисть, по определённым образцу штриховки и цвету.

HBRUSH CreateHatchBrush(
  int fnStyle,      // стиль штриховки
  COLORREF clrref   // передний цвет
);

Параметры

fnStyle
[in] Определяет стиль штриховки кисти. Этот параметр может иметь одно из следующих значений:

Величина | Значение
HS_BDIAGONAL | штриховка 45 градусов вверх слева на право
HS_CROSS | Пересекающиеся штрихи горизонтальные и вертикальные
HS_DIAGCROSS | Пересекающиеся штрихи под углом 45 градусов
HS_FDIAGONAL | штриховка 45 градусов вниз слева на право
HS_HORIZONTAL | Горизонтальная штриховка
HS_VERTICAL | Вертикальная штриховка

clrref
[in] Определяет передний цвет кисти, которыйиспользуется для штриховки. Для создания значения цвета COLORREF, используйте макрос RGB.

Возврат значения

Если функция успешна, возвращаемое значение идентифицирует логическую кисть.

Если функция не успешна, возвращаемое значение NULL.

Windows NT/2000/XP: Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Замечания

Кисть это битмап, который система использует для рисования внутри заливаемых фигур.

После того, как приложение создало кисть вызовом функции CreateHatchBrush, она может быть выбрана как кисть внутри любого контекста устройства вызовом функции SelectObject.

Если приложение использует кисть штриховки для заливки фона обоих, родительского и дочернего окна с выбранным цветом,может оказаться необходимым установить начало координат кисти перед отрисовкой фона дочернего окна. Вы можете это сделать вызовом функции SetBrushOrgEx. Ваше приложение может восстановить начало координат текущей кисти вызовом функции GetBrushOrgEx.

Когда вы больше не нуждаетесь в кисти, вызовите функцию DeleteObject для удаления кисти.

ICM: Нет управления цветом при завершении создания кисти. Однако, управление цветом выполняется, когда кисть выбрана в ICM-видимый контекст устройства.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.
Библиотека: Используйте Gdi32.lib.

См. так же

CreateDIBPatternBrush | CreateDIBPatternBrushPt | CreatePatternBrush | CreateSolidBrush | DeleteObject | GetBrushOrgEx | SelectObject | SetBrushOrgEx | COLORREF | RGB

CreateHatchBrush

The CreateHatchBrush function creates a logical brush that has the specified hatch pattern and color.

HBRUSH CreateHatchBrush(
  int fnStyle,      // hatch style
  COLORREF clrref   // foreground color
);

Parameters

fnStyle
[in] Specifies the hatch style of the brush. This parameter can be one of the following values.

Value | Meaning
HS_BDIAGONAL | 45-degree upward left-to-right hatch
HS_CROSS | Horizontal and vertical crosshatch
HS_DIAGCROSS | 45-degree crosshatch
HS_FDIAGONAL | 45-degree downward left-to-right hatch
HS_HORIZONTAL | Horizontal hatch
HS_VERTICAL | Vertical hatch

clrref
[in] Specifies the foreground color of the brush that is used for the hatches. To create a COLORREF color value, use the RGB macro.

Return Values

If the function succeeds, the return value identifies a logical brush.

If the function fails, the return value is NULL.

Windows NT/2000/XP: To get extended error information, call GetLastError.

Remarks

A brush is a bitmap that the system uses to paint the interiors of filled shapes.

After an application creates a brush by calling CreateHatchBrush, it can select that brush into any device context by calling the SelectObject function.

If an application uses a hatch brush to fill the backgrounds of both a parent and a child window with matching color, it may be necessary to set the brush origin before painting the background of the child window. You can do this by having your application call the SetBrushOrgEx function. Your application can retrieve the current brush origin by calling the GetBrushOrgEx function.

When you no longer need the brush, call the DeleteObject function to delete it.

ICM: No color is done at brush creation. However, color management is performed when the brush is selected into an ICM-enabled device context.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

See Also

CreateDIBPatternBrush | CreateDIBPatternBrushPt | CreatePatternBrush | CreateSolidBrush | DeleteObject | GetBrushOrgEx | SelectObject | SetBrushOrgEx | COLORREF | RGB

Описание примера CreateHatchBrush

В обработке события WM_CREATE приложение создаёт окно ComboBoxList-а, заполняет выпадающий список и создаёт штриховую кисть вызовом функции CreateHatchBrush;

В обработке события выбора пользователем элемента из списка, удаляется старая кисть DeleteObject, и создаётся новая CreateHatchBrush с выбранным пользователем стилем штриховки.

В обработке события WM_PAINT:

  • Кисть выбирается в контекст устройства вызовом функции SelectObject;
  • Устанавливается цвет фона кисти вызовом функции SetBkColor
  • Вызывается функция RoundRect, рисующая прямоугольник со скруглёнными по эллипсу краями и заливающая его текущей кистью.

При закрытии окна кисть удаляется вызовом функции DeleteObject.

Пример демонстрирует все возможные стили штриховки штриховой кисти.

Внешний вид примера CreateHatchBrush

CreateHatchBrush
достать/запустить пример CreateHatchBrush.exe

Исходный текст примера CreateHatchBrush

CreateHatchBrush.cpp

#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    static HWND hwndComboBox;
    static HBRUSH hBrush;
    const COLORREF hatchColor=0x000000ff;
    switch(msg)
    {
    case WM_CREATE:
        hwndComboBox=CreateWindow("COMBOBOX","Combo",
            WS_VISIBLE|WS_CHILD|WS_VSCROLL|CBS_DROPDOWNLIST,
            10,165,150,130,hwnd,NULL,
            (HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),
            NULL);
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"HS_BDIAGONAL");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"HS_CROSS");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"HS_DIAGCROSS");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"HS_FDIAGONAL");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"HS_HORIZONTAL");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"HS_VERTICAL");
        SendMessage(hwndComboBox,CB_SETCURSEL,0,0);

        hBrush=CreateHatchBrush(HS_BDIAGONAL,hatchColor);
        break;
    case WM_COMMAND:
        if(lParam==(LPARAM)hwndComboBox)
            if(HIWORD(wParam)==CBN_SELCHANGE)
            {
                switch(SendMessage(hwndComboBox,CB_GETCURSEL,0,0))
                {
                case 0:
                    DeleteObject(hBrush);
                    hBrush=CreateHatchBrush(HS_BDIAGONAL,hatchColor);
                    break;
                case 1:
                    DeleteObject(hBrush);
                    hBrush=CreateHatchBrush(HS_CROSS,hatchColor);
                    break;
                case 2:
                    DeleteObject(hBrush);
                    hBrush=CreateHatchBrush(HS_DIAGCROSS,hatchColor);
                    break;
                case 3:
                    DeleteObject(hBrush);
                    hBrush=CreateHatchBrush(HS_FDIAGONAL,hatchColor);
                    break;
                case 4:
                    DeleteObject(hBrush);
                    hBrush=CreateHatchBrush(HS_HORIZONTAL,hatchColor);
                    break;
                case 5:
                    DeleteObject(hBrush);
                    hBrush=CreateHatchBrush(HS_VERTICAL,hatchColor);
                    break;
            }
            InvalidateRect(hwnd,NULL,true);
            }
        break;
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        SelectObject(hdc,hBrush);
        SetBkColor(hdc,0x0000ffff);
        RoundRect(hdc,50,50,150,150,50,40);
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE:
        DeleteObject(hBrush);
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{

    HWND hwnd;

    WNDCLASSEX wc;
    wc.cbSize         = sizeof(WNDCLASSEX);
    wc.style         = 0;
    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)(COLOR_BTNFACE+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm         = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "CreateHatchBrush",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,212, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    MSG msg;

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}


CreatePatternBrush

CreatePatternBrush

Функция CreatePatternBrush создаёт логическую кисть с указанным образцом битмапа. Битмап может быть битмапом DIB секции, который создаётся функцией CreateDIBSection , или может быть зависимым от устройства битмапом.

HBRUSH CreatePatternBrush(
  HBITMAP hbmp   // хэндл битмапа
);

Параметры

hbmp
[in] Хэндл битмапа, используемый для создания логической кисти.

Windows 95: Создание кистей из битмапов или DIB-ов больших чем 8 на 8 пикселей не поддерживается. Если указан больший битмап, используется только его часть.

Windows 98/Me and Windows NT/2000/XP: Кисти могут создаваться из битмапов и DIB-ов больших чем 8 на 8 пикселей.

Возврат значения

Если функция успешна, возвращаемое значение идентифицирует логическую кисть.

Если функция не успешна, возвращаемое значение NULL.

Windows NT/2000/XP: Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Замечания

Кисть с образцом это битмап, который система использует для рисования внутри заливаемых фигур.

После того, как приложение создало кисть вызовом функции CreatePatternBrush, она может быть выбрана как кисть внутри любого контекста устройства вызовом функции SelectObject.

Вы можете удалить кисть с образцом без последствий для ассоциированного битмапа использованием функции DeleteObject. Поэтому, вы можете использовать этот битмап для создания нескольких кистей с образцом.

Кисть, созданная с использованием монохромного битмапа (один цвет, один бит на пиксель) рисуется с использованием текущего цвета текста и фона. Пиксели, представленные с битом, установленным в 0, рисуются текущим цветом текста; пиксели, представленные с битом, установленным в 1, рисуются текущим цветом фона.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.
Библиотека: Используйте Gdi32.lib.

См. так же

CreateBitmap | CreateBitmapIndirect | CreateCompatibleBitmap | CreateDIBPatternBrush | CreateDIBPatternBrushPt | CreateDIBSection | CreateHatchBrush | DeleteObject | GetBrushOrgEx | LoadBitmap | SelectObject | SetBrushOrgEx

CreatePatternBrush

The CreatePatternBrush function creates a logical brush with the specified bitmap pattern. The bitmap can be a DIB section bitmap, which is created by the CreateDIBSection function, or it can be a device-dependent bitmap.

HBRUSH CreatePatternBrush(
  HBITMAP hbmp   // handle to bitmap
);

Parameters

hbmp
[in] Handle to the bitmap to be used to create the logical brush.

Windows 95: Creating brushes from bitmaps or DIBs larger than 8 by 8 pixels is not supported. If a larger bitmap is specified, only a portion of the bitmap is used.

Windows 98/Me and Windows NT/2000/XP: Brushes can be created from bitmaps or DIBs larger than 8 by 8 pixels.

Return Values

If the function succeeds, the return value identifies a logical brush.

If the function fails, the return value is NULL.

Windows NT/2000/XP: To get extended error information, call GetLastError.

Remarks

A pattern brush is a bitmap that the system uses to paint the interiors of filled shapes.

After an application creates a brush by calling CreatePatternBrush, it can select that brush into any device context by calling the SelectObject function.

You can delete a pattern brush without affecting the associated bitmap by using the DeleteObject function. Therefore, you can then use this bitmap to create any number of pattern brushes.

A brush created by using a monochrome (1 bit per pixel) bitmap has the text and background colors of the device context to which it is drawn. Pixels represented by a 0 bit are drawn with the current text color; pixels represented by a 1 bit are drawn with the current background color.

ICM: No color is done at brush creation. However, color management is performed when the brush is selected into an ICM-enabled device context.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

See Also

CreateBitmap | CreateBitmapIndirect | CreateCompatibleBitmap | CreateDIBPatternBrush | CreateDIBPatternBrushPt | CreateDIBSection | CreateHatchBrush | DeleteObject | GetBrushOrgEx | LoadBitmap | SelectObject | SetBrushOrgEx

Описание примера CreatePatternBrush

В обработке события WM_CREATE:

  • Приложение получает хэндл запущеного экземпляра программы вызовом функции GetModuleHandle, он нам понадобится для загрузки битмапа;
  • Загружается битмап из ресурсов выполняющейся программы вызовом функции LoadBitmap;
  • Создаётся кисть с образцом этого битмапа CreatePatternBrush.

В обработке события WM_PAINT:

  • Созданная в событии WM_CREATE кисть выбирается в контекст устройства вызовом функции SelectObject;
  • Вызывается функция Ellipse, рисующая эллипс, закрашенный текущей кистью.

Созданные кисть и битмап удаляются при закрытии окна.

Внешний вид примера CreatePatternBrush

CreatePatternBrush
достать/запустить пример CreatePatternBrush.exe

Исходный текст примера CreatePatternBrush

CreatePatternBrush.cpp

#include <windows.h>
#include "resource.h"
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    static HINSTANCE hInstance;
    static HBRUSH hBrush;
    static HBITMAP hBmp;

    switch(msg)
    {
    case WM_CREATE:
        hInstance=(HINSTANCE)GetModuleHandle(NULL);
        hBmp=LoadBitmap(hInstance,MAKEINTRESOURCE(BITMAP_ID));
        hBrush=CreatePatternBrush(hBmp);
        break;
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        SelectObject(hdc,hBrush);
        Ellipse(hdc,50,25,150,175);
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE:
        DeleteObject(hBrush);
        DeleteObject(hBmp);
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW|CS_VREDRAW;
    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)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "CreatePatternBrush",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,212, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}

resource.rc

#include "resource.h"
BITMAP_ID BITMAP "gradient.bmp"

resource.h

#define BITMAP_ID 10


CreateSolidBrush

CreateSolidBrush

Функция CreateSolidBrush создаёт логическую кисть, которая имеет указанный сплошной цвет.

HBRUSH CreateSolidBrush(
  COLORREF crColor   // значение цвета кисти
);

Параметры

crColor
[in] Определяет цвет кисти. Чтобы создать значение цвета COLORREF, используйте макрос RGB.

Возврат значения

Если функция успешна, возвращаемое значение идентифицирует логическую кисть.

Если функция не успешна, возвращаемое значение NULL.

Windows NT/2000/XP: Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Замечания

Сплошная кисть это битмап, который система использует для рисования внутри заливаемых фигур.

После того, как приложение создало кисть вызовом функции CreateSolidBrush, она может быть выбрана как кисть внутри любого контекста устройства вызовом функции SelectObject.

Для рисования кистью системного цвета, приложения должны использовать GetSysColorBrush(nIndex) вместо CreateSolidBrush(GetSysColor(nIndex)), поскольку GetSysColorBrush возвращает запасённую кисть вместо размещения одной новой.

ICM: Нет управления цветом при завершении создания кисти. Однако, управление цветом выполняется, когда кисть выбрана в ICM-видимый контекст устройства.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.
Библиотека: Используйте Gdi32.lib.

См. так же

CreateDIBPatternBrush | CreateDIBPatternBrushPt | CreateHatchBrush | CreatePatternBrush | DeleteObject | GetSysColorBrush | SelectObject | COLORREF | RGB

CreateSolidBrush

The CreateSolidBrush function creates a logical brush that has the specified solid color.

HBRUSH CreateSolidBrush(
  COLORREF crColor   // brush color value
);

Parameters

crColor
[in] Specifies the color of the brush. To create a COLORREF color value, use the RGB macro.

Return Values

If the function succeeds, the return value identifies a logical brush.

If the function fails, the return value is NULL.

Windows NT/2000/XP: To get extended error information, call GetLastError.

Remarks

A solid brush is a bitmap that the system uses to paint the interiors of filled shapes.

After an application creates a brush by calling CreateSolidBrush, it can select that brush into any device context by calling the SelectObject function.

To paint with a system color brush, an application should use GetSysColorBrush(nIndex) instead of CreateSolidBrush(GetSysColor(nIndex)), because GetSysColorBrush returns a cached brush instead of allocating a new one.

ICM: No color management is done at brush creation. However, color management is performed when the brush is selected into an ICM-enabled device context.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

See Also

CreateDIBPatternBrush | CreateDIBPatternBrushPt | CreateHatchBrush | CreatePatternBrush | DeleteObject | GetSysColorBrush | SelectObject | COLORREF | RGB

Описание примера CreateSolidBrush

Пример демонстрирует 20 зарезервированных цветов системной палитры. Только они могут быть использованы для рисования без вмешательства в системную палитру.

Лично у меня эта програмка вседа на рабочем столе.

В обработке события WM_PAINT:

  • В двух вложенных циклах for функцией Rectangle рисуются 20 прямоугольников;
  • Кисть для заливки прямоугольников создаётся функцией CreateSolidBrush со значением цвета из массива colorTable[5][4];
  • В этом же массиве содержатся строковые значения цветов RGB, выводимые функцией TextOut;
  • Для наглядности и видимости выводимого текста производится установка его цвета и режима вывода (TRANSPARENT) вызовами функций SetTextColor и SetBkMode;
  • При завершении работы с кистью, созданная кисть удаляется.

Внешний вид примера CreateSolidBrush

CreateSolidBrush
достать/запустить пример CreateSolidBrush.exe

Исходный текст примера CreateSolidBrush

CreateSolidBrush.cpp

#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    typedef struct
    {
        COLORREF color;
        char  value[7];
    } CLRRGBVAL;
    HBRUSH hBrush;
    static CLRRGBVAL colorTable[5][4]=
        {0x00000000,"000000",
         0x00000080,"000080",
         0x00008000,"008000",
         0x00008080,"008080",
         0x00800000,"800000",
         0x00800080,"800080",
         0x00808000,"808000",
         0x00808080,"808080",
         0x00ffffff,"FFFFFF",
         0x00ffff00,"FFFF00",
         0x00ff00ff,"FF00FF",
         0x00ff0000,"FF0000",
         0x0000ffff,"00FFFF",
         0x0000ff00,"00FF00",
         0x000000ff,"0000FF",
         0x00c0c0c0,"C0C0C0",
         0x00c0dcc0,"C0DCC0",
         0x00a0a0a4,"A0A0A4",
         0x00a6caf0,"A6CAF0",
         0x00fffbf0,"FFFBF0"};
    switch(msg)
    {
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        SetBkMode(hdc,TRANSPARENT);
        for(int j=0;j<5;j++)
        {
            for(int i=0;i<4;i++)
            {
                hBrush=CreateSolidBrush(colorTable[j][i].color);
                SelectObject(hdc,hBrush);
                Rectangle(hdc,i*60,j*40,i*60+60,j*40+40);
                if ((LOBYTE(HIWORD(colorTable[j][i].color))+
                     HIBYTE(LOWORD(colorTable[j][i].color))+
                     LOBYTE(LOWORD(colorTable[j][i].color)))<=0x0080)
                    SetTextColor(hdc,0x00c0c0c0);
                else
                    SetTextColor(hdc,0x00000000);
                TextOut(hdc,i*60+5,j*40+15,colorTable[j][i].value,6);
                DeleteObject(hBrush);
            }
        }
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        DeleteObject(hBrush);
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW|CS_VREDRAW;
    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)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "CreateSolidBrush",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,252, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}


GetBrushOrgEx

GetBrushOrgEx

Функция GetBrushOrgEx возвращает начало координат текущей кисти для указанного контекста устройства. Эта функция заменяет функцию GetBrushOrg.

BOOL GetBrushOrgEx(
  HDC hdc,       // хэндл DC
  LPPOINT lppt   // координаты начала координат
);

Параметры

hdc
[in] Хэндл контекста устройства.
lppt
[out] Указатель на структуру POINT, которая получит начало координат кисти, в координатах устройства.

Возврат значения

Если функция успешна, возвращаемое значение не ноль.

Если функция неуспешна, возвращаемое значение ноль.

Windows NT/2000/XP: Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Замечания

Кисть это битмап, который система использует для рисования внутри заливаемых фигур.

Начало координат кисти - этонабор значений между 0 и 7, определяющий расположение одного пикселя в битмапе. Начало координат по умолчанию (0,0). Для горизонтальных координат, значение 0 соответствует самому левому столбцу пикселей; значение 7 соответствует самому правому столбцу пикселей. Для вертикальных координат, значение 0 соответствует самому верхнему ряду пикселей; значение 7 соответствует самому нижнему ряду пикселей. Когда система располагает кисть в начале какой-нибудь операции отрисовки, она наносит координаты кисти в место в клиентсой области окна, указанное началом координат кисти. Например, если начало координат установлено в (2,3), система располагает начало кординат кисти (0,0) в месте (2,3) клиентской области окна.

Если приложение использует кисть для заливки фона обоих, родительского и дочернего окон с сочетающимися цветами, может оказаться необходимо установить начало координат после отрисивки родительского окна, но перед отрисовкой дочернего окна.

Windows NT/2000/XP: Система автоматически отслеживает начала координат всех управляемых окнами контекстов устройств, и приспосабливает их кисти, если необходимо, для поддержки выравнивания образцов на поверхности.

Windows 95/98/Me: Автоматическое отслеживание начала координат кистей не поддерживается. Приложение должно использовать функции UnrealizeObject, SetBrushOrgEx, и SelectObject для выравнивания кисти перед её использованием.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.
Библиотека: Используйте Gdi32.lib.

См. так же

POINT | SelectObject | SetBrushOrgEx | UnrealizeObject

GetBrushOrgEx

The GetBrushOrgEx function retrieves the current brush origin for the specified device context. This function replaces the GetBrushOrg function.

BOOL GetBrushOrgEx(
  HDC hdc,       // handle to DC
  LPPOINT lppt   // coordinates of origin
);

Parameters

hdc
[in] Handle to the device context.
lppt
[out] Pointer to a POINT structure that receives the brush origin, in device coordinates.

Return Values

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero.

Windows NT/2000/XP: To get extended error information, call GetLastError.

Remarks

A brush is a bitmap that the system uses to paint the interiors of filled shapes.

The brush origin is a set of coordinates with values between 0 and 7, specifying the location of one pixel in the bitmap. The default brush origin coordinates are (0,0). For horizontal coordinates, the value 0 corresponds to the leftmost column of pixels; the value 7 corresponds to the rightmost column. For vertical coordinates, the value 0 corresponds to the uppermost row of pixels; the value 7 corresponds to the lowermost row. When the system positions the brush at the start of any painting operation, it maps the origin of the brush to the location in the window's client area specified by the brush origin. For example, if the origin is set to (2,3), the system maps the origin of the brush (0,0) to the location (2,3) on the window's client area.

If an application uses a brush to fill the backgrounds of both a parent and a child window with matching colors, it may be necessary to set the brush origin after painting the parent window but before painting the child window.

Windows NT/2000/XP: The system automatically tracks the origin of all window-managed device contexts and adjusts their brushes as necessary to maintain an alignment of patterns on the surface.

Windows 95/98/Me: Automatic tracking of the brush origin is not supported. Applications must use the UnrealizeObject, SetBrushOrgEx, and SelectObject functions to align the brush before using it.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

See Also

POINT | SelectObject | SetBrushOrgEx | UnrealizeObject

Описание примера GetBrushOrgEx

В обработке события WM_CREATE:

  • Приложение создаёт монохромный битмап вызовом функции CreateBitmap;
  • Создаётся кисть с образцом этого битмапа CreatePatternBrush;
  • Создаётся таймер, посылающий сообщения WM_TIMER каждые пол секунды.

В обработке события прихода сообщения WM_TIMER изменяется переменная brOrig, отвечающая за координаты начала кисти, и перерисовывается окно InvalidateRect.

В обработке события WM_PAINT:

  • Созданная в событии WM_CREATE кисть выбирается в контекст устройства SelectObject;
  • Устанавливаются новые, изменённые в событии WM_TIMER, координаты кисти функцией SetBrushOrgEx;
  • Вызывается функция RoundRect, рисующая прямоугольник со скруглёнными по эллипсу краями и заливающая его текущей кистью с изменёнными координатами;
  • Функцией GetBrushOrgEx возвращаются текущие координаты кисти в переменную curBrOrig, и текущие начальные координаты кисти выводятся на экран функцией TextOut.

Созданные кисть и битмап удаляеюся при закрытии окна, и убивается таймер.

Внешний вид примера GetBrushOrgEx

GetBrushOrgEx
достать/запустить пример GetBrushOrgEx.exe

Исходный текст примера GetBrushOrgEx

GetBrushOrgEx.cpp

#include <windows.h>
#define TIMER_ID 1
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    POINT curBrOrig;
    char buf[10];
    static HBRUSH hBrush;
    static HBITMAP hBmp;
    static POINT brOrig;

    const WORD bits[16]={0x7fff,
                         0x7fff,
                         0x7fff,
                         0x7fff,
                         0x7fff,
                         0x7fff,
                         0x7fff,
                         0x7fff,
                         0xff7f,
                         0xff7f,
                         0xff7f,
                         0xff7f,
                         0xff7f,
                         0xff7f,
                         0xff7f,
                         0xff7f};
    switch(msg)
    {
    case WM_CREATE:
        hBmp=CreateBitmap(16,16,1,1,bits);
        hBrush=CreatePatternBrush(hBmp);
        SetTimer(hwnd,TIMER_ID,500,NULL);
        brOrig.x=0;
        brOrig.y=0;
        break;
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        SelectObject(hdc,hBrush);
        SetBrushOrgEx(hdc,brOrig.x,brOrig.y,NULL);
        RoundRect(hdc,25,40,175,160,100,70);
        TextOut(hdc,10,10,"curBrOrig.y=    ",16);
        GetBrushOrgEx(hdc,&curBrOrig);
        if(curBrOrig.y<12)
            TextOut(hdc,90,10,itoa(curBrOrig.y,buf,10),1);
        else
            TextOut(hdc,90,10,itoa(curBrOrig.y,buf,10),2);
        EndPaint(hwnd,&ps);
        break;
    case WM_TIMER:
        if(brOrig.y<12)
            brOrig.y+=4;
        else
            brOrig.y=0;
        InvalidateRect(hwnd,NULL,false);
        break;
    case WM_CLOSE:
        DeleteObject(hBrush);
        DeleteObject(hBmp);
        KillTimer(hwnd,TIMER_ID);
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW|CS_VREDRAW;
    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)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "GetBrushOrgEx",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,212, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}


GetSysColorBrush

GetSysColorBrush

Функция GetSysColorBrush возвращает хэндл, идентифицирующий логическую кисть, которая соответствует указанному индексу цвета.

HBRUSH GetSysColorBrush(
  int nIndex  // индекс системного цвета
);

Параметры

nIndex
[in] Определяет индекс цвета. "Это значение соответствует цвету, который используется для отрисовки одного из элементов окна.

Возврат значения

Возвращаемое значение идентифицирует логическую кисть, если параметр nIndex поддерживается текущей платформой. Иначе, функция вернёт NULL.

Замечания

Кисть это битмап, который система использует для рисования внутри заливаемых фигур. Приложение может получить текущие системные цвета вызовом функции GetSysColor. Приложение может установить текущие системные цвета вызовом функции SetSysColors.

Приложение не должно регистрировать класс окна для окна, используя системную кисть. Для регистрации класса окна с системным цветом, смотрите документацию на член hbrBackground структур WNDCLASS или WNDCLASSEX.

Кисти системного цвета отслеживают изменения в системных цветах. Другими словами, когда пользователь изменяет системный цвет, ассоциированная кисть системного цвета автоматически изменяется в нужный цвет.

Для рисования кистью системного цвета, приложение должно использовать GetSysColorBrush(nIndex) вместо CreateSolidBrush(GetSysColor(nIndex)), поскольку GetSysColorBrush возвращает запасённую кисть вместо размещения новой.

Кисти системного цвета находятся в собственности системы и не должны уничтожаться.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.
Библиотека: Используйте Gdi32.lib.

См. так же

CreateSolidBrush | GetSysColor | SetSysColors | WNDCLASS | WNDCLASSEX

GetSysColorBrush

The GetSysColorBrush function retrieves a handle identifying a logical brush that corresponds to the specified color index.

HBRUSH GetSysColorBrush(
  int nIndex  // system color index
);

Parameters

nIndex
[in] Specifies a color index. This value corresponds to the color used to paint one of the window elements.

Return Values

The return value identifies a logical brush if the nIndex parameter is supported by the current platform. Otherwise, it returns NULL.

Remarks

A brush is a bitmap that the system uses to paint the interiors of filled shapes. An application can retrieve the current system colors by calling the GetSysColor function. An application can set the current system colors by calling the SetSysColors function.

An application must not register a window class for a window using a system brush. To register a window class with a system color, see the documentation of the hbrBackground member of the WNDCLASS or WNDCLASSEX structures.

System color brushes track changes in system colors. In other words, when the user changes a system color, the associated system color brush automatically changes to the new color.

To paint with a system color brush, an application should use GetSysColorBrush(nIndex) instead of

CreateSolidBrush(GetSysColor(nIndex)), because GetSysColorBrush returns a cached brush instead of allocating a new one.

System color brushes are owned by the system and must not be destroyed.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

See Also

CreateSolidBrush | GetSysColor | SetSysColors | WNDCLASS | WNDCLASSEX

Описание примера GetSysColorBrush

Это признак хорошего тона, когда приложение рисует системными цветами. Пользователь может их настраивать по своему усмотрению на вкладке "Оформление" в "Свойствах Экрана".

В обработке события WM_CREATE приложение создаёт окно ComboBoxList-а, заполняет выпадающий список и получает хэндл системной кисти вызовом функции CreateSysColorBrush;

В обработке события выбора пользователем элемента из списка, приложение получает хэндл новой системной кисти CreateSysColorBrush с выбранным пользователем индексом системного цвета.

В обработке события WM_PAINT вызывается функция FillRect, заливающая прямоугольник указанной кистью.

При закрытии окна кисть удалять не нужно, т.к. она системная.

Пример демонстрирует все возможные индексы системных цветов.

Внешний вид примера GetSysColorBrush

GetSysColorBrush
достать/запустить пример GetSysColorBrush.exe

Исходный текст примера GetSysColorBrush

GetSysColorBrush.cpp

#include <windows.h>
#include "adddef.h"
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    static HWND hwndComboBox;
    static HBRUSH hBrush;
    const RECT rect={50,50,200,150};
    switch(msg)
    {
    case WM_CREATE:
        hwndComboBox=CreateWindow("COMBOBOX","Combo",
            WS_VISIBLE|WS_CHILD|WS_VSCROLL|CBS_DROPDOWNLIST,
            0,165,250,200,hwnd,NULL,
            (HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),
            NULL);
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"COLOR_3DDKSHADOW");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"COLOR_3DFACE");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"COLOR_BTNFACE");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"COLOR_3DHILIGHT");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"COLOR_3DHIGHLIGHT");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"COLOR_BTNHILIGHT");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"COLOR_BTNHIGHLIGHT");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"COLOR_3DLIGHT");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"COLOR_3DSHADOW");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"COLOR_BTNSHADOW");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"COLOR_ACTIVEBORDER");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"COLOR_ACTIVECAPTION");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"COLOR_APPWORKSPACE");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"COLOR_BACKGROUND");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"COLOR_DESKTOP");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"COLOR_BTNTEXT");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"COLOR_CAPTIONTEXT");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"COLOR_GRADIENTACTIVECAPTION");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"COLOR_GRADIENTINACTIVECAPTION");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"COLOR_GRAYTEXT");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"COLOR_HIGHLIGHT");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"COLOR_HIGHLIGHTTEXT");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"COLOR_HOTLIGHT");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"COLOR_INACTIVEBORDER");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"COLOR_INACTIVECAPTION");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"COLOR_INACTIVECAPTIONTEXT");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"COLOR_INFOBK");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"COLOR_INFOTEXT");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"COLOR_MENU");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"COLOR_MENUHILIGHT");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"COLOR_MENUBAR");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"COLOR_MENUTEXT");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"COLOR_SCROLLBAR");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"COLOR_WINDOW");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"COLOR_WINDOWFRAME");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"COLOR_WINDOWTEXT");
        SendMessage(hwndComboBox,CB_SETCURSEL,0,0);
        hBrush=GetSysColorBrush(COLOR_3DDKSHADOW);
        break;
    case WM_COMMAND:
        if(lParam==(LPARAM)hwndComboBox)
            if(HIWORD(wParam)==CBN_SELCHANGE)
            {
                switch(SendMessage(hwndComboBox,CB_GETCURSEL,0,0))
                {
                case 0:
                    hBrush=GetSysColorBrush(COLOR_3DDKSHADOW);
                    break;
                case 1:
                    hBrush=GetSysColorBrush(COLOR_3DFACE);
                    break;
                case 2:
                    hBrush=GetSysColorBrush(COLOR_BTNFACE);
                    break;
                case 3:
                    hBrush=GetSysColorBrush(COLOR_3DHILIGHT);
                    break;
                case 4:
                    hBrush=GetSysColorBrush(COLOR_3DHIGHLIGHT);
                    break;
                case 5:
                    hBrush=GetSysColorBrush(COLOR_BTNHILIGHT);
                    break;
                case 6:
                    hBrush=GetSysColorBrush(COLOR_BTNHIGHLIGHT);
                    break;
                case 7:
                    hBrush=GetSysColorBrush(COLOR_3DLIGHT);
                    break;
                case 8:
                    hBrush=GetSysColorBrush(COLOR_3DSHADOW);
                    break;
                case 9:
                    hBrush=GetSysColorBrush(COLOR_BTNSHADOW);
                    break;
                case 10:
                    hBrush=GetSysColorBrush(COLOR_ACTIVEBORDER);
                    break;
                case 11:
                    hBrush=GetSysColorBrush(COLOR_ACTIVECAPTION);
                    break;
                case 12:
                    hBrush=GetSysColorBrush(COLOR_APPWORKSPACE);
                    break;
                case 13:
                    hBrush=GetSysColorBrush(COLOR_BACKGROUND);
                    break;
                case 14:
                    hBrush=GetSysColorBrush(COLOR_DESKTOP);
                    break;
                case 15:
                    hBrush=GetSysColorBrush(COLOR_BTNTEXT);
                    break;
                case 16:
                    hBrush=GetSysColorBrush(COLOR_CAPTIONTEXT);
                    break;
                case 17:
                    hBrush=GetSysColorBrush(COLOR_GRADIENTACTIVECAPTION);
                    break;
                case 18:
                    hBrush=GetSysColorBrush(COLOR_GRADIENTINACTIVECAPTION);
                    break;
                case 19:
                    hBrush=GetSysColorBrush(COLOR_GRAYTEXT);
                    break;
                case 20:
                    hBrush=GetSysColorBrush(COLOR_HIGHLIGHT);
                    break;
                case 21:
                    hBrush=GetSysColorBrush(COLOR_HIGHLIGHTTEXT);
                    break;
                case 22:
                    hBrush=GetSysColorBrush(COLOR_HOTLIGHT);
                    break;
                case 23:
                    hBrush=GetSysColorBrush(COLOR_INACTIVEBORDER);
                    break;
                case 24:
                    hBrush=GetSysColorBrush(COLOR_INACTIVECAPTION);
                    break;
                case 25:
                    hBrush=GetSysColorBrush(COLOR_INACTIVECAPTIONTEXT);
                    break;
                case 26:
                    hBrush=GetSysColorBrush(COLOR_INFOBK);
                    break;
                case 27:
                    hBrush=GetSysColorBrush(COLOR_INFOTEXT);
                    break;
                case 28:
                    hBrush=GetSysColorBrush(COLOR_MENU);
                    break;
                case 29:
                    hBrush=GetSysColorBrush(COLOR_MENUHILIGHT);
                    break;
                case 30:
                    hBrush=GetSysColorBrush(COLOR_MENUBAR);
                    break;
                case 31:
                    hBrush=GetSysColorBrush(COLOR_MENUTEXT);
                    break;
                case 32:
                    hBrush=GetSysColorBrush(COLOR_SCROLLBAR);
                    break;
                case 33:
                    hBrush=GetSysColorBrush(COLOR_WINDOW);
                    break;
                case 34:
                    hBrush=GetSysColorBrush(COLOR_WINDOWFRAME);
                    break;
                case 35:
                    hBrush=GetSysColorBrush(COLOR_WINDOWTEXT);
                    break;
            }
            InvalidateRect(hwnd,NULL,true);
            }
        break;
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        SetBkMode(hdc,TRANSPARENT);
        if(hBrush!=NULL)
            {
                FillRect(hdc,&rect,hBrush);
            }
        else
            TextOut(hdc,60,100,"не поддерживается",17);
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{

    HWND hwnd;

    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = 0;
    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 = CreateSolidBrush(0x006acaf0);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "GetSysColorBrush",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,262, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    MSG msg;

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

adddef.h

/*мой компилятор не нашёл эти константы в WinUser.h,
поэтому пришлось дописать их самому*/

#define COLOR_HOTLIGHT                   26
#define COLOR_GRADIENTACTIVECAPTION      27
#define COLOR_GRADIENTINACTIVECAPTION    28
#define COLOR_MENUHILIGHT                29
#define COLOR_MENUBAR                    30


PatBlt

PatBlt

Функция PatBlt рисует указанный прямоугольник, используя кисть, которая в настоящий момент выбрана в указанный контекст устройства. Цвет кисти и цвет или цвета поверхности объединяются с использование растровой операции.

BOOL PatBlt(
  HDC hdc,      // хэндл DC
  int nXLeft,   // x-координата верхнего левого угла прямоуг.
  int nYLeft,   // y-координата верхнего левого угла прямоуг.
  int nWidth,   // ширина прямоугольника
  int nHeight,  // высота прямоугольника
  DWORD dwRop   // код растровой операции
);

Параметры

hdc
[in] Хэндл контекста устройства.
nXLeft
[in] Определяет x-координату, в логических единицах, верхнего левого угла заливаемого прямоугольника.
nYLeft
[in] Определяет y-координату, в логических единицах, верхнего левого угла заливаемого прямоугольника.
nWidth
[in] Определяет ширину прямоугольника в логических единицах.
nHeight
[in] Определяет высоту прямоугольника в логических единицах.
dwRop
[in] Определяет код растровой операции. Этот код может иметь одно из следующих значений:

Величина | Значение
PATCOPY | Копирует указанный образец в битмап назначения.
PATINVERT | Комбинирует цвета указанного образца с цветами прямоугольника назначения с использованием булевого оператора XOR.
DSTINVERT | Инвертирует прямоугольник назначения.
BLACKNESS | Заливает прямоугольник назначения, используя цвет, ассоциированный с индексом 0 в физической палитре. (Этот цвет чёрный для физической палитре по умолчанию.)
WHITENESS | Заливает прямоугольник назначения, используя цвет, ассоциированный с индексом 1 в физической палитре. (Этот цвет белый для физической палитре по умолчанию.)

Возврат значения

Если функция успешна, возвращаемое значение не ноль.

Если функция неуспешна, возвращаемое значение ноль.

Windows NT/2000/XP: Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Замечания

Значения параметра dwRop для этой функции ограничены поднабором 256 троичных кодов растровых операций; в частности, код операции, который относится к исходному прямоугольнику, не может быть использован.

Не все устройства поддерживают функцию PatBlt. Дополнительную информацию см. в обсуждении возможности RC_BITBLT в функции GetDeviceCaps.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.
Библиотека: Используйте Gdi32.lib.

См. так же

GetDeviceCaps

PatBlt

The PatBlt function paints the specified rectangle using the brush that is currently selected into the specified device context. The brush color and the surface color or colors are combined by using the specified raster operation.

BOOL PatBlt(
  HDC hdc,      // handle to DC
  int nXLeft,   // x-coord of upper-left rectangle corner
  int nYLeft,   // y-coord of upper-left rectangle corner
  int nWidth,   // width of rectangle
  int nHeight,  // height of rectangle
  DWORD dwRop   // raster operation code
);

Parameters

hdc
[in] Handle to the device context.
nXLeft
[in] Specifies the x-coordinate, in logical units, of the upper-left corner of the rectangle to be filled.
nYLeft
[in] Specifies the y-coordinate, in logical units, of the upper-left corner of the rectangle to be filled.
nWidth
[in] Specifies the width, in logical units, of the rectangle.
nHeight
[in] Specifies the height, in logical units, of the rectangle.
dwRop
[in] Specifies the raster operation code. This code can be one of the following values.

Value | Meaning
PATCOPY | Copies the specified pattern into the destination bitmap.
PATINVERT | Combines the colors of the specified pattern with the colors of the destination rectangle by using the Boolean XOR operator.
DSTINVERT | Inverts the destination rectangle.
BLACKNESS | Fills the destination rectangle using the color associated with index 0 in the physical palette. (This color is black for the default physical palette.)
WHITENESS | Fills the destination rectangle using the color associated with index 1 in the physical palette. (This color is white for the default physical palette.)

Return Values

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero.

Windows NT/2000/XP: To get extended error information, call GetLastError.

Remarks

The values of the dwRop parameter for this function are a limited subset of the full 256 ternary raster-operation codes; in particular, an operation code that refers to a source rectangle cannot be used.

Not all devices support the PatBlt function. For more information, see the description of the RC_BITBLT capability in the GetDeviceCaps function.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

See Also

GetDeviceCaps

Описание примера PatBlt

При создании окна в его классе кисть фона создаётся вызовом функции CreatePatternBrush с образцом битмапа, созданного функцией LoadBitmap.

В обработке события WM_CREATE:

  • Приложение получает хэндл запущеного экземпляра программы вызовом функции GetModuleHandle, он нам понадобится для загрузки битмапа;
  • Загружается битмап из ресурсов выполняющейся программы вызовом функции LoadBitmap;
  • Создаётся кисть с образцом этого битмапа CreatePatternBrush;
  • Далее приложение создаёт окно ComboBoxList-а, заполняет выпадающий список и инициализирует начальным значением переменную dwRop.

В обработке события WM_PAINT:

  • Созданная в событии WM_CREATE кисть выбирается в контекст устройства вызовом функции SelectObject;
  • Вызывается функция PatBlt с выбираемым из выпадающего списка кодом растровой операции, рисующая прямоугольник с указанным началом и габаритами, заполняя его текущей кистью с кодом растровой операции.

Созданные кисть и битмап удаляются при закрытии окна.

Внешний вид примера PatBlt

PatBlt
достать/запустить пример PatBlt.exe

Исходный текст примера PatBlt

PatBlt.cpp

#include <windows.h>
#include "resource.h"
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    static HWND hwndComboBox;
    static HINSTANCE hInstance;
    static HBRUSH hBrush;
    static HBITMAP hBmp;
    static DWORD dwRop;

    switch(msg)
    {
    case WM_CREATE:
        hInstance=(HINSTANCE)GetModuleHandle(NULL);
        hBmp=LoadBitmap(hInstance,MAKEINTRESOURCE(BITMAP_ID2));
        hBrush=CreatePatternBrush(hBmp);

        hwndComboBox=CreateWindow("COMBOBOX","Combo",
            WS_VISIBLE|WS_CHILD|WS_VSCROLL|CBS_DROPDOWNLIST,
            10,165,150,130,hwnd,NULL,
            (HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),
            NULL);
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"PATCOPY");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"PATINVERT");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"DSTINVERT");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"BLACKNESS");
        SendMessage(hwndComboBox,CB_ADDSTRING,0,
            (LPARAM)(LPCTSTR)"WHITENESS");
        SendMessage(hwndComboBox,CB_SETCURSEL,0,0);
        dwRop=PATCOPY;
        break;
    case WM_COMMAND:
        if(lParam==(LPARAM)hwndComboBox)
            if(HIWORD(wParam)==CBN_SELCHANGE)
            {
                switch(SendMessage(hwndComboBox,CB_GETCURSEL,0,0))
                {
                case 0:
                    dwRop=PATCOPY;
                    break;
                case 1:
                    dwRop=PATINVERT;
                    break;
                case 2:
                    dwRop=DSTINVERT;
                    break;
                case 3:
                    dwRop=BLACKNESS;
                    break;
                case 4:
                    dwRop=WHITENESS;
            }
            InvalidateRect(hwnd,NULL,true);
        }
        break;
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        SelectObject(hdc,hBrush);
        PatBlt(hdc,50,50,100,100,dwRop);
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE:
        DeleteObject(hBrush);
        DeleteObject(hBmp);
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW|CS_VREDRAW;
    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 = CreatePatternBrush(LoadBitmap(hInstance,MAKEINTRESOURCE(BITMAP_ID1)));
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "PatBlt",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,212, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}

resource.rc

#include "resource.h"
BITMAP_ID1 BITMAP "gradient.bmp"
BITMAP_ID2 BITMAP "ColorRounds.bmp"

resource.h

#define BITMAP_ID1 10
#define BITMAP_ID2 20


SetBrushOrgEx

SetBrushOrgEx

Функция SetBrushOrgEx устанавливает начало координат, которое GDI свяжет со следующей кистью, выбранной приложением в контекст устройства.

BOOL SetBrushOrgEx(
  HDC hdc,       // хэндл контекста устройства
  int nXOrg,     // x-координата нового начала координат
  int nYOrg,     // y-координата нового начала координат
  LPPOINT lppt   // указывает на прежнее начало координат
);

Параметры

hdc
[in] Хэндл контекста устройства.
nXOrg
[in] Определяет x-координату, в единицах устройства, нового начала координат кисти. Если это значение больше, чем ширина кисти, это значение уненьшается использованием оператора получения остатка от деления (nXOrg mod ширина кисти).
nYOrg
[in] Определяет y-координату, в единицах устройства, нового начала координат кисти. Если это значение больше, чем ширина кисти, это значение уненьшается использованием оператора получения остатка от деления (nXOrg mod высота кисти).
lppt
[out] Указатель на структуру POINT, которая получит предыдущее начало координат кисти.

Этот параметр может быть NULL, ести не требуется предыдущее начало координат кисти.

Возврат значения

Если функция успешна, возвращаемое значение не ноль.

Если функция неуспешна, возвращаемое значение ноль.

Windows NT/2000/XP: Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Замечания

Кисть это битмап, который система использует для рисования внутри заливаемых фигур.

Начало координат кисти - это пара координат, определяющих расположение одного пикселя в битмапе. Начало координат кисти по умолчанию - (0,0). Для горизонтальных координат, значение 0 соответствует самому левому столбцу пикселей; ширина соответствует самому правому столбцу. Для вертикальных координат, значение 0 соответствует самой верхней строке пикселей; высота соответствует нижней строке.

Система автоматически отслеживает начала координат всех управляемых окнами контекстов устройств и регулирует их кисти, если необходимо, для поддержки выравнивания образцов на поверхности. Начало координат кисти, которое установлено вызовом этой функции, относистся к верхнему левому углу клиентской области.

Приложение должно вызвать SetBrushOrgEx после установки режима растяжки витмапа в HALFTONE использованием функции SetStretchBltMode. Это позволит избежать неверной привязки кисти.

Windows NT/2000/XP: Система автоматически отслеживает начала координат всех управляемых окнами контекстов устройств, и приспосабливает их кисти, если необходимо, для поддержки выравнивания образцов на поверхности.

Windows 95/98/Me: Автоматическое отслеживание начала координат кистей не поддерживается. Приложение должно использовать функции UnrealizeObject, SetBrushOrgEx, и SelectObject для выравнивания кисти перед её использованием.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.
Библиотека: Используйте Gdi32.lib.

См. так же

GetBrushOrgEx | POINT | SelectObject | SetStretchBltMode | UnrealizeObject

SetBrushOrgEx

The SetBrushOrgEx function sets the brush origin that GDI assigns to the next brush an application selects into the specified device context.

BOOL SetBrushOrgEx(
  HDC hdc,       // handle to device context
  int nXOrg,     // x-coord of new origin
  int nYOrg,     // y-coord of new origin
  LPPOINT lppt   // points to previous brush origin
);

Parameters

hdc
[in] Handle to the device context.
nXOrg
[in] Specifies the x-coordinate, in device units, of the new brush origin. If this value is greater than the brush width, its value is reduced using the modulus operator (nXOrg mod brush width).
nYOrg
[in] Specifies the y-coordinate, in device units, of the new brush origin. If this value is greater than the brush height, its value is reduced using the modulus operator (nYOrg mod brush height).
lppt
[out] Pointer to a POINT structure that receives the previous brush origin.

This parameter can be NULL if the previous brush origin is not required.

Return Values

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero.

Windows NT/2000/XP: To get extended error information, call GetLastError.

Remarks

A brush is a bitmap that the system uses to paint the interiors of filled shapes.

The brush origin is a pair of coordinates specifying the location of one pixel in the bitmap. The default brush origin coordinates are (0,0). For horizontal coordinates, the value 0 corresponds to the leftmost column of pixels; the width corresponds to the rightmost column. For vertical coordinates, the value 0 corresponds to the uppermost row of pixels; the height corresponds to the lowermost row.

The system automatically tracks the origin of all window-managed device contexts and adjusts their brushes as necessary to maintain an alignment of patterns on the surface. The brush origin that is set with this call is relative to the upper-left corner of the client area.

An application should call SetBrushOrgEx after setting the bitmap stretching mode to HALFTONE by using SetStretchBltMode. This must be done to avoid brush misalignment.

Windows NT/2000/XP: The system automatically tracks the origin of all window-managed device contexts and adjusts their brushes as necessary to maintain an alignment of patterns on the surface.

Windows 95/98/Me: Automatic tracking of the brush origin is not supported. Applications must use the UnrealizeObject, SetBrushOrgEx, and SelectObject functions to align the brush before using it.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

See Also

GetBrushOrgEx | POINT | SelectObject | SetStretchBltMode | UnrealizeObject

Описание примера SetBrushOrgEx

В обработке события WM_CREATE:

  • Создаётся штриховая кисть CreateHatchBrush;
  • Создаётся таймер, посылающий сообщения WM_TIMER каждые 50 миллисекунд.

В обработке события прихода сообщения WM_TIMER увеличиваeтся переменная, отвечающая за координаты начала кисти, и перерисовывается окно InvalidateRect.

В обработке события WM_PAINT:

  • Созданная в событии WM_CREATE кисть выбирается в контекст устройства SelectObject;
  • Устанавливаются новые, изменённые в событии WM_TIMER, координаты кисти функцией SetBrushOrgEx;
  • Вызывается функция RoundRect, рисующая прямоугольник со скруглёнными по эллипсу краями и заливающая его текущей кистью с изменёнными координатами.

Созданная кисть удаляется при закрытии окна, и убивается таймер.

Внешний вид примера SetBrushOrgEx

SetBrushOrgEx
достать/запустить пример SetBrushOrgEx.exe

Исходный текст примера SetBrushOrgEx

SetBrushOrgEx.cpp

#include <windows.h>
#define TIMER_ID 1
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    static HBRUSH hBrush;
    static POINT newOrig;

    switch(msg)
    {
    case WM_CREATE:
        hBrush=CreateHatchBrush(HS_BDIAGONAL,0x00ff0000);
        SetTimer(hwnd,TIMER_ID,50,NULL);
        newOrig.x=0;
        newOrig.y=0;
        break;
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        SelectObject(hdc,hBrush);
        SetBrushOrgEx(hdc,newOrig.x,newOrig.y,NULL);
        RoundRect(hdc,25,40,175,160,100,70);
        EndPaint(hwnd,&ps);
        break;
    case WM_TIMER:
        newOrig.x++;
        newOrig.y++;
        InvalidateRect(hwnd,NULL,false);
        break;
    case WM_CLOSE:
        DeleteObject(hBrush);
        KillTimer(hwnd,TIMER_ID);
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW|CS_VREDRAW;
    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)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "SetBrushOrgEx",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,212, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}


LOGBRUSH

Структура LOGBRUSH определяет стиль, цвет, и образец физической кисти. Она используется функциями CreateBrushIndirect и ExtCreatePen.

typedef struct tagLOGBRUSH {
  UINT     lbStyle;
  COLORREF lbColor;
  LONG     lbHatch;
} LOGBRUSH, *PLOGBRUSH;

Члены

lbStyle
Определяет стиль кисти. Член lbStyle Должен иметь одно из следующих значений:

Величина | Значение
BS_DIBPATTERN Кисть с образцом определена спецификацией независимого от устройства (DIB). Если lbStyle - BS_DIBPATTERN, член lbHatch содержит хэндл упакованного DIB. Подродности см. в описании lbHatch.

Windows 95: Создание кистей из битмапов или DIB-ов больших чем 8 на 8 пикселей не поддерживается. Если указан больший битмап, используется только его часть.
BS_DIBPATTERN8X8 | Тоже что и BS_DIBPATTERN.
BS_DIBPATTERNPT | Кисть с образцом определена спецификацией независимого от устройства (DIB). Если lbStyle - BS_DIBPATTERN, член lbHatch содержит указатель на упакованный DIB. Подродности см. в описании lbHatch.
BS_HATCHED | Штриховая кисть.
BS_HOLLOW | Пустая кисть.
BS_NULL | Тоже что и BS_HOLLOW.
BS_PATTERN | Кисть с образцом определена битмапом в памяти.
BS_PATTERN8X8 | Тоже что и BS_PATTERN.
BS_SOLID | Сплошная кисть.

lbColor
Определяет цвет, которым рисует кисть. Если lbStyle имеет стиль BS_HOLLOW или BS_PATTERN, lbColor игнорируется.

Если lbStyle имеет стиль BS_DIBPATTERN или BS_DIBPATTERNPT, нижнее слово lbColor определяет, содержит ли член bmiColors структуры BITMAPINFO явные значения красного, зелёного, голубого (RGB) цветов или индексы в текуще-реализованной логической палитре. Член lbColor должен иметь одно из следующих значений:

Величина | Значение
DIB_PAL_COLORS | Таблица цветов содержит массив 16-битных индексов в текуще-реализованной логической палитре
DIB_RGB_COLORS | Таблица цветов содержит буквальные RGB значения.

Если lbStyle - BS_HATCHED или BS_SOLID, lbColor - COLORREF значение цвета. для создания значения цвета COLORREF используйте макрос RGB.

lbHatch
Определяет стиль штриховки. Значение зависит от стиля кисти, определённого в lbStyle.

Если lbStyle - BS_DIBPATTERN, член lbHatch содержит хэндл на упакованный DIB. Для получения этого хэндла, приложение вызывает функцию GlobalAlloc с GMEM_MOVEABLE (или LocalAlloc с LMEM_MOVEABLE) для расположения блока памяти, и затем заполняет память упакованным DIB-ом. Упакованный DIB содердит структуру BITMAPINFO и непосредственно следующующий за ней массив байтов, определяющий байты в битмапе.

Если lbStyle - BS_DIBPATTERNPT, член lbHatch содержит указатель на упакованный DIB. Указатель получается из блока памяти, созданного LocalAlloc с набором LMEM_FIXED или GlobalAlloc с набором GMEM_FIXED , или это указатель, возвращённый вызовом например LocalLock (хэндл_на_dib). Упакованный DIB содердит структуру BITMAPINFO и непосредственно следующующий за ней массив байтов, определяющий байты в битмапе.

Если lbStyle - BS_HATCHED, член lbHatch определяет направление линий, используемых для создания штриховой кисти. Он может иметь одно из следующих значений:

Величина | Значение
HS_BDIAGONAL | штриховка 45 градусов вверх слева на право
HS_CROSS | Пересекающиеся штрихи горизонтальные и вертикальные
HS_DIAGCROSS | Пересекающиеся штрихи под углом 45 градусов
HS_FDIAGONAL | штриховка 45 градусов вниз слева на право
HS_HORIZONTAL | Горизонтальная штриховка
HS_VERTICAL | Вертикальная штриховка

Если lbStyle - BS_PATTERN, lbHatch хэндл битмапа, определяющего образец. Битмап не может быть DIB секцией битмапа, созданного функцией CreateDIBSection.

Если lbStyle - BS_SOLID или BS_HOLLOW, lbHatch игнорируется.

Замечания

В то время как lbColor управляет цветом переднего фона штриховой кисти, функции SetBkMode и SetBkColor управляют цветом фона.

Windows 95: Создание кистей из битмапов или DIB-ов больших чем 8 на 8 пикселей не поддерживается. Если указан больший битмап, используется только его часть.

Windows 98/Me, Windows NT/2000/XP: Кисти могут создаваться из битмапов и DIB-ов больших чем 8 на 8 пикселей.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.

См. так же

BITMAPINFO | COLORREF | CreateBrushIndirect | CreateDIBSection | ExtCreatePen | LOGBRUSH32 | RGB | SetBkColor | SetBkMode

LOGBRUSH

The LOGBRUSH structure defines the style, color, and pattern of a physical brush. It is used by the CreateBrushIndirect and ExtCreatePen functions.

typedef struct tagLOGBRUSH {
  UINT     lbStyle;
  COLORREF lbColor;
  LONG     lbHatch;
} LOGBRUSH, *PLOGBRUSH;

Members

lbStyle
Specifies the brush style. The lbStyle member must be one of the following styles.

Value | Meaning
BS_DIBPATTERN A pattern brush defined by a device-independent bitmap (DIB) specification. If lbStyle is BS_DIBPATTERN, the lbHatch member contains a handle to a packed DIB. For more information, see discussion in lbHatch.

Windows 95: Creating brushes from bitmaps or DIBs larger than 8 by 8 pixels is not supported. If a larger bitmap is specified, only a portion of the bitmap is used.
BS_DIBPATTERN8X8 | Same as BS_DIBPATTERN.
BS_DIBPATTERNPT | A pattern brush defined by a device-independent bitmap (DIB) specification. If lbStyle is BS_DIBPATTERNPT, the lbHatch member contains a pointer to a packed DIB. For more information, see discussion in lbHatch.
BS_HATCHED | Hatched brush.
BS_HOLLOW | Hollow brush.
BS_NULL | Same as BS_HOLLOW.
BS_PATTERN | Pattern brush defined by a memory bitmap.
BS_PATTERN8X8 | Same as BS_PATTERN.
BS_SOLID | Solid brush.

lbColor
Specifies the color in which the brush is to be drawn. If lbStyle is the BS_HOLLOW or BS_PATTERN style, lbColor is ignored.

If lbStyle is BS_DIBPATTERN or BS_DIBPATTERNPT, the low-order word of lbColor specifies whether the bmiColors members of the BITMAPINFO structure contain explicit red, green, blue (RGB) values or indexes into the currently realized logical palette. The lbColor member must be one of the following values.

Value | Meaning
DIB_PAL_COLORS | The color table consists of an array of 16-bit indexes into the currently realized logical palette.
DIB_RGB_COLORS | The color table contains literal RGB values.

If lbStyle is BS_HATCHED or BS_SOLID, lbColor is a COLORREF color value. To create a COLORREFcolor value, use the RGB macro.

lbHatch
Specifies a hatch style. The meaning depends on the brush style defined by lbStyle.

If lbStyle is BS_DIBPATTERN, the lbHatch member contains a handle to a packed DIB. To obtain this handle, an application calls the GlobalAlloc function with GMEM_MOVEABLE (or LocalAlloc with LMEM_MOVEABLE) to allocate a block of memory and then fills the memory with the packed DIB. A packed DIB consists of a BITMAPINFO structure immediately followed by the array of bytes that define the pixels of the bitmap.

If lbStyle is BS_DIBPATTERNPT, the lbHatch member contains a pointer to a packed DIB. The pointer derives from the memory block created by LocalAlloc with LMEM_FIXED set or by GlobalAlloc with GMEM_FIXED set, or it is the pointer returned by a call like LocalLock (handle_to_the_dib). A packed DIB consists of a BITMAPINFO structure immediately followed by the array of bytes that define the pixels of the bitmap.

If lbStyle is BS_HATCHED, the lbHatch member specifies the orientation of the lines used to create the hatch. It can be one of the following values.

Value | Meaning
HS_BDIAGONAL | A 45-degree upward, left-to-right hatch
HS_CROSS | Horizontal and vertical cross-hatch
HS_DIAGCROSS | 45-degree crosshatch
HS_FDIAGONAL | A 45-degree downward, left-to-right hatch
HS_HORIZONTAL | Horizontal hatch
HS_VERTICAL | Vertical hatch

If lbStyle is BS_PATTERN, lbHatch is a handle to the bitmap that defines the pattern. The bitmap cannot be a DIB section bitmap, which is created by the CreateDIBSection function.

If lbStyle is BS_SOLID or BS_HOLLOW, lbHatch is ignored.

Remarks

Although lbColor controls the foreground color of a hatch brush, the SetBkMode and SetBkColor functions control the background color.

Windows 95: Creating brushes from bitmaps or DIBs larger than 8 by 8 pixels is not supported. If a larger bitmap is specified, only a portion of the bitmap is used.

Windows 98/Me, Windows NT/2000/XP: Brushes can be created from bitmaps or DIBs larger than 8 by 8 pixels.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.

See Also

BITMAPINFO | COLORREF | CreateBrushIndirect | CreateDIBSection | ExtCreatePen | LOGBRUSH32 | RGB | SetBkColor | SetBkMode

Без примера


LOGBRUSH32

Структура LOGBRUSH32 определяет стиль, цвет, и образец физической кисти. Она подобна LOGBRUSH, но она используется для поддержки совместимости между 32-битными платформами и 64-битными платформами, когда мы записывам запись метафайла на одной платформе, а затем, проигрываем на другой. Поэтому, она используется только в EMRCREATEBRUSHINDIRECT. Если код будет только на одной платформе, LOGBRUSH будет достаточно.

typedef struct tagLOGBRUSH32 {
  UINT     lbStyle;
  COLORREF lbColor;
  ULONG    lbHatch;
} LOGBRUSH32, *PLOGBRUSH32, NEAR *NPLOGBRUSH32, FAR *LPLOGBRUSH32;

Члены

lbStyle
Определяет стиль кисти. Член lbStyle Должен иметь одно из следующих значений:

Величина | Значение
BS_DIBPATTERN Кисть с образцом определена спецификацией независимого от устройства (DIB). Если lbStyle - BS_DIBPATTERN, член lbHatch содержит хэндл упакованного DIB. Подродности см. в описании lbHatch.

Windows 95: Создание кистей из битмапов или DIB-ов больших чем 8 на 8 пикселей не поддерживается. Если указан больший битмап, используется только его часть.
BS_DIBPATTERN8X8 | Тоже что и BS_DIBPATTERN.
BS_DIBPATTERNPT | Кисть с образцом определена спецификацией независимого от устройства (DIB). Если lbStyle - BS_DIBPATTERN, член lbHatch содержит указатель на упакованный DIB. Подродности см. в описании lbHatch.
BS_HATCHED | Штриховая кисть.
BS_HOLLOW | Пустая кисть.
BS_NULL | Тоже что и BS_HOLLOW.
BS_PATTERN | Кисть с образцом определена битмапом в памяти.
BS_PATTERN8X8 | Тоже что и BS_PATTERN.
BS_SOLID | Сплошная кисть.

lbColor
Определяет цвет, которым рисует кисть. Если lbStyle имеет стиль BS_HOLLOW или BS_PATTERN, lbColor игнорируется.

Если lbStyle имеет стиль BS_DIBPATTERN или BS_DIBPATTERNPT, нижнее слово lbColor определяет, содержит ли член bmiColors структуры BITMAPINFO явные значения красного, зелёного, голубого (RGB) цветов или индексы в текуще-реализованной логической палитре. Член lbColor должен иметь одно из следующих значений:

Величина | Значение
DIB_PAL_COLORS | Таблица цветов содержит массив 16-битных индексов в текуще-реализованной логической палитре
DIB_RGB_COLORS | Таблица цветов содержит буквальные RGB значения.

Если lbStyle - BS_HATCHED или BS_SOLID, lbColor - COLORREF значение цвета. для создания значения цвета COLORREF используйте макрос RGB.

lbHatch
Определяет стиль штриховки. Значение зависит от стиля кисти, определённого в lbStyle.

Если lbStyle - BS_DIBPATTERN, член lbHatch содержит хэндл на упакованный DIB. Для получения этого хэндла, приложение вызывает функцию GlobalAlloc с GMEM_MOVEABLE (или LocalAlloc с LMEM_MOVEABLE) для расположения блока памяти, и затем заполняет память упакованным DIB-ом. Упакованный DIB содердит структуру BITMAPINFO непосредственно следующую за массивом байтов, определяющим пиксели битмапа.

Если lbStyle - BS_DIBPATTERNPT, член lbHatch содержит указатель на упакованный DIB. Указатель получается из блока памяти, созданного LocalAlloc с набором LMEM_FIXED или GlobalAlloc с набором GMEM_FIXED , или это указатель, возвращённый вызовом например LocalLock (хэндл_на_dib). Упакованный DIB содердит структуру BITMAPINFO и непосредственно следующующий за ней массив байтов, определяющий байты в битмапе.

Если lbStyle - BS_HATCHED, член lbHatch определяет направление линий, используемых для создания штриховой кисти. Он может иметь одно из следующих значений:

Величина | Значение
HS_BDIAGONAL | штриховка 45 градусов вверх слева на право
HS_CROSS | Пересекающиеся штрихи горизонтальные и вертикальные
HS_DIAGCROSS | Пересекающиеся штрихи под углом 45 градусов
HS_FDIAGONAL | штриховка 45 градусов вниз слева на право
HS_HORIZONTAL | Горизонтальная штриховка
HS_VERTICAL | Вертикальная штриховка

Если lbStyle - BS_PATTERN, lbHatch хэндл битмапа, определяющего образец. Битмап не может быть DIB секцией битмапа, созданного функцией CreateDIBSection.

Если lbStyle - BS_SOLID или BS_HOLLOW, lbHatch is ignored.

Замечания

В то время как lbColor управляет цветом переднего фона штриховой кисти, функции SetBkMode и SetBkColor управляют цветом фона.

Кисти могут создаваться из битмапов и DIB-ов больших чем 8 на 8 пикселей.

Требования

Windows NT/2000/XP: Включена в 2000 и дальнейших.
Windows 95/98/Me: Не поддерживают.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.

См. так же

BITMAPINFO | COLORREF | EMRCREATEBRUSHINDIRECT | LOGBRUSH | RGB | SetBkColor | SetBkMode

LOGBRUSH32

The LOGBRUSH32 structure defines the style, color, and pattern of a physical brush. It is similar to LOGBRUSH, but it is used to maintain compatibility between 32-bit platforms and 64-bit platforms when we record the metafile record on one platform and then play it on another. Thus, it is only used in EMRCREATEBRUSHINDIRECT. If the code will only be on one platform, LOGBRUSH is sufficient.

typedef struct tagLOGBRUSH32 {
  UINT     lbStyle;
  COLORREF lbColor;
  ULONG    lbHatch;
} LOGBRUSH32, *PLOGBRUSH32, NEAR *NPLOGBRUSH32, FAR *LPLOGBRUSH32;

Members

lbStyle
Specifies the brush style. The lbStyle member must be one of the following styles.

Value | Meaning
BS_DIBPATTERN A pattern brush defined by a device-independent bitmap (DIB) specification. If lbStyle is BS_DIBPATTERN, the lbHatch member contains a handle to a packed DIB. For more information, see discussion in lbHatch.

Windows 95: Creating brushes from bitmaps or DIBs larger than 8 by 8 pixels is not supported. If a larger bitmap is specified, only a portion of the bitmap is used.
BS_DIBPATTERN8X8 | Same as BS_DIBPATTERN.
BS_DIBPATTERNPT | A pattern brush defined by a device-independent bitmap (DIB) specification. If lbStyle is BS_DIBPATTERNPT, the lbHatch member contains a pointer to a packed DIB. For more information, see discussion in lbHatch.
BS_HATCHED | Hatched brush.
BS_HOLLOW | Hollow brush.
BS_NULL | Same as BS_HOLLOW.
BS_PATTERN | Pattern brush defined by a memory bitmap.
BS_PATTERN8X8 | Same as BS_PATTERN.
BS_SOLID | Solid brush.

lbColor
Specifies the color in which the brush is to be drawn. If lbStyle is the BS_HOLLOW or BS_PATTERN style, lbColor is ignored.

If lbStyle is BS_DIBPATTERN or BS_DIBPATTERNPT, the low-order word of lbColor specifies whether the bmiColors members of the BITMAPINFO structure contain explicit red, green, blue (RGB) values or indexes into the currently realized logical palette. The lbColor member must be one of the following values.

Value | Meaning
DIB_PAL_COLORS | The color table consists of an array of 16-bit indexes into the currently realized logical palette.
DIB_RGB_COLORS | The color table contains literal RGB values.

If lbStyle is BS_HATCHED or BS_SOLID, lbColor is a COLORREF color value. To create a COLORREFcolor value, use the RGB macro.

lbHatch
Specifies a hatch style. The meaning depends on the brush style defined by lbStyle.

If lbStyle is BS_DIBPATTERN, the lbHatch member contains a handle to a packed DIB. To obtain this handle, an application calls the GlobalAlloc function with GMEM_MOVEABLE (or LocalAlloc with LMEM_MOVEABLE) to allocate a block of memory and then fills the memory with the packed DIB. A packed DIB consists of a BITMAPINFO structure immediately followed by the array of bytes that define the pixels of the bitmap.

If lbStyle is BS_DIBPATTERNPT, the lbHatch member contains a pointer to a packed DIB. The pointer derives from the memory block created by LocalAlloc with LMEM_FIXED set or by GlobalAlloc with GMEM_FIXED set, or it is the pointer returned by a call like LocalLock (handle_to_the_dib). A packed DIB consists of a BITMAPINFO structure immediately followed by the array of bytes that define the pixels of the bitmap.

If lbStyle is BS_HATCHED, the lbHatch member specifies the orientation of the lines used to create the hatch. It can be one of the following values.

Value | Meaning
HS_BDIAGONAL | A 45-degree upward, left-to-right hatch
HS_CROSS | Horizontal and vertical cross-hatch
HS_DIAGCROSS | 45-degree crosshatch
HS_FDIAGONAL | A 45-degree downward, left-to-right hatch
HS_HORIZONTAL | Horizontal hatch
HS_VERTICAL | Vertical hatch

If lbStyle is BS_PATTERN, lbHatch is a handle to the bitmap that defines the pattern. The bitmap cannot be a DIB section bitmap, which is created by the CreateDIBSection function.

If lbStyle is BS_SOLID or BS_HOLLOW, lbHatch is ignored.

Remarks

Although lbColor controls the foreground color of a hatch brush, the SetBkMode and SetBkColor functions control the background color.

Brushes can be created from bitmaps or DIBs larger than 8 by 8 pixels.

Requirements

Windows NT/2000/XP: Included in Windows 2000 and later.
Windows 95/98/Me: Unsupported.
Header: Declared in Wingdi.h; include Windows.h.

See Also

BITMAPINFO | COLORREF | EMRCREATEBRUSHINDIRECT | LOGBRUSH | RGB | SetBkColor | SetBkMode

Без примера


AngleArc

AngleArc

Функция AngleArc рисует отрезок линии и дугу. Отрезок рисуется из текущей позиции до начала дуги. Дуга рисуется по периметру круга с заданным радиусом и центром. Длина дуги определяется заданием углов начала и изгиба.

BOOL AngleArc(
  HDC hdc,            // хэндл контекста устройства
  int X,              // координата x центра круга
  int Y,              // координата y центра круга
  DWORD dwRadius,     // радиус круга
  FLOAT eStartAngle,  // угол начала дуги
  FLOAT eSweepAngle   // угол изгиба дуги
);

Параметры

hdc
[in] Хэндл контекста устройства.
X
[in] Указывает координату x, в логических единицах, центра круга.
Y
[in] Указывает координату y, в логических единицах, центра круга.
dwRadius
[in] Указывает радиус круга, в логических единицах. Это значение должно быть положительное.
eStartAngle
[in] Указывает угол начала, в градусах, относительно оси x.
eSweepAngle
[in] Указывает угол изгиба, в градусах, относительно угла начала.

Возврат значения

Если функция успешна, возвращаемое значение не ноль.

Если функция неуспешна, возвращаемое значение ноль.

Windows NT/2000/XP: Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Замечания

Функция AngleArc перемещает текущую позицию в конечную точку дуги.

Дуга может нарисоваться как эллиптическая, в зависимости от текущих трансформации и режима нанесения. Перед рисованием дуги, AngleArc рисует отрезок линии из текущей позиции до начала дуги.

Дуга рисуется построением воображаемого круга вокруг указанной точки центра с указанным радиусом. Начальная точка дуги определяется отсчётом против часовой стрелки от оси x по кругу количества градусов угла начала. Конечная точка подобным образом распологается по отсчёту против часовой стрелки от точки начала числа градусов угла изгиба.

Если угол изгиба более 360 градусов, дуга делает круг несколько раз.

Функция рисует линии, используя текущее перо. Фигура не закрашивается.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Не поддерживается
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.
Библиотека: Используйте Gdi32.lib.

См. так же

Arc | ArcTo | MoveToEx

AngleArc

The AngleArc function draws a line segment and an arc. The line segment is drawn from the current position to the beginning of the arc. The arc is drawn along the perimeter of a circle with the given radius and center. The length of the arc is defined by the given start and sweep angles.

BOOL AngleArc(
  HDC hdc,            // handle to device context
  int X,              // x-coordinate of circle's center
  int Y,              // y-coordinate of circle's center
  DWORD dwRadius,     // circle's radius
  FLOAT eStartAngle,  // arc's start angle
  FLOAT eSweepAngle   // arc's sweep angle
);

Parameters

hdc
[in] Handle to a device context.
X
[in] Specifies the x-coordinate, in logical units, of the center of the circle.
Y
[in] Specifies the y-coordinate, in logical units, of the center of the circle.
dwRadius
[in] Specifies the radius, in logical units, of the circle. This value must be positive.
eStartAngle
[in] Specifies the start angle, in degrees, relative to the x-axis.
eSweepAngle
[in] Specifies the sweep angle, in degrees, relative to the starting angle.

Return Values

If the arc is drawn, the return value is nonzero.

If the arc is not drawn, the return value is zero.

Windows NT/2000/XP: To get extended error information, call GetLastError.

Remarks

The AngleArc function moves the current position to the ending point of the arc.

The arc drawn by this function may appear to be elliptical, depending on the current transformation and mapping mode. Before drawing the arc, AngleArc draws the line segment from the current position to the beginning of the arc.

The arc is drawn by constructing an imaginary circle around the specified center point with the specified radius. The starting point of the arc is determined by measuring counterclockwise from the x-axis of the circle by the number of degrees in the start angle. The ending point is similarly located by measuring counterclockwise from the starting point by the number of degrees in the sweep angle.

If the sweep angle is greater than 360 degrees, the arc is swept multiple times.

This function draws lines by using the current pen. The figure is not filled.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Unsupported.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

See Also

Arc | ArcTo | MoveToEx

Описание примера AngleArc

В обработке события WM_PAINT вызывается функция AngleArc.

Обратите внимание, что функция AngleArc рисует линию из текущей позиции в начальную точку дуги.

Внешний вид примера AngleArc

AngleArc
достать/запустить пример AngleArc.exe

Исходный текст примера AngleArc

AngleArc.cpp

#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;

    switch(msg)
    {
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        MoveToEx(hdc,100,100,NULL);
        AngleArc(hdc,100,100,50,-45,270);
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW|CS_VREDRAW;
    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)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "AngleArc",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,212, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}


Arc

Arc

Функция Arc рисует эллиптическую дугу.

BOOL Arc(
  HDC hdc,         // хэндл контекста устройства
  int nLeftRect,   // x-координата верхнего левого угла прямоугольника
  int nTopRect,    // y-координата верхнего левого угла прямоугольника
  int nRightRect,  // x-координата нижнего правого угла прямоугольника
  int nBottomRect, // y-координата нижнего правого угла прямоугольника
  int nXStartArc,  // x-координата первой радиальной конечной точки
  int nYStartArc,  // y-координата первой радиальной конечной точки
  int nXEndArc,    // x-координата второй радиальной конечной точки
  int nYEndArc     // y-координата второй радиальной конечной точки
);

Параметры

hdc
[in] Хэндл на контекст устройства, где рисование имеет место.
nLeftRect
[in] Определяет x-координату, в логических единицах, верхнего левого угла ограничивающего прямоугольника.

Windows 95/98/Me: Сумма nLeftRect плюс nRightRect должна быть меньше чем 32768.

nTopRect
[in] Определяет y-координату, в логических единицах, верхнего левого угла ограничивающего прямоугольника.

Windows 95/98/Me: Сумма nTopRect плюс nBottomRect должна быть меньше чем 32768.

nRightRect
[in] Определяет x-координату, в логических единицах, нижнего правого угла ограничивающего прямоугольника.

Windows 95/98/Me: Сумма nLeftRect плюс nRightRect должна быть меньше чем 32768.

nBottomRect
[in] Определяет y-координату, в логических единицах, нижнего правого угла ограничивающего прямоугольника.

Windows 95/98/Me: Сумма nTopRect плюс nBottomRect должна быть меньше чем 32768.

nXStartArc
[in] Определяет x-координату, в логических единицах, конечной точки радиальной линии, определяющей начальную точку дуги.
nYStartArc
[in] Определяет y-координату, в логических единицах, конечной точки радиальной линии, определяющей начальную точку дуги.
nXEndArc
[in] Определяет x-координату, в логических единицах, конечной точки радиальной линии, определяющей конечную точку дуги.
nYEndArc
[in] Определяет y-координату, в логических единицах, конечной точки радиальной линии, определяющей конечную точку дуги.

Возврат значения

Если функция успешна, возвращаемое значение не ноль.

Если функция неуспешна, возвращаемое значение ноль.

Windows NT/2000/XP: Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Замечания

Точки (nLeftRect, nTopRect) и (nRightRect, nBottomRect) определяют ограничивающий прямоугольник. Эллипс, сформированный определённым ограничивающим прямоугольником,определяет кривизну дуги. Дуга простирается в текущем направлении рисования от точки, где она пересекает радиальный луч из центра ограничивающего прямоугольника в точку (nXStartArc, nYStartArc) . Дуга заканчивается, где она пересекает радиальный луч из центра в точку (nXEndArc, nYEndArc) . Если начальная и конечная точки совпадают, рисуется полный эллипс.

Дуга рисуется с использованием текущего пера; без закраски.

Текущая позиция ни используется, ни изменяется функцией Arc.

Windows 95/98/Me: Направление рисования всегда против часовой стрелки.

Windows NT/2000/XP: Используйте функции GetArcDirection и SetArcDirection для получения или назначения текущего направления рисования для контекста устройства. Направление рисования по умолчанию - против часовой стрелки.

Windows 95/98/Me: Сумма координат отсекающего прямоугольника не должна превышать 32,767. Сумма nLeftRect и nRightRect или nTopRect и nBottomRect параметров не должна превышать 32,767.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.
Библиотека: Используйте Gdi32.lib.

См. так же

AngleArc | ArcTo | Chord | Ellipse | GetArcDirection | Pie | SetArcDirection

Arc

The Arc function draws an elliptical arc.

BOOL Arc(
  HDC hdc,         // handle to device context
  int nLeftRect,   // x-coord of rectangle's upper-left corner
  int nTopRect,    // y-coord of rectangle's upper-left corner
  int nRightRect,  // x-coord of rectangle's lower-right corner
  int nBottomRect, // y-coord of rectangle's lower-right corner
  int nXStartArc,  // x-coord of first radial ending point
  int nYStartArc,  // y-coord of first radial ending point
  int nXEndArc,    // x-coord of second radial ending point
  int nYEndArc     // y-coord of second radial ending point
);

Parameters

hdc
[in] Handle to the device context where drawing takes place.
nLeftRect
[in] Specifies the x-coordinate, in logical units, of the upper-left corner of the bounding rectangle.

Windows 95/98/Me: The sum of nLeftRect plus nRightRect must be less than 32768.

nTopRect
[in] Specifies the y-coordinate, in logical units, of the upper-left corner of the bounding rectangle.

Windows 95/98/Me: The sum of nTopRect plus nBottomRect must be less than 32768.

nRightRect
[in] Specifies the x-coordinate, in logical units, of the lower-right corner of the bounding rectangle.

Windows 95/98/Me: The sum of nLeftRect plus nRightRect must be less than 32768.

nBottomRect
[in] Specifies the y-coordinate, in logical units, of the lower-right corner of the bounding rectangle.

Windows 95/98/Me: The sum of nTopRect plus nBottomRect must be less than 32768.

nXStartArc
[in] Specifies the x-coordinate, in logical units, of the ending point of the radial line defining the starting point of the arc.
nYStartArc
[in] Specifies the y-coordinate, in logical units, of the ending point of the radial line defining the starting point of the arc.
nXEndArc
[in] Specifies the x-coordinate, in logical units, of the ending point of the radial line defining the ending point of the arc.
nYEndArc
[in] Specifies the y-coordinate, in logical units, of the ending point of the radial line defining the ending point of the arc.

Return Values

If the arc is drawn, the return value is nonzero.

If the arc is not drawn, the return value is zero.

Windows NT/2000/XP: To get extended error information, call GetLastError.

Remarks

The points (nLeftRect, nTopRect) and (nRightRect, nBottomRect) specify the bounding rectangle. An ellipse formed by the specified bounding rectangle defines the curve of the arc. The arc extends in the current drawing direction from the point where it intersects the radial from the center of the bounding rectangle to the (nXStartArc, nYStartArc) point. The arc ends where it intersects the radial from the center of the bounding rectangle to the (nXEndArc, nYEndArc) point. If the starting point and ending point are the same, a complete ellipse is drawn.

The arc is drawn using the current pen; it is not filled.

The current position is neither used nor updated by Arc.

Windows 95/98/Me: The drawing direction is always counterclockwise.

Windows NT/2000/XP: Use the GetArcDirection and SetArcDirection functions to get and set the current drawing direction for a device context. The default drawing direction is counterclockwise.

Windows 95/98/Me: The sum of the coordinates of the bounding rectangle cannot exceed 32,767. The sum of nLeftRect and nRightRect or nTopRect and nBottomRect parameters cannot exceed 32,767.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

See Also

AngleArc | ArcTo | Chord | Ellipse | GetArcDirection | Pie | SetArcDirection

Описание примера Arc

В обработке события WM_PAINT вызывается функция Arc.

Обратите внимание, что направление рисования по умолчанию - против часовой стрелки, изменить можно при помощи функции SetArcDirection.

Внешний вид примера Arc

Arc
достать/запустить пример Arc.exe

Исходный текст примера Arc

Arc.cpp

#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;

    switch(msg)
    {
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        Arc(hdc,50,25,150,175,200,0,0,200);
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW|CS_VREDRAW;
    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)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "Arc",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,212, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}


ArcTo

ArcTo

Функция ArcTo рисует эллиптическую дугу.

BOOL ArcTo(
  HDC hdc,          // хэндл контекста устройства
  int nLeftRect,    // x-координата верхнего левого угла прямоугольника
  int nTopRect,     // y-координата верхнего левого угла прямоугольника
  int nRightRect,   // x-координата нижнего правого угла прямоугольника
  int nBottomRect,  // y-координата нижнего правого угла прямоугольника
  int nXRadial1,    // x-координата первой радиальной конечной точки
  int nYRadial1,    // y-координата первой радиальной конечной точки
  int nXRadial2,    // x-координата второй радиальной конечной точки
  int nYRadial2     // y-координата второй радиальной конечной точки
);

Параметры

hdc
[in] Хэндл на контекст устройства, где рисование имеет место.
nLeftRect
[in] Определяет x-координату, в логических единицах, верхнего левого угла ограничивающего прямоугольника.
nTopRect
[in] Определяет y-координату, в логических единицах, верхнего левого угла ограничивающего прямоугольника.
nRightRect
[in] Определяет x-координату, в логических единицах, нижнего правого угла ограничивающего прямоугольника.
nBottomRect
[in] Определяет y-координату, в логических единицах, нижнего правого угла ограничивающего прямоугольника.
nXRadial1
[in] Определяет x-координату, в логических единицах, конечной точки радиальной линии, определяющей начальную точку дуги.
nYRadial1
[in] Определяет y-координату, в логических единицах, конечной точки радиальной линии, определяющей начальную точку дуги.
nXRadial2
[in] Определяет x-координату, в логических единицах, конечной точки радиальной линии, определяющей конечную точку дуги.
nYRadial2
[in] Определяет y-координату, в логических единицах, конечной точки радиальной линии, определяющей конечную точку дуги.

Возврат значения

Если функция успешна, возвращаемое значение не ноль.

Если функция неуспешна, возвращаемое значение ноль.

Windows NT/2000/XP: Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Замечания

ArcTo подобна функции Arc, исключая, что используется текущая позиция.

Точки (nLeftRect, nTopRect) и (nRightRect, nBottomRect) определяют ограничивающий прямоугольник. Эллипс, сформированный определённым ограничивающим прямоугольником,определяет кривизну дуги. Дуга простирается в текущем направлении рисования от точки, где она пересекает радиальный луч из центра ограничивающего прямоугольника в точку (nXStartArc, nYStartArc) . Дуга заканчивается, где она пересекает радиальный луч из центра в точку (nXEndArc, nYEndArc) . Если начальная и конечная точки совпадают, рисуется полный эллипс.

Линия рисуется из текущей позиции до начальной точки дуги. Если не происходит ошибки, текущая позиция устанавливается в конечную точку дуги.

Дуга рисуется с использованием текущего пера; без закраски.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.
Библиотека: Используйте Gdi32.lib.

См. так же

AngleArc | Arc | SetArcDirection

ArcTo

The ArcTo function draws an elliptical arc.

BOOL ArcTo(
  HDC hdc,          // handle to device context
  int nLeftRect,    // x-coord of rectangle's upper-left corner
  int nTopRect,     // y-coord of rectangle's upper-left corner
  int nRightRect,   // x-coord of rectangle's lower-right corner
  int nBottomRect,  // y-coord of rectangle's lower-right corner
  int nXRadial1,    // x-coord of first radial ending point
  int nYRadial1,    // y-coord of first radial ending point
  int nXRadial2,    // x-coord of second radial ending point
  int nYRadial2     // y-coord of second radial ending point
);

Parameters

hdc
[in] Handle to the device context where drawing takes place.
nLeftRect
[in] Specifies the x-coordinate, in logical units, of the upper-left corner of the bounding rectangle.
nTopRect
[in] Specifies the y-coordinate, in logical units, of the upper-left corner of the bounding rectangle.
nRightRect
[in] Specifies the x-coordinate, in logical units, of the lower-right corner of the bounding rectangle.
nBottomRect
[in] Specifies the y-coordinate, in logical units, of the lower-right corner of the bounding rectangle.
nXRadial1
[in] Specifies the x-coordinate, in logical units, of the endpoint of the radial defining the starting point of the arc.
nYRadial1
[in] Specifies the y-coordinate, in logical units, of the endpoint of the radial defining the starting point of the arc.
nXRadial2
[in] Specifies the x-coordinate, in logical units, of the endpoint of the radial defining the ending point of the arc.
nYRadial2
[in] Specifies the y-coordinate, in logical units, of the endpoint of the radial defining the ending point of the arc.

Return Values

If the arc is drawn, the return value is nonzero.

If the arc is not drawn, the return value is zero.

Windows NT/2000/XP: To get extended error information, call GetLastError.

Remarks

ArcTo is similar to the Arc function, except that the current position is updated.

The points (nLeftRect, nTopRect) and (nRightRect, nBottomRect) specify the bounding rectangle. An ellipse formed by the specified bounding rectangle defines the curve of the arc. The arc extends counterclockwise from the point where it intersects the radial line from the center of the bounding rectangle to the (nXRadial1, nYRadial1) point. The arc ends where it intersects the radial line from the center of the bounding rectangle to the (nXRadial2, nYRadial2) point. If the starting point and ending point are the same, a complete ellipse is drawn.

A line is drawn from the current position to the starting point of the arc. If no error occurs, the current position is set to the ending point of the arc.

Windows 95/98/Me: The drawing direction is always counterclockwise.

Windows NT/2000/XP: Use the GetArcDirection and SetArcDirection functions to get and set the current drawing direction for a device context. The default drawing direction is counterclockwise.

Windows 95/98/Me: The sum of the coordinates of the bounding rectangle cannot exceed 32,767. The sum of nLeftRect and nRightRect or nTopRect and nBottomRect parameters cannot exceed 32,767.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

See Also

AngleArc | Arc | SetArcDirection

Описание примера ArcTo

В обработке события WM_PAINT вызывается функция ArcTo.

Обратите внимание, что направление рисования по умолчанию - против часовой стрелки, изменить можно при помощи функции SetArcDirection.

Внешний вид примера ArcTo

ArcTo
достать/запустить пример ArcTo.exe

Исходный текст примера ArcTo

ArcTo.cpp

#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;

    switch(msg)
    {
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        MoveToEx(hdc,150,100,NULL);
        ArcTo(hdc,50,25,150,175,0,100,200,100);
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW|CS_VREDRAW;
    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 = GetSysColorBrush(COLOR_WINDOW);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "ArcTo",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,212, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}


GetArcDirection

GetArcDirection

Функция GetArcDirection восстанавливает текущее направление дуги для указанного контекста устройства. Направление дуги используют функции дуг и прямоугольников.

int GetArcDirection(
  HDC hdc   // хэндл контекста устройства
);

Параметры

hdc
[in] Хэндл контекста устройства.

Возврат значения

Возвращаемое значение - текущее направление дуги; оно может принимать одно из следующих значений:

Величина | Значение
AD_COUNTERCLOCKWISE | Дуги и прямоугольники рисуются против часовой стрелки.
AD_CLOCKWISE | Дуги и прямоугольники рисуются по часовой стрелке.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 98 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.
Библиотека: Используйте Gdi32.lib.

См. так же

SetArcDirection

GetArcDirection

The GetArcDirection function retrieves the current arc direction for the specified device context. Arc and rectangle functions use the arc direction.

int GetArcDirection(
  HDC hdc   // handle to device context
);

Parameters

hdc
[in] Handle to the device context.

Return Values

The return value specifies the current arc direction; it can be any one of the following values:

Value | Meaning
AD_COUNTERCLOCKWISE | Arcs and rectangles are drawn counterclockwise.
AD_CLOCKWISE | Arcs and rectangles are drawn clockwise.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 98 and later.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

See Also

SetArcDirection

Описание примера GetArcDirection

В примере вызовом одной фуннкции Arc, рисующей пол эллипса, производится отрисовка 10-ти незамкнутых уменьшающихся эллисов.

В обработке события WM_PAINT:

  • В цикле for вызывается функция Arc, рисующая дугу(половину эллипса);
  • Проверяется направление дуги функцией GetArcDirection и меняется на противоположное вызывом функции SetArcDirection;
  • После смены направления на "против часовой стрелки" меняются члены rect структуры типа RECT.

Обратите внимание, что последняя точка прямой или кривой не закрашивается.

Внешний вид примера GetArcDirection

GetArcDirection
достать/запустить пример GetArcDirection.exe

Исходный текст примера GetArcDirection

GetArcDirection.cpp

#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    RECT rect={30,50,170,150};
    switch(msg)
    {
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        for (int i=0;i<20;i++)
        {
            Arc(hdc,rect.left,rect.top,rect.right,rect.bottom,0,100,200,100);
            if (GetArcDirection(hdc)==AD_CLOCKWISE)
            {
                SetArcDirection(hdc,AD_COUNTERCLOCKWISE);
                rect.left+=5;
                rect.top+=5;
                rect.right-=5;
                rect.bottom-=5;
            }
            else    SetArcDirection(hdc,AD_CLOCKWISE);
        }
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{

    HWND hwnd;
    MSG msg;
    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW|CS_VREDRAW;
    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)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "GetArcDirection",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,212, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}


LineDDA

LineDDA

Функция LineDDA определяет, какие точки должны быть высвечнены для линии, определённой указанной начальной и конечной точками.

BOOL LineDDA(
  int nXStart,             // x-координата начальной точки
  int nYStart,             // y-координата начальной точки
  int nXEnd,               // x-координата конечной точки
  int nYEnd,               // y-координата конечной точки
  LINEDDAPROC lpLineFunc,  // функция обратного вызова
  LPARAM lpData            // определённые приложением данные
);

Параметры

nXStart
[in] Указывает координату x, в логических единицах, начальной точки.
nYStart
[in] Указывает координату y, в логических единицах, начальной точки.
nXEnd
[in] Указывает координату x, в логических единицах, конечной точки.
nYEnd
[in] Указывает координату y, в логических единицах, начальной точки.
lpLineFunc
[in] Указатель на определённую приложением функцию обратного вызова. Подробную информацию смотри в функции обратного вызова LineDDAProc
lpData
[in] Указатель на определённые приложением данные.

Возврат значения

Если функция успешна, возвращаемое значение не ноль.

Если функция неуспешна, возвращаемое значение ноль.

Windows NT/2000/XP: Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Замечания

Функция LineDDA передаёт координаты каждой точки всей линии, исключая конечную точку линии, в определённую приложением функцию обратного вызова. В дополнении к передаче координат, эта функция передаёт любые определённые приложением данные.

Координаты передаются в функцию обратного вызова соответствующими пикселами на видео дисплее только если используется по умолчанию трансформация и режим нанесения.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.
Библиотека: Используйте Gdi32.lib.

См. так же

LineDDAProc

LineDDA

The LineDDA function determines which pixels should be highlighted for a line defined by the specified starting and ending points.

BOOL LineDDA(
  int nXStart,             // x-coordinate of starting point
  int nYStart,             // y-coordinate of starting point
  int nXEnd,               // x-coordinate of ending point
  int nYEnd,               // y-coordinate of ending point
  LINEDDAPROC lpLineFunc,  // callback function
  LPARAM lpData            // application-defined data
);

Parameters

nXStart
[in] Specifies the x-coordinate, in logical units, of the line's starting point.
nYStart
[in] Specifies the y-coordinate, in logical units, of the line's starting point.
nXEnd
[in] Specifies the x-coordinate, in logical units, of the line's ending point.
nYEnd
[in] Specifies the y-coordinate, in logical units, of the line's ending point.
lpLineFunc
[in] Pointer to an application-defined callback function. For more information, see the LineDDAProc callback function.
lpData
[in] Pointer to the application-defined data.

Return Values

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero.

Windows NT/2000/XP: To get extended error information, call GetLastError.

Remarks

The LineDDA function passes the coordinates for each point along the line, except for the line's ending point, to the application-defined callback function. In addition to passing the coordinates of a point, this function passes any existing application-defined data.

The coordinates passed to the callback function match pixels on a video display only if the default transformations and mapping modes are used.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

See Also

LineDDAProc

Описание примера LineDDA

В обработке события WM_PAINT вызывается функция LineDDA cо следующими параметрами:

  • Координатами начальной и конечной точек
  • Указателем на функцию LineDDAProc
  • хэндлом контекста устройства hdc

Функция LineDDA вычисляет по алгоритму Брезенхенра координаты последовательно каждой рисуемой точки, и передеёт их и hdc как аргументы в вызываемую Windows функцию LineDDAProc.

Функция LineDDAProc отрисовывает точки вызовом функции SetPixel.

Внешний вид примера LineDDA

LineDDA
достать/запустить пример LineDDA.exe

Исходный текст примера LineDDA

LineDDA.cpp

#include <windows.h>
VOID CALLBACK LineDDAProc(int x,int y,LPARAM hdc)
{
    SetPixel((HDC)hdc,x,y,0xff000000);
};
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;

    switch(msg)
    {
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        LineDDA(50,50,150,150,LineDDAProc,(LPARAM)hdc);
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW|CS_VREDRAW;
    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)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "LineDDA",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,212, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}


LineDDAProc

LineDDAProc

Функция LineDDAProc это определённая приложением функция обратного вызова, используемая вместе с фунцией LineDDA. Она используется для обработки координат. Тип LINEDDAPROC определяет указатель на функцию обратного вызова. LineDDAProc заменяется определённым приложением именем функции.

VOID CALLBACK LineDDAProc(
  int X,          // x-coordinate of point
  int Y,          // y-coordinate of point
  LPARAM lpData   // application-defined data
);

Параметры

X
[in] Указывает координату x, в логических единицах, текущей точки.
Y
[in] Указывает координату y, в логических единицах, текущей точки.
lpData
[in] Указатель на определённые приложением данные.

Возврат значения

Эта функция не возвращает значения.

Замечания

Приложение регистрирует функцию LineDDAProc передачей её адреса в функцию LineDDA.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.

См. так же

LineDDA

LineDDAProc

The LineDDAProc function is an application-defined callback function used with the LineDDA function. It is used to process coordinates. The LINEDDAPROC type defines a pointer to this callback function. LineDDAProc is a placeholder for the application-defined function name.

VOID CALLBACK LineDDAProc(
  int X,          // x-coordinate of point
  int Y,          // y-coordinate of point
  LPARAM lpData   // application-defined data
);

Parameters

X
[in] Specifies the x-coordinate, in logical units, of the current point.
Y
[in] Specifies the y-coordinate, in logical units, of the current point.
lpData
[in] Pointer to the application-defined data.

Return Values

This function does not return a value.

Remarks

An application registers a LineDDAProc function by passing its address to the LineDDA function.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.

See Also

LineDDA

Описание примера Polyline

Программа выполняет графическое решение задачи нахождения точки пересечения двух линий. Точка (x, y) выводится в верхней части окна.

В обработке события WM_PAINT:

  • Устанавливается текущая позиция вызовом функции MoveToEx в точку (100,50)
  • Рисуется линия функцией LineTo до точки (100,150)
  • Вызывается функция LineDDA, рисующая линию из точки (50,50) в точку (150,150)
  • Выводятся координаты точки пересечения функцией TextOut

Функция LineDDAProc проверяет переданную ей точку на цвет вызовом функции GetPixel, и закрашивает её вызовом функции SetPixel. Если функция встречает не белую точку, она и будет точкой пересечения двух прямых линий.

Внешний вид примера LineDDAProc

LineDDAProc
достать/запустить пример LineDDAProc.exe

Исходный текст примера LineDDAProc

LineDDAProc.cpp

#include <windows.h>
POINT cross;
VOID CALLBACK LineDDAProc(int x,int y,LPARAM hdc)
{
    COLORREF a;
    a=GetPixel((HDC)hdc,x,y);
    if(a!=0xffffff)
    {
        cross.x=x;
        cross.y=y;
    }
    SetPixel((HDC)hdc,x,y,0xff000000);
};
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    char buf[10];

    switch(msg)
    {
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        MoveToEx(hdc,100,50,NULL);
        LineTo(hdc,100,150);
        LineDDA(50,50,150,150,LineDDAProc,(LPARAM)hdc);
        TextOut(hdc,10,10,itoa(cross.x,buf,10),3);
        TextOut(hdc,10,40,itoa(cross.y,buf,10),3);
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW|CS_VREDRAW;
    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)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "LineDDAProc",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,212, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}


LineTo

LineTo

Функция LineTo рисует линию из точки текущей позиции в указанную, причём, указанная точка не включается.

BOOL LineTo(
  HDC hdc,    // хэндл контекста устройства
  int nXEnd,  // координата x конечной точки
  int nYEnd   // координата y конечной точки
);

Параметры

hdc
[in] Хэндл контекста устройства.
nXEnd
[in] Указанная в логических единицах координата x конечной точки линии.
nYEnd
[in] Указанная в логических единицах координата y конечной точки линии.

Возврат значения

Если функция преуспевает, возврат значения не ноль.

Если функция терпит неудачу, возврат значения ноль.

Windows NT/2000/XP: Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Замечания

Линия рисуется с использованием текущего пера, и, если перо - геометрическое перо, - текущей кистью.

Если LineTo преуспевает, текущая позиция устанавливается в указанную конечную точку.

Трабования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.
Библиотека: Используйте Gdi32.lib.

См. так же

MoveToEx | Polyline | PolylineTo

LineTo

The LineTo function draws a line from the current position up to, but not including, the specified point.

BOOL LineTo(
  HDC hdc,    // device context handle
  int nXEnd,  // x-coordinate of ending point
  int nYEnd   // y-coordinate of ending point
);

Parameters

hdc
[in] Handle to a device context.
nXEnd
[in] Specifies the x-coordinate, in logical units, of the line's ending point.
nYEnd
[in] Specifies the y-coordinate, in logical units, of the line's ending point.

Return Values

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero.

Windows NT/2000/XP: To get extended error information, call GetLastError.

Remarks

The line is drawn by using the current pen and, if the pen is a geometric pen, the current brush.

If LineTo succeeds, the current position is set to the specified ending point.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

See Also

MoveToEx | Polyline | PolylineTo

Описание примера LineTo

В обработке события WM_PAINT:

  • Производится установка текущей позиции вызовом функции MoveToEx в координаты (50,50).
  • Рисуется линия из текущей позиции в точку (150,150) вызовом функции LineTo.

Внешний вид примера LineTo

LineTo
достать/запустить пример LineTo.exe

Исходный текст примера LineTo

LineTo.cpp

#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    switch(msg)
    {
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        MoveToEx(hdc,50,50,NULL);
        LineTo(hdc,150,150);
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{

    HWND hwnd;
    MSG msg;
    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW|CS_VREDRAW;
    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)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "LineTo",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,212, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}


MoveToEx

MoveToEx

Функция MoveToEx обновляет текущую позицию на указанную точку и (необязательно) возвращает предыдущую позицию.

BOOL MoveToEx(
  HDC hdc,          // хэндл контекста устройства
  int X,            // координата x новой текущей позиции
  int Y,            // координата y новой текущей позиции
  LPPOINT lpPoint   // старая текущая позиция
);

Параметры

hdc
[in] Хэндл контекста устройства.
X
[in] Указывает координату x, в логических единицах, новой текущей позиции, в логических единицах.
Y
[in] Указывает координату y, в логических единицах, новой текущей позиции, в логических единицах.
lpPoint
[out] Указатель на POINT структуру, которая получит предыдущую текущую позицию. Если этот параметр - указатель NULL, предыдущая позиция не возвращается.

Возврат значения

Если функция преуспевает, возврат значения не ноль.

Если функция терпит неудачу, возврат значения ноль.

Windows NT/2000/XP:Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Замечания

Функция MoveToEx влияет на все функции рисования.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Header: Объявлена в Wingdi.h; подключать Windows.h.
Library: Используйте Gdi32.lib.

См. так же

AngleArc | LineTo | POINT | PolyBezierTo | PolylineTo

MoveToEx

The MoveToEx function updates the current position to the specified point and optionally returns the previous position.

BOOL MoveToEx(
  HDC hdc,          // handle to device context
  int X,            // x-coordinate of new current position
  int Y,            // y-coordinate of new current position
  LPPOINT lpPoint   // old current position
);

Parameters

hdc
[in] Handle to a device context.
X
[in] Specifies the x-coordinate, in logical units, of the new position, in logical units.
Y
[in] Specifies the y-coordinate, in logical units, of the new position, in logical units.
lpPoint
[out] Pointer to a POINT structure that receives the previous current position. If this parameter is a NULL pointer, the previous position is not returned.

Return Values

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero.

Windows NT/2000/XP: To get extended error information, call GetLastError.

Remarks

The MoveToEx function affects all drawing functions.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

See Also

AngleArc | LineTo | POINT | PolyBezierTo | PolylineTo

Описание примера MoveToEx

В обработке события WM_PAINT:

  • Производится установка текущей позиции вызовом функции MoveToEx в координаты (50,50).
  • Рисуется линия из текущей позиции в точку (150,150) вызовом функции LineTo.
  • Повторяется установка текущей позиции (150,50), с передачей предыдущей позиции в структуру prevPoint типа POINT, и рисование линии до точки (50,150).
  • Вывод x и y координат предыдущей позиции с помощью функции TextOut.

Обратите внимание, что вызов функции LineTo меняет текущую позицию с (50,50) на (150,150).

Внешний вид примера MoveToEx

MoveToEx
достать/запустить пример MoveToEx.exe

Исходный текст примера MoveToEx

MoveToEx.cpp

#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    POINT prevPoint;
    char buf[10];

    switch(msg)
    {
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        MoveToEx(hdc,50,50,NULL);
        LineTo(hdc,150,150);
        MoveToEx(hdc,150,50,&prevPoint);
        LineTo(hdc,50,150);
        TextOut(hdc,10,10,itoa(prevPoint.x,buf,10),3);
        TextOut(hdc,10,30,itoa(prevPoint.y,buf,10),3);
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{

    HWND hwnd;
    MSG msg;
    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW|CS_VREDRAW;
    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)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "MoveToEx",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,212, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}


PolyBezier

PolyBezier

Функция PolyBezier рисует одну или более кривых Безье.

BOOL PolyBezier(
  HDC hdc,            // хэндл контекста устройства
  CONST POINT* lppt,  // конечные и контрольные точки
  DWORD cPoints       // число конечных и контрольных точек
);

Параметры

hdc
[in] Хэндл контекста устройства.
lppt
[in] Указатель на массив структур типа POINT, содержащий конечные и контрольные точки кривой(ых), в логических единицах.
cPoints
[in] Определяет число точек в массиве lppt. Это значение должно быть на один больше чем три количества рисуемых кривых, поскольку каждая Безье кривая требует двух контрольных и одной конечной точек, и первая кривая требует начальной точки.

Возврат значения

Если функция успешна, возвращаемое значение не ноль.

Если функция неуспешна, возвращаемое значение ноль.

Windows NT/2000/XP: Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Замечания

Функция Polybezier рисует кубическую кривую Безье, используя конечные и контрольные точки, определённые в параметре lppt. Первая кривая рисуется из первой точки в четвёртую, используя вторую и третью как контрольные. Каждая последующая кривая требует последовательно более трёх точек: конечная точка предыдущей кривой используется как начальная точка следующей, две следующие точки - контрольные, и третья - конечная точка.

Текущая позиция никак не используется и не изменяется функцией PolyBezier. Фигура не закрашивается.

Эта функция рисует линии, используя текущее перо.

Windows 95/98/Me: PolyBezier не может рисовать больше определённого количества точек. Предел зависит от толщины линии (то есть, толщины пера выбранного внутри DC), как показано в следующей таблице.

Ширина линии | Максимально позволено точек
ширина линии 1 | 16K
ширина линии > 1 (то есть, широкая линия) и устройство поддерживает широкую линию | 16K
ширина линии > 1 но устройство не поддерживает широкую линию | приблизительно 1360 (то есть, приблизительно 16K / 12)

Любые точки свыше игнорируются. Чтобы нарисовать линию с большим количеством точек, делите данные на группы, которые меньше чем максимальное количество точек и вызывайте функцию для каждой группы точек. Не забудьте соединить группы отрезком.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.
Библиотека: Используйте Gdi32.lib.

См. так же

MoveToEx | POINT | PolyBezierTo

PolyBezier

The PolyBezier function draws one or more Bйzier curves.

BOOL PolyBezier(
  HDC hdc,            // handle to device context
  CONST POINT* lppt,  // endpoints and control points
  DWORD cPoints       // count of endpoints and control points
);

Parameters

hdc
[in] Handle to a device context.
lppt
[in] Pointer to an array of POINT structures that contain the endpoints and control points of the curve(s), in logical units.
cPoints
[in] Specifies the number of points in the lppt array. This value must be one more than three times the number of curves to be drawn, because each Bйzier curve requires two control points and an endpoint, and the initial curve requires an additional starting point.

Return Values

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero.

Windows NT/2000/XP: To get extended error information, call GetLastError.

Remarks

Th Polybezier function draws cubic Bйzier curves by using the endpoints and control points specified by the lppt parameter. The first curve is drawn from the first point to the fourth point by using the second and third points as control points. Each subsequent curve in the sequence needs exactly three more points: the ending point of the previous curve is used as the starting point, the next two points in the sequence are control points, and the third is the ending point.

The current position is neither used nor updated by the PolyBezier function. The figure is not filled.

This function draws lines by using the current pen.

Windows 95/98/Me: Polyline cannot draw more than a certain number of points. The limit depends on the line width (that is, the width of the pen selected into the DC), as shown in the following table.

Line width | Maximum points allowed
line width is 1 | 16K
line width > 1 (that is, wideline) and device supports wideline | 16K
line width > 1 but device does not support wideline | approximately 1360 (that is, approximately 16K / 12)

Any extra points are ignored. To draw a line with more points, divide the data into groups that have less than the maximum number of points and call the function for each group of points. Remember to connect the line segments.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

See Also

MoveToEx | POINT | PolyBezierTo

Описание примера PolyBezier

В обработке события WM_PAINT вызывается функция PolyBezier cо следующими параметрами: указателем на массив points структур POINT c четырьмя элементами, и числом точек 4.

Из начальной и конечной точек кривой Безье к контрольным точкам проведены направляющие линии, они же касательные.

Внешний вид примера PolyBezier

PolyBezier
достать/запустить пример PolyBezier.exe

Исходный текст примера PolyBezier

PolyBezier.cpp

#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    POINT points[]={50,150,
                    50,50,
                    150,150,
                    150,50};
    switch(msg)
    {
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        MoveToEx(hdc,50,150,NULL);
        LineTo(hdc,50,50);
        MoveToEx(hdc,150,50,NULL);
        LineTo(hdc,150,150);
        PolyBezier(hdc,points,4);
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{

    HWND hwnd;
    MSG msg;
    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW|CS_VREDRAW;
    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)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "PolyBezier",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,212, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}


PolyBezierTo

PolyBezierTo

Функция PolyBezierTo рисует одну или более кривых Безье.

BOOL PolyBezierTo(
  HDC hdc,            // хэндл контекста устройства
  CONST POINT* lppt,  // конечные и контрольные точки
  DWORD cCount       // число конечных и контрольных точек
);

Параметры

hdc
[in] Хэндл контекста устройства.
lppt
[in] Указатель на массив структур типа POINT, содержащий конечные и контрольные точки кривой(ых), в логических единицах.
cCount
[in] Определяет число точек в массиве lppt. Это значение должно быть равно чем три количества рисуемых кривых, поскольку каждая Безье кривая требует двух контрольных и одной конечной точек.

Возврат значения

Если функция успешна, возвращаемое значение не ноль.

Если функция неуспешна, возвращаемое значение ноль.

Windows NT/2000/XP: Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Замечания

Функция PolyBezierTo рисует кубическую кривую Безье, используя конечные и контрольные точки, определённые в параметре lppt. Первая кривая рисуется текущей позиции в третью, используя первую и вторую как контрольные. Каждая последующая кривая требует последовательно более трёх точек, и использует конечную точку предыдущей линии как начальную точку следующей.

PolyBezierTo перемещает текущую позицию в конечную точку последней кривой Безье. Фигура не закрашивается.

Эта функция рисует линии, используя текущее перо.

Windows 95/98/Me: PolyBezierТо не может рисовать больше определённого количества точек. Предел зависит от толщины линии (то есть, толщины пера выбранного внутри DC), как показано в следующей таблице.

Ширина линии | Максимально позволено точек
ширина линии 1 | 16K
ширина линии > 1 (то есть, широкая линия) и устройство поддерживает широкую линию | 16K
ширина линии > 1 но устройство не поддерживает широкую линию | приблизительно 1360 (то есть, приблизительно 16K / 12)

Любые точки свыше игнорируются. Чтобы нарисовать линию с большим количеством точек, делите данные на группы, которые меньше чем максимальное количество точек и вызывайте функцию для каждой группы точек. Не забудьте соединить группы отрезком.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.
Библиотека: Используйте Gdi32.lib.

См. так же

MoveToEx | POINT | PolyBezier

PolyBezierTo

The PolyBezierTo function draws one or more Bйzier curves.

BOOL PolyBezierTo(
  HDC hdc,            // handle to device context
  CONST POINT *lppt,  // endpoints and control points
  DWORD cCount        // count of endpoints and control points
);

Parameters

hdc
[in] Handle to a device context.
lppt
[in] Pointer to an array of POINT structures that contains the endpoints and control points, in logical units.
cCount
[in] Specifies the number of points in the lppt array. This value must be three times the number of curves to be drawn, because each Bйzier curve requires two control points and an ending point.

Return Values

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero.

Windows NT/2000/XP: To get extended error information, call GetLastError.

Remarks

This function draws cubic Bйzier curves by using the control points specified by the lppt parameter. The first curve is drawn from the current position to the third point by using the first two points as control points. For each subsequent curve, the function needs exactly three more points, and uses the ending point of the previous curve as the starting point for the next.

PolyBezierTo moves the current position to the ending point of the last Bйzier curve. The figure is not filled.

This function draws lines by using the current pen.

Windows 95/98/Me: PolylineTo cannot draw more than a certain number of points. The limit depends on the line width (that is, the width of the pen selected into the DC), as shown in the following table.

Line width | Maximum points allowed
line width is 1 | 16K
line width > 1 (that is, wideline) and device supports wideline | 16K
line width > 1 but device does not support wideline | approximately 1360 (that is, approximately 16K / 12)

Any extra points are ignored. To draw a line with more points, divide the data into groups that have less than the maximum number of points and call the function for each group of points. Remember to connect the line segments.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

See Also

MoveToEx | POINT | PolyBezier

Описание примера PolyBezierTo

В обработке события WM_PAINT:

  • Производится установка текущей позиции вызовом функции MoveToEx в координаты (100,100).
  • Вызывается функция PolyBezierTo cо следующими параметрами: указателем на массив points структур POINT c шестью элементами (две кривые Безье), и числом точек 6.
  • Из начальной и конечной точек кривым Безье к контрольным точкам проведены направляющие линии, они же касательные.

Внешний вид примера PolyBezierTo

PolyBezierTo
достать/запустить пример PolyBezierTo.exe

Исходный текст примера PolyBezierTo

PolyBezierTo.cpp

#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    POINT points[]={100,50,
                    0,100,
                    100,150,
                    200,100,
                    100,50,
                    100,100};
    switch(msg)
    {
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        MoveToEx(hdc,100,100,NULL);
        LineTo(hdc,100,50);
        MoveToEx(hdc,100,150,NULL);
        LineTo(hdc,0,100);
        MoveToEx(hdc,100,150,NULL);
        LineTo(hdc,200,100);
        MoveToEx(hdc,100,100,NULL);
        PolyBezierTo(hdc,points,6);
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{

    HWND hwnd;
    MSG msg;
    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW|CS_VREDRAW;
    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)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "PolyBezierTo",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,212, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}


PolyDraw

PolyDraw

Функция PolyDraw рисует набор отрезков линий и кривых Безье.

BOOL PolyDraw(
  HDC hdc,               // хэндл контекста устройства
  CONST POINT *lppt,     // массив точек
  CONST BYTE *lpbTypes,  // идентификаторы линий и кривых
  int cCount             // количество точек
);

Параметры

hdc
[in] Хэндл контекста устройства.
lppt
[in] Указатель на массив структур POINT, содержащий конечные точки для каждоно отрезка и конечные и контрольные точки для каждой кривой Безье, в логических единицах.
lpbTypes
[in] Указатель на массив типа BYTE, который определяет, как используется каждая точка в массиве lppt. Элемент массива может иметь одно из следующих значений:
Тип | Значение
PT_MOVETO | Указывает, что точка начинает насвязанную фигуру. Эта точка получает новую текущую позицию.
PT_LINETO | Указывает, что линия рисуется из текущей позиции до этой точки, которая затем получает текущую позицию.
PT_BEZIERTO Указывает, что эта точка - контрольная или конечная точка кривой Безье.

Тип PT_BEZIERTO всегда встречается три раза. Текущая позиция определяет начальную точку кривой Безье. Первые две точки PT_BEZIERTO это контрольные точка, и третья точка PT_BEZIERTO - конечная точка. Конечная точка получает новую текущую позицию. Если нет последовательно трёх точек PT_BEZIERTO, происходит ошибка.

Тип PT_LINETO или PT_BEZIERTO может быть объединён со следующим значением, используя побитовый оператор OR для указания того, что соответствующая точка это последняя точка в фигуре, и фигура замыкается.

Величина Значение
PT_CLOSEFIGURE Указывает, что фигура автоматически замыкается после типа PT_LINETO или PT_BEZIERTO для последней точки. Линия рисуется из этой точки до самой последней точки, назначенной PT_MOVETO или MoveToEx.

Это значение объединяется с типом PT_LINETO для линии, или с типом PT_BEZIERTO конечной точки кривой Безье, использованием побитового оператора OR.

Текущая позиция устанавливается в конечную точку замыкающей линии.

cCount
[in] Указывает полное количество точек в массиве lppt, то же самое, что и число байтов в массиве lpbTypes.

Возврат значения

Если функция успешна, возвращаемое значение не ноль.

Если функция неуспешна, возвращаемое значение ноль.

Windows NT/2000/XP: Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Замечания

Функция PolyDraw может быть использована вместо последовательного вызова функций MoveToEx, LineTo, и PolyBezierTo для рисования несвязанных фигур. Линии и кривые рисуются с использованием текущего пера и фигуры не закрашиваются. Если есть активный путь, начатый вызовом BeginPath,функция PolyDraw добавляется в путь.

Точки, содержащиеся в массиве lppt и в массиве lpbTypes показывают, есть ли точка часть операций MoveTo, LineTo, или PolyBezierTo. А также, замкнута ли фигура.

Эта функция обновляет текущую позицию.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Не поддерживается.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.
Библиотека: Используйте Gdi32.lib.

См. так же

BeginPath | EndPath | LineTo | MoveToEx | POINT | PolyBezierTo | PolyLine

PolyDraw

The PolyDraw function draws a set of line segments and Bйzier curves.

BOOL PolyDraw(
  HDC hdc,               // handle to device context
  CONST POINT *lppt,     // array of points
  CONST BYTE *lpbTypes,  // line and curve identifiers
  int cCount             // count of points
);

Parameters

hdc
[in] Handle to a device context.
lppt
[in] Pointer to an array of POINT structures that contains the endpoints for each line segment and the endpoints and control points for each Bйzier curve, in logical units.
lpbTypes
[in] Pointer to an array that specifies how each point in the lppt array is used. This parameter can be one of the following values.
Type | Meaning
PT_MOVETO | Specifies that this point starts a disjoint figure. This point becomes the new current position.
PT_LINETO | Specifies that a line is to be drawn from the current position to this point, which then becomes the new current position.
PT_BEZIERTO Specifies that this point is a control point or ending point for a Bйzier curve.

PT_BEZIERTO types always occur in sets of three. The current position defines the starting point for the Bйzier curve. The first two PT_BEZIERTO points are the control points, and the third PT_BEZIERTO point is the ending point. The ending point becomes the new current position. If there are not three consecutive PT_BEZIERTO points, an error results.

A PT_LINETO or PT_BEZIERTO type can be combined with the following value by using the bitwise operator OR to indicate that the corresponding point is the last point in a figure and the figure is closed.

Value Meaning
PT_CLOSEFIGURE Specifies that the figure is automatically closed after the PT_LINETO or PT_BEZIERTO type for this point is done. A line is drawn from this point to the most recent PT_MOVETO or MoveToEx point.

This value is combined with the PT_LINETO type for a line, or with the PT_BEZIERTO type of the ending point for a Bйzier curve, by using the bitwise operator OR.

The current position is set to the ending point of the closing line.

cCount
[in] Specifies the total number of points in the lppt array, the same as the number of bytes in the lpbTypes array.

Return Values

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero.

Windows NT/2000/XP: To get extended error information, call GetLastError.

Remarks

The PolyDraw function can be used in place of consecutive calls to MoveToEx, LineTo, and PolyBezierTo functions to draw disjoint figures. The lines and curves are drawn using the current pen and figures are not filled. If there is an active path started by calling BeginPath, PolyDraw adds to the path.

The points contained in the lppt array and in the lpbTypes array indicate whether each point is part of a MoveTo, LineTo, or PolyBezierTo operation. It is also possible to close figures.

This function updates the current position.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Unsupported.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

See Also

BeginPath | EndPath | LineTo | MoveToEx | POINT | PolyBezierTo | PolyLine

Описание примера PolyDraw

В обработке события WM_PAINT:

  • Устанавливается текущая позиция вызовом функции MoveToEx
  • Вызывается функция PolyDraw cо следующими параметрами:
    • Указателем на массив points структур POINT c четырьмя элементами
    • Указателем на массив pointtype c четырьмя элементами, определяющими, как будет обработана соответствующая точка массива points
    • Число точек, 4.

Внешний вид примера PolyDraw

PolyDraw
достать/запустить пример PolyDraw.exe

Исходный текст примера PolyDraw

PolyDraw.cpp

#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    POINT points[]={50,150,
                    150,150,
                    150,100,
                    100,50};
    BYTE pointtype[]={PT_BEZIERTO,
                      PT_BEZIERTO,
                      PT_BEZIERTO,
                      PT_LINETO|PT_CLOSEFIGURE};
    switch(msg)
    {
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        MoveToEx(hdc,50,100,NULL);
        PolyDraw(hdc,points,pointtype,4);
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW|CS_VREDRAW;
    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)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "PolyDraw",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,212, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}


Polyline

Polyline

Функция Polyline рисует серию прямых отрезков, соединённых точками в указанном массиве.

BOOL Polyline(
  HDC hdc,            // хэндл контекста устройства
  CONST POINT *lppt,  // массив конечных точек
  int cPoints         // число точек в массиве
);

Параметры

hdc
[in] Хэндл контекста устройства.
lppt
[in] Указатель на массив структур типа POINT, в логических единицах.
cPoints
[in] Определяет число точек в массиве. Это число должно быть больше или равно двум.

Возврат значения

Если функция успешна, возвращаемое значение не ноль.

Если функция неуспешна, возвращаемое значение ноль.

Windows NT/2000/XP: Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Замечания

Линии последовательно рисуются из первой точки, используется текущее перо. В отличие от функций LineTo или PolylineTo, функция Polyline никак не изменяет текущую позицию.

Windows 95/98/Me: Polyline не может рисовать больше определённого количества точек. Предел зависит от толщины линии (то есть, толщины пера выбранного внутри DC), как показано в следующей таблице.

Ширина линии | Максимально позволено точек
ширина линии 1 | 16K
ширина линии > 1 (то есть, широкая линия) и устройство поддерживает широкую линию | 16K
ширина линии > 1 но устройство не поддерживает широкую линию | приблизительно 1360 (то есть, приблизительно 16K / 12)

Любые точки свыше игнорируются. Чтобы нарисовать линию с большим количеством точек, делите данные на группы, которые меньше чем максимальное количество точек и вызывайте функцию для каждой группы точек. Не забудьте соединить группы отрезком.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.
Библиотека: Используйте Gdi32.lib.

См. так же

LineTo | MoveToEx | POINT | PolylineTo | PolyPolyline

Polyline

The Polyline function draws a series of line segments by connecting the points in the specified array.

BOOL Polyline(
  HDC hdc,            // handle to device context
  CONST POINT *lppt,  // array of endpoints
  int cPoints         // number of points in array
);

Parameters

hdc
[in] Handle to a device context.
lppt
[in] Pointer to an array of POINT structures, in logical units.
cPoints
[in] Specifies the number of points in the array. This number must be greater than or equal to two.

Return Values

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero.

Windows NT/2000/XP: To get extended error information, call GetLastError.

Remarks

The lines are drawn from the first point through subsequent points by using the current pen. Unlike the LineTo or PolylineTo functions, the Polyline function neither uses nor updates the current position.

Windows 95/98/Me: Polyline cannot draw more than a certain number of points. The limit depends on the line width (that is, the width of the pen selected into the DC), as shown in the following table.

Line width | Maximum points allowed
line width is 1 | 16K
line width > 1 (that is, wideline) and device supports wideline | 16K
line width > 1 but device does not support wideline | approximately 1360 (that is, approximately 16K / 12)

Any extra points are ignored. To draw a line with more points, divide the data into groups that have less than the maximum number of points and call the function for each group of points. Remember to connect the line segments.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

See Also

LineTo | MoveToEx | POINT | PolylineTo | PolyPolyline

Описание примера Polyline

В обработке события WM_PAINT вызывается функция Polyline cо следующими параметрами: указателем на массив points структур POINT c пятью элементами, и числом точек 5.

Внешний вид примера Polyline

Polyline
достать/запустить пример Polyline.exe

Исходный текст примера Polyline

Polyline.cpp

#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    POINT points[5]={50,50,
                     150,50,
                     150,150,
                     50,150,
                     50,50};
    switch(msg)
    {
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        Polyline(hdc,points,5);
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{

    HWND hwnd;
    MSG msg;
    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW|CS_VREDRAW;
    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)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "Polyline",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,212, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}


PolylineTo

PolylineTo

Функция PolylineTo рисует одну или более прямых линий.

BOOL PolylineTo(
  HDC hdc,            // хэндл контекста устройства
  CONST POINT *lppt,  // массив точек
  DWORD cCount        // число точек в массиве
);

Параметры

hdc
[in] Хэндл контекста устройства.
lppt
[in] Указатель на массив структур типа POINT, который содержит вершины линии, в логических единицах.
cCount
[in] Определяет число точек в массиве.

Возврат значения

Если функция успешна, возвращаемое значение не ноль.

Если функция неуспешна, возвращаемое значение ноль.

Windows NT/2000/XP: Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Замечания

В отличии от функции Polyline, функция PolylineTo использует и изменяет текущую позицию.

Линия рисуется из текущей позиции до первой точки, указанной в параметре lppt, используя текущее перо. Для каждой дополнительной линии, функция рисует линию из конечной точки предыдущей линии до следующей точки, указанной в параметре lppt.

PolylineTo перемещает текущую позицию в конечную точку последней линии.

Если отрезки линий, нарисованные этой функцией составляют замкнутую фигуру, фигура не закрашивается.

Windows 95/98/Me: PolylineTo не может рисовать больше определённого количества точек. Предел зависит от толщины линии (то есть, толщины пера выбранного внутри DC), как показано в следующей таблице.

Ширина линии | Максимально позволено точек
ширина линии 1 | 16K
ширина линии > 1 (то есть, широкая линия) и устройство поддерживает широкую линию | 16K
ширина линии > 1 но устройство не поддерживает широкую линию | приблизительно 1360 (то есть, приблизительно 16K / 12)

Любые точки свыше игнорируются. Чтобы нарисовать линию с большим количеством точек, делите данные на группы, которые меньше чем максимальное количество точек и вызывайте функцию для каждой группы точек. Не забудьте соединить группы отрезком.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.
Библиотека: Используйте Gdi32.lib.

См. так же

LineTo | MoveToEx | POINT | Polyline | PolyPolyline

PolylineTo

The PolylineTo function draws one or more straight lines.

BOOL PolylineTo(
  HDC hdc,            // handle to device context
  CONST POINT *lppt,  // array of points
  DWORD cCount        // number of points in array
);

Parameters

hdc
[in] Handle to the device context.
lppt
[in] Pointer to an array of POINT structures that contains the vertices of the line, in logical units.
cCount
[in] Specifies the number of points in the array.

Return Values

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero.

Windows NT/2000/XP: To get extended error information, call GetLastError.

Remarks

Unlike the Polyline function, the PolylineTo function uses and updates the current position.

A line is drawn from the current position to the first point specified by the lppt parameter by using the current pen. For each additional line, the function draws from the ending point of the previous line to the next point specified by lppt.

PolylineTo moves the current position to the ending point of the last line.

If the line segments drawn by this function form a closed figure, the figure is not filled.

Windows 95/98/Me: PolylineTo cannot draw more than a certain number of points. The limit depends on the line width (that is, the width of the pen selected into the DC), as shown in the following table.

Line width | Maximum points allowed
line width is 1 | 16K
line width > 1 (that is, wideline) and device supports wideline | 16K
line width > 1 but device does not support wideline | approximately 1360 (that is, approximately 16K / 12)

Any extra points are ignored. To draw a line with more points, divide the data into groups that have less than the maximum number of points and call the function for each group of points. Remember to connect the line segments.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

See Also

LineTo | MoveToEx | POINT | Polyline | PolyPolyline

Описание примера PolylineTo

В обработке события WM_PAINT:

  • Производится установка текущей позиции вызовом функции MoveToEx в координаты (50,50).
  • Вызывается функция PolylineТо cо следующими параметрами: указателем на массив points структур POINT c четырьмя элементами, и числом точек 4.

Внешний вид примера PolylineTo

PolylineTo
достать/запустить пример PolylineTo.exe

Исходный текст примера PolylineTo

PolylineTo.cpp

#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    POINT points[]={150,100,
                    100,150,
                    50,100,
                    100,50};
    switch(msg)
    {
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        MoveToEx(hdc,100,50,NULL);
        PolylineTo(hdc,points,4);
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{

    HWND hwnd;
    MSG msg;
    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW|CS_VREDRAW;
    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)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "PolylineTo",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,212, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}


PolyPolyline

PolyPolyline

Функция PolyPolyline рисует множество серий соединённых отрезков.

BOOL PolyPolyline(
  HDC hdc,                      // хэндл контекста устройства
  CONST POINT *lppt,            // массив точек
  CONST DWORD *lpdwPolyPoints,  // массив значений
  DWORD cCount                  // число элементов в массиве значений
);

Параметры

hdc
[in] Хэндл контекста устройства.
lppt
[in] Указатель на массив структур типа POINT, который содержит вершины полилиний, в логических единицах. Полилинии определены последовательно.
lpdwPolyPoints
[in] Указатель на массив переменных, определяющих количество точек в массиве lppt для соответствующих линий. Каждый элемент должен быть больше или равен двум.
cCount
[in] Определяет полное число элементов в массиве lpdwPolyPoints.

Возврат значения

Если функция успешна, возвращаемое значение не ноль.

Если функция не успешна, возвращаемое значение ноль.

Windows NT/2000/XP: Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Замечания

Отрезки линий рисуются с использование текущего пера. Фигура, составленная из отрезков, не закрашивается.

Текущая позиция никогда не использует, не изменяет текущую позицию.

Windows 95/98/Me: PolyPolyline не может рисовать больше определённого количества точек. Предел зависит от толщины линии (то есть, толщины пера выбранного внутри DC), как показано в следующей таблице.

Ширина линии | Максимально позволено точек
ширина линии 1 | 16K
ширина линии > 1 (то есть, широкая линия) и устройство поддерживает широкую линию | 16K
ширина линии > 1 но устройство не поддерживает широкую линию | приблизительно 1360 (то есть, приблизительно 16K / 12)

Любые точки свыше игнорируются. Чтобы нарисовать линию с большим количеством точек, делите данные на группы, которые меньше чем максимальное количество точек и вызывайте функцию для каждой группы точек. Не забудьте соединить группы отрезком.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.
Библиотека: Используйте Gdi32.lib.

См. так же

POINT | Polyline | PolylineTo

PolyPolyline

The PolyPolyline function draws multiple series of connected line segments.

BOOL PolyPolyline(
  HDC hdc,                      // handle to device context
  CONST POINT *lppt,            // array of points
  CONST DWORD *lpdwPolyPoints,  // array of values
  DWORD cCount                  // number of entries in values array
);

Parameters

hdc
[in] Handle to the device context.
lppt
[in] Pointer to an array of POINT structures that contains the vertices of the polylines, in logical units. The polylines are specified consecutively.
lpdwPolyPoints
[in] Pointer to an array of variables specifying the number of points in the lppt array for the corresponding polyline. Each entry must be greater than or equal to two.
cCount
[in] Specifies the total number of entries in the lpdwPolyPoints array.

Return Values

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero.

Windows NT/2000/XP: To get extended error information, call GetLastError.

Remarks

The line segments are drawn by using the current pen. The figures formed by the segments are not filled.

The current position is neither used nor updated by this function.

Windows 95/98/Me: PolyPolyline cannot draw more than a certain number of points. The limit depends on the line width (that is, the width of the pen selected into the DC), as shown in the following table.

Line width | Maximum points allowed
line width is 1 | 16K
line width > 1 (that is, wideline) and device supports wideline | 16K
line width > 1 but device does not support wideline | approximately 1360 (that is, approximately 16K / 12)

Any extra points are ignored. To draw a line with more points, divide the data into groups that have less than the maximum number of points and call the function for each group of points. Remember to connect the line segments.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

See Also

POINT | Polyline | PolylineTo

Описание примера Polyline

В обработке события WM_PAINT вызывается функция PolyPolyline cо следующими параметрами:

  • указателем на массив points структур POINT c восемью элементами
  • указателем на массив polypoints с числами точек для соответствующих полилиний (4 и 4)
  • числом элементов в массиве polypoints (число полилиний), 2.

Внешний вид примера PolyPolyline

PolyPolyline
достать/запустить пример PolyPolyline.exe

Исходный текст примера PolyPolyline

PolyPolyline.cpp

#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    POINT points[]={50,50,
                    150,100,
                    50,150,
                    50,50,
                    50,100,
                    150,50,
                    150,150,
                    50,100};
    DWORD polypoints[]={4,4};
    switch(msg)
    {
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        PolyPolyline(hdc,points,polypoints,2);
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{

    HWND hwnd;
    MSG msg;
    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW|CS_VREDRAW;
    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)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "PolyPolyline",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,212, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}


SetArcDirection

SetArcDirection

Функция SetArcDirection устанавливает направление рисования, используемое для функций дуг и прямоугольников.

int SetArcDirection(
  HDC hdc,           // хэндл контекста устройства
  int ArcDirection   // новое направление дуги
);

Параметры

hdc
[in] Хэндл контекста устройства.
ArcDirection
[in] Определяет новое направление дуги. этот параметр может принимать одно из следующих значений:
Величина | Значение
AD_COUNTERCLOCKWISE | Фигуры рисуются против часовой стрелки.
AD_CLOCKWISE | Фигуры рисуются по часовой стрелке.

Возврат значения

Если функция успешна, возвращаемое значение не ноль.

Если функция неуспешна, возвращаемое значение ноль.

Windows NT/2000/XP: Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Замечания

Направление по умолчанию - против часовой стрелки.

Функция SetArcDirection определяет направление, в котором рисуются следующие фигуры:

Arc
ArcTo
Chord
Ellipse
Pie
Rectangle
RoundRect

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 98 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.
Библиотека: Используйте Gdi32.lib.

См. так же

SetArcDirection

The SetArcDirection sets the drawing direction to be used for arc and rectangle functions.

int SetArcDirection(
  HDC hdc,           // handle to device context
  int ArcDirection   // new arc direction
);

Parameters

hdc
[in] Handle to the device context.
ArcDirection
[in] Specifies the new arc direction. This parameter can be one of the following values.
Value | Meaning
AD_COUNTERCLOCKWISE | Figures drawn counterclockwise.
AD_CLOCKWISE | Figures drawn clockwise.

Return Values

If the function succeeds, the return value specifies the old arc direction.

If the function fails, the return value is zero.

Windows NT/2000/XP: To get extended error information, call GetLastError.

Remarks

The default direction is counterclockwise.

The SetArcDirection function specifies the direction in which the following functions draw:

Arc
ArcTo
Chord
Ellipse
Pie
Rectangle
RoundRect

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 98 and later.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

See Also

Описание примера SetArcDirection

В обработке события WM_PAINT:

  • Вызывается функция Arc, рисующая нижнюю половину эллипса;
  • Вызывается функция SetArcDirection, меняющая направление рисования дуги с направления по умолчанию (против часовой) на по часовой;
  • Повторно вызывается функция Arc с теми же аргументами.

В результате получается отрисовка целого эллипса.

Внешний вид примера SetArcDirection

SetArcDirection
достать/запустить пример SetArcDirection.exe

Исходный текст примера SetArcDirection

SetArcDirection.cpp

#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    switch(msg)
    {
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        Arc(hdc,30,50,170,150,0,100,200,100);
        SetArcDirection(hdc,AD_CLOCKWISE);
        Arc(hdc,30,50,170,150,0,100,200,100);
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{

    HWND hwnd;
    MSG msg;
    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW|CS_VREDRAW;
    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)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "SetArcDirection",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,212, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}


DeleteObject

DeleteObject

Функция DeleteObject удаляет логическое перо, кисть, шрифт, битмап, регион, или палитру, освобождая все системные ресурсы, ассоциированные с объектом. После удаления объекта, указанный хэндл больше не действителен.

BOOL DeleteObject(
  HGDIOBJ hObject   // хэндл графического объекта
);

Параметры

hObject
[in] Хэндл логического пера, кисти, шрифта, битмапа, региона, или палитры.

Возврат значения

Если функция успешна, возвращаемое значение не ноль.

Если указанный хэндл не действителен, или в текущем состоянии выбран в контекст устройства, возвращаемое значение - ноль.

Windows NT/2000/XP: Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Замечания

Не удаляйте объекты рисования (перо или кисть), пока они ещё выбраны в DC.

Когда удаляется кисть с образцом, битмап, ассоциированный с кистью, не удаляется. Битмап должен быть удалён непосредственно.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.
Библиотека: Используйте Gdi32.lib.

См. так же

SelectObject

DeleteObject

The DeleteObject function deletes a logical pen, brush, font, bitmap, region, or palette, freeing all system resources associated with the object. After the object is deleted, the specified handle is no longer valid.

BOOL DeleteObject(
  HGDIOBJ hObject   // handle to graphic object
);

Parameters

hObject
[in] Handle to a logical pen, brush, font, bitmap, region, or palette.

Return Values

If the function succeeds, the return value is nonzero.

If the specified handle is not valid or is currently selected into a DC, the return value is zero.

Windows NT/2000/XP: To get extended error information, call GetLastError.

Remarks

Do not delete a drawing object (pen or brush) while it is still selected into a DC.

When a pattern brush is deleted, the bitmap associated with the brush is not deleted. The bitmap must be deleted independently.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

See Also

SelectObject

Описание примера DeleteObject

В обработке события WM_PAINT вызывается функция DeleteObject cо следующими параметрами: указателем на массив points структур POINT c пятью элементами, и числом точек 5.

Внешний вид примера DeleteObject

DeleteObject
достать/запустить пример DeleteObject.exe

Исходный текст примера DeleteObject

DeleteObject.cpp

#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    POINT points[5]={50,50,
                     150,50,
                     150,150,
                     50,150,
                     50,50};
    switch(msg)
    {
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        Polyline(hdc,points,5);
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{

    HWND hwnd;
    MSG msg;
    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW|CS_VREDRAW;
    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 = GetSysColorBrush(COLOR_WINDOW);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "Polyline",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,212, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}


Dolly

Находится в разработке


CreatePen

CreatePen

Функция CreatePen создаёт логическое перо с указанными стилем, шириной, и цветом. В дальнейшем, перо может быть выбрано в контекст устройства, и использоваться для рисования линий и кривых.

HPEN CreatePen(
  int fnPenStyle,    // стиль пера
  int nWidth,        // ширина пера
  COLORREF crColor   // цвет пера
);

Параметры

fnPenStyle
[in] Определяет стиль пера. Может иметь одно из следующих значений:

Величина | Значение
PS_SOLID | Перо сплошное.
PS_DASH | Штриховое перо. Этот стиль допустим только если ширина пера 1 или меньше единиц устройства.
PS_DOT | Точечное перо. Этот стиль допустим только если ширина пера 1 или меньше единиц устройства.
PS_DASHDOT | Здесь чередуются штрихи и точки. Этот стиль допустим только если ширина пера 1 или меньше единиц устройства.
PS_DASHDOTDOT | Здесь чередуются штрихи и две точки. Этот стиль допустим только если ширина пера 1 или меньше единиц устройства.
PS_NULL | Перо невидимо.
PS_INSIDEFRAME | Перо сплошное. Когда это перо используется в любой GDI функции, которая использует ограничивающий прямоугольник, размеры фигуры сокращаются так, чтобы вписаться в ограничивающий прямоугольник, берётся в счёт ширина пера. Это применимо только к геометрическим перьям.

nWidth
[in] Определяет ширину пера, в логических единицах. Если nWidth ноль, ширина пера один пиксель, независимо от текущей трансформации.

Функция CreatePen возвращает перо с указанной шириной и стилем PS_SOLID, если вы указываете ширину больше единицы для следующих стилей: PS_DASH, PS_DOT, PS_DASHDOT, PS_DASHDOTDOT.
crColor
[in] Определяет цвет пера. Чтобы создать структуру COLORREF, используйте макрос RGB.

Возврат значения

Если функция успешна, возвращаемое значение - хэндл, идентифицирующий логическое перо.

Если функция провалилась, возвращаемое значение - NULL.

Windows NT/2000/XP: Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Замечания

После того, как приложение создало логическое перо, оно может выбрать перо в контекст устройства вызовом функции SelectObject. После выбора пера в контекст устройства, оно может быть использоваться для рисования линий и кривых.

Если значение, указанное в параметре nWidth ноль, ширина линии, отрисованной созданным пером всегда один пиксель независимо от текущей трансформации.

Если значение, указанное в параметре nWidth больше 1, параметр fnPenStyle должен быть PS_NULL, PS_SOLID, или PS_INSIDEFRAME.

Если значение, указанное в параметре nWidth больше 1 и fnPenStyle PS_INSIDEFRAME, нарисованная пером линия рисуется внутри рамки всех примитивов, исключая полигоны и полилинии.

Если значение, указанное в параметре nWidth больше 1, fnPenStyle PS_INSIDEFRAME, и цвет, указанный в параметре crColor не соответствует ни одному существующему цвету в логической палитре, система рисует линию с использованием размытого цвета. Размытые цвета не доступны со сплошным пером.

Когда вам перо больше не нужно, вызовите функцию DeleteObject, которая его удалит.

ICM: Нет управления цветом при завершении создания кисти. Однако, управление цветом выполняется, когда кисть выбрана в ICM-видимый контекст устройства.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.
Библиотека: Используйте Gdi32.lib.

См. так же

CreatePenIndirect | COLORREF | DeleteObject | ExtCreatePen | GetObject | RGB | SelectObject

CreatePen

The CreatePen function creates a logical pen that has the specified style, width, and color. The pen can subsequently be selected into a device context and used to draw lines and curves.

HPEN CreatePen(
  int fnPenStyle,    // pen style
  int nWidth,        // pen width
  COLORREF crColor   // pen color
);

Parameters

fnPenStyle
[in] Specifies the pen style. It can be any one of the following values.
Value | Meaning
PS_SOLID | The pen is solid.
PS_DASH | The pen is dashed. This style is valid only when the pen width is one or less in device units.
PS_DOT | The pen is dotted. This style is valid only when the pen width is one or less in device units.
PS_DASHDOT | The pen has alternating dashes and dots. This style is valid only when the pen width is one or less in device units.
PS_DASHDOTDOT | The pen has alternating dashes and double dots. This style is valid only when the pen width is one or less in device units.
PS_NULL | The pen is invisible.
PS_INSIDEFRAME | The pen is solid. When this pen is used in any GDI drawing function that takes a bounding rectangle, the dimensions of the figure are shrunk so that it fits entirely in the bounding rectangle, taking into account the width of the pen. This applies only to geometric pens.

nWidth
[in] Specifies the width of the pen, in logical units. If nWidth is zero, the pen is a single pixel wide, regardless of the current transformation.

CreatePen returns a pen with the specified width bit with the PS_SOLID style if you specify a width greater than one for the following styles: PS_DASH, PS_DOT, PS_DASHDOT, PS_DASHDOTDOT.

crColor
[in] Specifies a color reference for the pen color. To generate a COLORREF structure, use the RGB macro.

Return Values

If the function succeeds, the return value is a handle that identifies a logical pen.

If the function fails, the return value is NULL.

Windows NT/2000/XP: To get extended error information, call GetLastError.

Remarks

After an application creates a logical pen, it can select that pen into a device context by calling the SelectObject function. After a pen is selected into a device context, it can be used to draw lines and curves.

If the value specified by the nWidth parameter is zero, a line drawn with the created pen always is a single pixel wide regardless of the current transformation.

If the value specified by nWidth is greater than 1, the fnPenStyle parameter must be PS_NULL, PS_SOLID, or PS_INSIDEFRAME.

If the value specified by nWidth is greater than 1 and fnPenStyle is PS_INSIDEFRAME, the line associated with the pen is drawn inside the frame of all primitives except polygons and polylines.

If the value specified by nWidth is greater than 1, fnPenStyle is PS_INSIDEFRAME, and the color specified by the crColor parameter does not match one of the entries in the logical palette, the system draws lines by using a dithered color. Dithered colors are not available with solid pens.

When you no longer need the pen, call the DeleteObject function to delete it.

ICM: No color management is done at creation. However, color management is performed when the pen is selected into an ICM-enabled device context.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

See Also

CreatePenIndirect | COLORREF | DeleteObject | ExtCreatePen | GetObject | RGB | SelectObject

Описание примера CreatePen

В обработке события WM_CREATE создаётся перо синего цвета со стилем PS_DASHDOTDOT вызовом функции CreatePen; при завершении программы кисть удаляется вызовом функции DeleteObject.

В обработке события WM_PAINT:

  • Созданное в событии WM_CREATE перо выбирается в контекст устройства вызовом функции SelectObject;
  • Bызывается функция Polyline, рисующая треугольник, очерченный текущим пером.

Внешний вид примера CreatePen

CreatePen
достать/запустить пример CreatePen.exe

Исходный текст примера CreatePen

CreatePen.cpp

#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    static HPEN hPen;
    static POINT points[4]={100,50,
                            150,150,
                            50,150,
                            100,50};
    switch(msg)
    {
    case WM_CREATE:
        hPen=CreatePen(PS_DASHDOTDOT,1,0x00ff0000);
        break;
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        SelectObject(hdc,hPen);
        Polyline(hdc,points,4);
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE:
        DeleteObject(hPen);
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{

    HWND hwnd;
    MSG msg;
    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW|CS_VREDRAW;
    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)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "CreatePen",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,212, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}


CreatePenIndirect

CreatePenIndirect

Функция CreatePenIndirect создаёт логическое косметическое перо, со стилем, шириной, и цветом, указанным в структуре.

HPEN CreatePenIndirect(
  CONST LOGPEN *lplgpn   // стиль, ширина, и цвет
);

Параметры

lplgpn
[in] Указатель на структуру LOGPEN, которая определяет стиль, ширину, и цвет.

Возврат значения

Если функция успешна, возвращаемое значение - хэндл, идентифицирующий логическое косметическое перо

Если функция провалилась, возвращаемое значение - NULL.

Windows NT/2000/XP: Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Замечания

После того как приложение создало логическое перо, оно может выбрать это перо в контекст устройства вызовом функции SelectObject. После того, как перо выбрано в контекст устройства, оно может использоваться для отрисовки линий и кривых.

Когда вам перо больше не нужно, вызовите функцию DeleteObject для удаления его.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.
Библиотека: Используйте Gdi32.lib.

См. так же

CreatePen | DeleteObject | ExtCreatePen | GetObject | LOGPEN | RGB | SelectObject

CreatePenIndirect

The CreatePenIndirect function creates a logical cosmetic pen that has the style, width, and color specified in a structure.

HPEN CreatePenIndirect(
  CONST LOGPEN *lplgpn   // style, width, and color
);

Parameters

lplgpn
[in] Pointer to a LOGPEN structure that specifies the pen's style, width, and color.

Return Values

If the function succeeds, the return value is a handle that identifies a logical cosmetic pen.

If the function fails, the return value is NULL.

Windows NT/2000/XP: To get extended error information, call GetLastError.

Remarks

After an application creates a logical pen, it can select that pen into a device context by calling the SelectObject function. After a pen is selected into a device context, it can be used to draw lines and curves.

When you no longer need the pen, call the DeleteObject function to delete it.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

See Also

CreatePen | DeleteObject | ExtCreatePen | GetObject | LOGPEN | RGB | SelectObject

Описание примера CreatePenIndirect

В обработке события WM_CREATE создаётся перо с атрибутами, указанными в структуре LOGPEN logpen вызовом функции CreatePenIndirect; при завершении программы кисть удаляется вызовом функции DeleteObject.

В обработке события WM_PAINT:

  • Созданное в событии WM_CREATE перо выбирается в контекст устройства вызовом функции SelectObject;
  • Bызывается функция Polyline, рисующая треугольник, очерченный текущим пером.

Внешний вид примера CreatePenIndirect

CreatePenIndirect
достать/запустить пример CreatePenIndirect.exe

Исходный текст примера CreatePenIndirect

CreatePenIndirect.cpp

#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    static HPEN hPen;
    static POINT point={10,0};
    static LOGPEN logpen={PS_SOLID,point,0x00c0dcc0};
    static POINT points[4]={100,50,
                            150,150,
                            50,150,
                            100,50};
    switch(msg)
    {
    case WM_CREATE:
        hPen=CreatePenIndirect(&logpen);
        break;
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        SelectObject(hdc,hPen);
        Polyline(hdc,points,4);
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE:
        DeleteObject(hPen);
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{

    HWND hwnd;
    MSG msg;
    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW|CS_VREDRAW;
    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)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "CreatePenIndirect",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,212, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}


ExtCreatePen

ExtCreatePen

Функция ExtCreatePen создаёт логическое косметическое или геометрическое перо, имеющее указанный стиль, ширину и атрибуты кисти.

HPEN ExtCreatePen(
  DWORD dwPenStyle,      // стиль пера
  DWORD dwWidth,         // ширина пера
  CONST LOGBRUSH *lplb,  // атрибуты кисти
  DWORD dwStyleCount,    // длина массива настраиваемого стиля
  CONST DWORD *lpStyle   // массив настраиваемого стиля
);

Параметры

dwPenStyle
[in] Определяет комбинацию атрибутов типа, стиля, кончика, и сопряжения. Значения по каждой категории объединяются с испопльзованием побитового оператора OR (|).

Тип пера может иметь одно из следующих значений:

Величина | Значение
PS_GEOMETRIC | Перо геометрическое.
PS_COSMETIC | Перо косметическое.

Стиль пера может иметь одно из следующих значений:

Величина | Значение
PS_ALTERNATE | Windows NT/2000/XP: Перо рисует каждый другой пиксель. (Этот стиль применим только для косметического пера.)
PS_SOLID | Перо сплошное.
PS_DASH Перо штриховое.

Windows 95: Этот стиль не поддерживается геометрическими линиями.

Windows 98/Me: Не поддерживается.
PS_DOT Перо точечное.

Windows 95/98/Me: Этот стиль не поддерживается геометрическими линиями.
PS_DASHDOT Перо из чередующихся точек и штрихов.

Windows 95: Этот стиль не поддерживается геометрическими линиями.

Windows 98/Me: Не поддерживается.
PS_DASHDOTDOT The pen has alternating dashes and double dots.

Windows 95: Этот стиль не поддерживается геометрическими линиями.

Windows 98/Me: Не поддерживается.
PS_NULL | Перо не видимо.
PS_USERSTYLE | Windows NT/2000/XP: Перо использует массив, определённый пользователем.
PS_INSIDEFRAME | Перо сплошное. Когда это перо используется в любой GDI функции, которая использует ограничивающий прямоугольник, размеры фигуры сокращаются так, чтобы вписаться в ограничивающий прямоугольник, берётся в счёт ширина пера. Это применимо только к геометрическим перьям.

Кончик указывается только для геометрических перьев. Кончик пера может иметь одно из следующих значений:

Величина | Значение
PS_ENDCAP_ROUND | Кончики круглые.
PS_ENDCAP_SQUARE | Кончики квадратные.
PS_ENDCAP_FLAT | Кончики плоские.

Сопряжение указывается только для геометрических перьев. Сопряжение может иметь одно из следующих значений:

Величина | Значение
PS_JOIN_BEVEL | Сопряжения скошенные.
PS_JOIN_MITER | Сопряжение углом, когда они находятся внутри текущего предела, устанавливаемого функцией SetMiterLimit. Если они превышают этот предел, сопряжения идут скосом.
PS_JOIN_ROUND | Сопряжения скруглённые.

Windows 95/98/Me: Стили PS_ENDCAP_ROUND, PS_ENDCAP_SQUARE, PS_ENDCAP_FLAT, PS_JOIN_BEVEL, PS_JOIN_MITER, and PS_JOIN_ROUND поддерживаются только геометрическими перьями, когда применяется рисование путями.

dwWidth
[in] Определяет ширину пера. Если параметр dwPenStyle PS_GEOMETRIC, ширина указывается в логических единицах. Если dwPenStyle - PS_COSMETIC, ширина должна быть 1.
lplb
[in] Указатель на структуру LOGBRUSH. Если dwPenStyle - PS_COSMETIC, член lbColor определяет цвет пера, и член lbStyle должен быть установлен в BS_SOLID. Если dwPenStyle - PS_GEOMETRIC, все члены должны использоваться для указания атрибутов кисти для пера.
dwStyleCount
[in] Определяет длину, в единицах DWORD массива lpStyle. Это значение должно быть ноль, если dwPenStyle не PS_USERSTYLE.
lpStyle
[in] Указатель на массив. Первое значение определяет длину первого штриха в определённым программистом стиле, второе значение определяет длину первого пробела, и так далее. Этот указатель должен быть NULL, если dwPenStyle не PS_USERSTYLE.

Возврат значения

Если функция успешна, возвращаемое значение - хэндл, идентифицирующий логическое перо.

Если функция провалилась, возвращаемое значение - NULL.

Windows NT/2000/XP: Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Замечания

Геометрическое перо может иметь любую ширину и любые атрибуты кисти, такие как приближение и образцы. Косметическое перо может иметь ширину только один пиксель и должно быть одного цвета, но косметические перья намного быстрее чем геометрические.

Ширина геометрического пера всегда указывается в глобальных единицах. Ширина косметического пера всегда 1.

Кончики и сопряжения указываются только для геометрических перьев.

После того, как приложение создало логическую кисть, она может быть выбрана в контекст устройства вызовом функции SelectObject. После того как перо выбрано в контекст устройства, оно может использоваться для рисования линий и кривых.

Если dwPenStyle - PS_COSMETIC и PS_USERSTYLE, составляющие массива lpStyle определяют длины штрихов и пробелов в единицах стиля. Единицы стиля определяются устройством, в котором перо используется для отрисовки линии.

Если dwPenStyle - PS_GEOMETRIC и PS_USERSTYLE, составляющие массива lpStyle определяют длины штрихов и пробелов в логических единицах.

Если dwPenStyle - PS_ALTERNATE, единицы стиля игнорируются и рисуется каждый другой пиксель.

Если член lbStyle структуры LOGBRUSH указанной в lplb - BS_PATTERN, битмап, указанный в члене lbHatch этой структуры не должен быть DIB секцией. DIB секция это битмап, созданный функцией CreateDIBSection. Если этот битмап - DIB секция, Функция ExtCreatePen провалится.

Когда приложению больше не требуется определённое перо, оно должно вызвать функцию DeleteObject для удаления пера.

ICM: Нет управления цветом при завершении создания кисти. Однако, управление цветом выполняется, когда кисть выбрана в ICM-видимый контекст устройства.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.
Библиотека: Используйте Gdi32.lib.

См. так же

CreateDIBSection | CreatePen | CreatePenIndirect | DeleteObject | GetObject | LOGBRUSH | SelectObject | SetMiterLimit

ExtCreatePen

The ExtCreatePen function creates a logical cosmetic or geometric pen that has the specified style, width, and brush attributes.

HPEN ExtCreatePen(
  DWORD dwPenStyle,      // pen style
  DWORD dwWidth,         // pen width
  CONST LOGBRUSH *lplb,  // brush attributes
  DWORD dwStyleCount,    // length of custom style array
  CONST DWORD *lpStyle   // custom style array
);

Parameters

dwPenStyle
[in] Specifies a combination of type, style, end cap, and join attributes. The values from each category are combined by using the bitwise OR operator (|).

The pen type can be one of the following values.

Value | Meaning
PS_GEOMETRIC | The pen is geometric.
PS_COSMETIC | The pen is cosmetic.

The pen style can be one of the following values.

Value | Meaning
PS_ALTERNATE | Windows NT/2000/XP: The pen sets every other pixel. (This style is applicable only for cosmetic pens.)
PS_SOLID | The pen is solid.
PS_DASH The pen is dashed.

Windows 95: This style is not supported for geometric lines.

Windows 98/Me: Not supported.
PS_DOT The pen is dotted.

Windows 95/98/Me: This style is not supported for geometric lines.
PS_DASHDOT The pen has alternating dashes and dots.

Windows 95: This style is not supported for geometric lines.

Windows 98/Me: Not supported.
PS_DASHDOTDOT The pen has alternating dashes and double dots.

Windows 95: This style is not supported for geometric lines.

Windows 98/Me: Not supported.
PS_NULL | The pen is invisible.
PS_USERSTYLE | Windows NT/2000/XP: The pen uses a styling array supplied by the user.
PS_INSIDEFRAME | The pen is solid. When this pen is used in any GDI drawing function that takes a bounding rectangle, the dimensions of the figure are shrunk so that it fits entirely in the bounding rectangle, taking into account the width of the pen. This applies only to geometric pens.

The end cap is only specified for geometric pens. The end cap can be one of the following values.

Value | Meaning
PS_ENDCAP_ROUND | End caps are round.
PS_ENDCAP_SQUARE | End caps are square.
PS_ENDCAP_FLAT | End caps are flat.

The join is only specified for geometric pens. The join can be one of the following values.

Value | Meaning
PS_JOIN_BEVEL | Joins are beveled.
PS_JOIN_MITER | Joins are mitered when they are within the current limit set by the SetMiterLimit function. If it exceeds this limit, the join is beveled.
PS_JOIN_ROUND | Joins are round.

Windows 95/98/Me: The PS_ENDCAP_ROUND, PS_ENDCAP_SQUARE, PS_ENDCAP_FLAT, PS_JOIN_BEVEL, PS_JOIN_MITER, and PS_JOIN_ROUND styles are supported only for geometric pens when used to draw paths.

dwWidth
[in] Specifies the width of the pen. If the dwPenStyle parameter is PS_GEOMETRIC, the width is given in logical units. If dwPenStyle is PS_COSMETIC, the width must be set to 1.
lplb
[in] Pointer to a LOGBRUSH structure. If dwPenStyle is PS_COSMETIC, the lbColor member specifies the color of the pen and the lbStyle member must be set to BS_SOLID. If dwPenStyle is PS_GEOMETRIC, all members must be used to specify the brush attributes of the pen.
dwStyleCount
[in] Specifies the length, in DWORD units, of the lpStyle array. This value must be zero if dwPenStyle is not PS_USERSTYLE.
lpStyle
[in] Pointer to an array. The first value specifies the length of the first dash in a user-defined style, the second value specifies the length of the first space, and so on. This pointer must be NULL if dwPenStyle is not PS_USERSTYLE.

Return Values

If the function succeeds, the return value is a handle that identifies a logical pen.

If the function fails, the return value is NULL.

Windows NT/2000/XP: To get extended error information, call GetLastError.

Remarks

A geometric pen can have any width and can have any of the attributes of a brush, such as dithers and patterns. A cosmetic pen can only be a single pixel wide and must be a solid color, but cosmetic pens are generally faster than geometric pens.

The width of a geometric pen is always specified in world units. The width of a cosmetic pen is always 1.

End caps and joins are only specified for geometric pens.

After an application creates a logical pen, it can select that pen into a device context by calling the SelectObject function. After a pen is selected into a device context, it can be used to draw lines and curves.

If dwPenStyle is PS_COSMETIC and PS_USERSTYLE, the entries in the lpStyle array specify lengths of dashes and spaces in style units. A style unit is defined by the device where the pen is used to draw a line.

If dwPenStyle is PS_GEOMETRIC and PS_USERSTYLE, the entries in the lpStyle array specify lengths of dashes and spaces in logical units.

If dwPenStyle is PS_ALTERNATE, the style unit is ignored and every other pixel is set.

If the lbStyle member of the LOGBRUSH structure pointed to by lplb is BS_PATTERN, the bitmap pointed to by the lbHatch member of that structure cannot be a DIB section. A DIB section is a bitmap created by CreateDIBSection. If that bitmap is a DIB section, the ExtCreatePen function fails.

When an application no longer requires a specified pen, it should call the DeleteObject function to delete the pen.

ICM: No color management is done at pen creation. However, color management is performed when the pen is selected into an ICM-enabled device context.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

See Also

CreateDIBSection | CreatePen | CreatePenIndirect | DeleteObject | GetObject | LOGBRUSH | SelectObject | SetMiterLimit

Описание примера ExtCreatePen

В обработке события WM_CREATE:

  • Приложение получает хэндл запущеного экземпляра программы вызовом функции GetModuleHandle, он нам понадобится для загрузки битмапа;
  • Загружается битмап из ресурсов выполняющейся программы вызовом функции LoadBitmap;
  • Создаётся перо с образцом этого битмапа ExtCreatePen.

В обработке события WM_PAINT:

  • Созданное в событии WM_CREATE перо выбирается в контекст устройства вызовом функции SelectObject;
  • Bызывается функция Polyline, рисующая треугольник, очерченный текущим пером.

Созданные перо и битмап удаляются при закрытии окна.

Внешний вид примера ExtCreatePen

ExtCreatePen
достать/запустить пример ExtCreatePen.exe

Исходный текст примера CreatePen

ExtCreatePen.cpp

#include <windows.h>
#include "resource.h"
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    static HINSTANCE hInstance;
    static HBITMAP hBmp;
    static HPEN hPen;
    static LOGBRUSH logBrush;
    static POINT points[4]={100,50,
                            150,150,
                            50,150,
                            100,50};
    switch(msg)
    {
    case WM_CREATE:
        hInstance=(HINSTANCE)GetModuleHandle(NULL);
        hBmp=LoadBitmap(hInstance,MAKEINTRESOURCE(BITMAP_ID));
        logBrush.lbStyle=BS_PATTERN;
        logBrush.lbColor=0;
        logBrush.lbHatch=(LONG)hBmp;
        hPen=ExtCreatePen(PS_GEOMETRIC,8,&logBrush,0,NULL);
        break;
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        SelectObject(hdc,hPen);
        Polyline(hdc,points,4);
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE:
        DeleteObject(hBmp);
        DeleteObject(hPen);
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
                    PSTR, int nCmdShow)
{

    HWND hwnd;
    MSG msg;
    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW|CS_VREDRAW;
    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)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "myWindowClass";
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
                          "ExtCreatePen",WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,212, 231,
                          NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}

resource.rc

#include "resource.h"
BITMAP_ID BITMAP "gradient.bmp"

resource.h

#define BITMAP_ID 10


LOGPEN

Структура LOGPEN определяет стиль, ширину, и цвет пера. Функция CreatePenIndirect использует структуру LOGPEN.

typedef struct tagLOGPEN {
  UINT     lopnStyle;
  POINT    lopnWidth;
  COLORREF lopnColor;
} LOGPEN, *PLOGPEN;

Члены

lopnStyle
Определяет стиль пера, который может иметь одно из следующих значений.

Величина | Значение
PS_SOLID | Перо сплошное.
PS_DASH | Перо штриховое.
PS_DOT | Перо точечное.
PS_DASHDOT | Перо из чередующихся штрихов и точек.
PS_DASHDOTDOT | Перо из чередующихся штрихов и двойных точек.
PS_NULL | Перо не видимо.
PS_INSIDEFRAME | Перо сплошное. Когда это перо используется в любой GDI функции, которая использует ограничивающий прямоугольник, размеры фигуры сокращаются так, чтобы вписаться в ограничивающий прямоугольник, берётся в счёт ширина пера. Это применимо только к геометрическим перьям.

lopnWidth
Определяет структуру POINT, которая содержит ширину пера, в логических единицах. Если член lopnWidth NULL, перо шириной в один пиксель на растровом устройстве. Член y в структуре POINT для lopnWidth не используется.
lopnColor
Определяет цвет пера. Чтобы создать структуру COLORREF, используйте макрос RGB.

Замечания

Если ширина пера больше чем 1 и стиль пера PS_INSIDEFRAME, нарисованная пером линия рисуется внутри рамки всех примитивов, исключая полигоны и полилинии. Если цвет пера не соответствует ни одному доступному RGB значению, перо рисуется с логическим (размытым) цветом. Если ширина пера меньше или равна 1, стиль PS_INSIDEFRAME идентичен стилю PS_SOLID.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.

См. так же

COLORREF | CreatePenIndirect | POINT | RGB

LOGPEN

The LOGPEN structure defines the style, width, and color of a pen. The CreatePenIndirect function uses the LOGPEN structure.

typedef struct tagLOGPEN {
  UINT     lopnStyle;
  POINT    lopnWidth;
  COLORREF lopnColor;
} LOGPEN, *PLOGPEN;

Members

lopnStyle
Specifies the pen style, which can be one of the following values.

Value | Meaning
PS_SOLID | The pen is solid.
PS_DASH | The pen is dashed.
PS_DOT | The pen is dotted.
PS_DASHDOT | The pen has alternating dashes and dots.
PS_DASHDOTDOT | The pen has dashes and double dots.
PS_NULL | The pen is invisible.
PS_INSIDEFRAME | The pen is solid. When this pen is used in any GDI drawing function that takes a bounding rectangle, the dimensions of the figure are shrunk so that it fits entirely in the bounding rectangle, taking into account the width of the pen. This applies only to geometric pens.

lopnWidth
Specifies the POINT structure that contains the pen width, in logical units. If the lopnWidth member is NULL, the pen is one pixel wide on raster devices. The y member in the POINT structure for lopnWidth is not used.
lopnColor
Specifies the pen color. To generate a COLORREF structure, use the RGB macro.

Remarks

If the width of the pen is greater than 1 and the pen style is PS_INSIDEFRAME, the line is drawn inside the frame of all GDI objects except polygons and polylines. If the pen color does not match an available RGB value, the pen is drawn with a logical (dithered) color. If the pen width is less than or equal to 1, the PS_INSIDEFRAME style is identical to the PS_SOLID style.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.

See Also

COLORREF | CreatePenIndirect | POINT | RGB

Без примера


EXTLOGPEN

Структура EXTLOGPEN определяет стиль пера, ширину, и атрибуты кисти для расширенного пера. Эта структура используется функцией GetObject , когда запрашивается описание пера, которое было создано, когда приложение вызвало функцию ExtCreatePen.

typedef struct tagEXTLOGPEN {
  DWORD     elpPenStyle;
  DWORD     elpWidth;
  UINT      elpBrushStyle;
  COLORREF  elpColor;
  ULONG_PTR elpHatch;
  DWORD     elpNumEntries;
  DWORD     elpStyleEntry[1];
} EXTLOGPEN, *PEXTLOGPEN;

Члены

elpPenStyle
Определяет комбинацию типа пера, стиля, стиля кончика, и стиля сопряжения. Значение по каждой категории может быть получено использованием побитового оператора AND с соответствующей маской.

Член elpPenStyle с маской PS_TYPE_MASK может принимать одно из следующих значений типа пера:

Величина | Значение
PS_GEOMETRIC | Перо геометрическое.
PS_COSMETIC | Перо косметическое.

Член elpPenStyle с маской PS_STYLE_MASK может принимать одно из следующих значений стиля пера:

Величина | Значение
PS_DASH | Перо штриховое.
PS_DASHDOT | Перо из чередующихся штрихов и точек.
PS_DASHDOTDOT | Перо из чередующихся штрихов и двойных точек.
PS_DOT | Перо точечное.
PS_INSIDEFRAME | Перо сплошное. Когда это перо используется в любой GDI функции, которая использует ограничивающий прямоугольник, размеры фигуры сокращаются так, чтобы вписаться в ограничивающий прямоугольник, берётся в счёт ширина пера. Это применимо только к PS_GEOMETRIC перьям.
PS_NULL | Перо не видимо.
PS_SOLID | Перо сплошное.
PS_USERSTYLE | Перо использует массив стиля, определённый пользователем.

Следующие величины значения только для PS_GEOMETRIC перьев. Член elpPenStyle с маской PS_ENDCAP_MASK может принимать одно из следующих значений кончика пера:

Величина | Значение
PS_ENDCAP_FLAT | Кончик линии плоский.
PS_ENDCAP_ROUND | Кончик линии скруглённый.
PS_ENDCAP_SQUARE | Кончик линии квадратный.

Следующие величины значения только для PS_GEOMETRIC перьев. Член elpPenStyle с маской PS_JOIN_MASK имеет одно из следующих значений сопряжения пера:

Величина | Значение
PS_JOIN_BEVEL | Сопряжения скошенные.
PS_JOIN_MITER | Сопряжение углом, когда они находятся внутри текущего предела, устанавливаемого функцией SetMiterLimit. Сопряжения скошенные, когда они превышают предел.
PS_JOIN_ROUND | Сопряжения скруглённые.

elpWidth
Определяет ширину пера. Если член elpPenStyle - PS_GEOMETRIC, это значение - ширина линии в логических единицах. Иначе, линии косметические, и это значение 1, что означает ширину линии в пикселях.
elpBrushStyle
Определяет стиль кисти для пера. Значение члена elpBrushStyle может быть одним из следующих:

Величина | Значение
BS_DIBPATTERN | Определяет образец кисти, определённой DIB спецификацией. Если elpBrushStyle - BS_DIBPATTERN, член elpHatch содержит хэндл упакованного DIB. Дополнительную информацию см. в обсуждении elpHatch
BS_DIBPATTERNPT | Определяет образец кисти, определённой DIB спецификацией. Если elpBrushStyle - BS_DIBPATTERNPT, член elpHatch содержит указатель на упакованный DIB. Дополнительную информацию см. в обсуждении elpHatch.
BS_HATCHED | Определяет штриховую кисть.
BS_HOLLOW | Определяет пустую или NULL кисть.
BS_PATTERN | Определяет кисть по образцу, определённому по битмапу в памяти.
BS_SOLID | Определяет сплошную кисть.

elpColor

Если elpBrushStyle - BS_SOLID или BS_HATCHED, elpColor определяет цвет, в который закрашивается кисть. Для BS_HATCHED, функции SetBkMode и SetBkColor задают цвет фона.

Если elpBrushStyle - BS_HOLLOW или BS_PATTERN, elpColor игнорируется.

Если elpBrushStyle - BS_DIBPATTERN или BS_DIBPATTERNPT, слово нижнего разряда elpColor определяет, содержит ли член bmiColors структуры BITMAPINFO явное RGB значение или индексируется в текуще-реализованной логической палитре. Значение elpColor должно быть одним из следующих:

Величина | Значение
DIB_PAL_COLORS | Таблица цветов содержит массив 16-битных индексов в текуще-реализованной логической палитре
DIB_RGB_COLORS | Таблица цветов содержит буквальные RGB значения.

Макрос RGB используется для создания структуры COLORREF.

elpHatch

Если elpBrushStyle - BS_PATTERN, elpHatch - хэндл на битмап, который определяет образец.

Если elpBrushStyle - BS_SOLID или BS_HOLLOW, elpHatch игнорируется.

Если elpBrushStyle - BS_DIBPATTERN, член elpHatch -хэндл на упакованный DIB. Чтобы получить этот хэндл, приложение вызывает функцию GlobalAlloc с GMEM_MOVEABLE (или LocalAlloc с LMEM_MOVEABLE) чтобы разместить блок памяти, и затем залить память упакованным DIB. Упакованный DIB содержит структуру BITMAPINFO непосредственно следующей за массивом байтов, который определяет пиксели битмапа.

Если elpBrushStyle - BS_DIBPATTERNPT, член elpHatch - указатель на упакованный DIB. Указатель получается из блока памяти, созданного LocalAlloc с набором LMEM_FIXED или GlobalAlloc с набором GMEM_FIXED, или это указатель, возвращённый вызовом, например LocalLock (хэндл_dib). Упакованный DIB содержит структуру BITMAPINFO непосредственно следующей за массивом байтов, который определяет пиксели битмапа.

Если elpBrushStyle - BS_HATCHED, член elpHatch определяет ориентацию линий, используемых для создания штриховки. Он может принимать одно из следующих значений:

Величина | Значение
HS_BDIAGONAL | штриховка 45 градусов вверх (слева на право)
HS_CROSS | Пересекающиеся штрихи горизонтальные и вертикальные
HS_DIAGCROSS | Пересекающиеся штрихи под углом 45 градусов
HS_FDIAGONAL | штриховка 45 градусов вниз (слева на право)
HS_HORIZONTAL | Горизонтальная штриховка
HS_VERTICAL | Вертикальная штриховка

elpNumEntries
Определяет число составляющих в массиве стиля члена elpStyleEntry. Это значение должно быть 0, если elpPenStyle определён не как PS_USERSTYLE.
elpStyleEntry

Определяет a определённый пользователем массив стиля. Нассив определяется с конечной длинной, но используется так, как будто его повторяемость не определена. Первая составляющая в массиве определяет длину первого штриха. Вторая составляющая в массиве определяет длину первого пробела. Затем, длины штрихов и пробелов повторяются.

Если elpWidth определяет геометрические линии, длина в логических единицах. Иначе, линии косметические, и длина в единицах устройства.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.

См. так же

BITMAPINFO | COLORREF | ExtCreatePen | GetObject | GlobalAlloc | RGB | SetBkColor | SetBkMode

EXTLOGPEN

The EXTLOGPEN structure defines the pen style, width, and brush attributes for an extended pen. This structure is used by the GetObject function when it retrieves a description of a pen that was created when an application called the ExtCreatePen function.

typedef struct tagEXTLOGPEN {
  DWORD     elpPenStyle;
  DWORD     elpWidth;
  UINT      elpBrushStyle;
  COLORREF  elpColor;
  ULONG_PTR elpHatch;
  DWORD     elpNumEntries;
  DWORD     elpStyleEntry[1];
} EXTLOGPEN, *PEXTLOGPEN;

Members

elpPenStyle
Specifies a combination of pen type, style, end cap style, and join style. The values from each category can be retrieved by using a bitwise AND operator with the appropriate mask.

The elpPenStyle member masked with PS_TYPE_MASK has one of the following pen type values.

Value | Meaning
PS_GEOMETRIC | The pen is geometric.
PS_COSMETIC | The pen is cosmetic.

The elpPenStyle member masked with PS_STYLE_MASK has one of the following pen styles values:

Value | Meaning
PS_DASH | The pen is dashed.
PS_DASHDOT | The pen has alternating dashes and dots.
PS_DASHDOTDOT | The pen has alternating dashes and double dots.
PS_DOT | The pen is dotted.
PS_INSIDEFRAME | The pen is solid. When this pen is used in any GDI drawing function that takes a bounding rectangle, the dimensions of the figure are shrunk so that it fits entirely in the bounding rectangle, taking into account the width of the pen. This applies only to PS_GEOMETRIC pens.
PS_NULL | The pen is invisible.
PS_SOLID | The pen is solid.
PS_USERSTYLE | The pen uses a styling array supplied by the user.

The following category applies only to PS_GEOMETRIC pens. The elpPenStyle member masked with PS_ENDCAP_MASK has one of the following end cap values.

Value | Meaning
PS_ENDCAP_FLAT | Line end caps are flat.
PS_ENDCAP_ROUND | Line end caps are round.
PS_ENDCAP_SQUARE | Line end caps are square.

The following category applies only to PS_GEOMETRIC pens. The elpPenStyle member masked with PS_JOIN_MASK has one of the following join values.

Value | Meaning
PS_JOIN_BEVEL | Line joins are beveled.
PS_JOIN_MITER | Line joins are mitered when they are within the current limit set by the SetMiterLimit function. A join is beveled when it would exceed the limit.
PS_JOIN_ROUND | Line joins are round.

elpWidth
Specifies the width of the pen. If the elpPenStyle member is PS_GEOMETRIC, this value is the width of the line in logical units. Otherwise, the lines are cosmetic and this value is 1, which indicates a line with a width of one pixel.
elpBrushStyle
Specifies the brush style of the pen. The elpBrushStyle member value can be one of the following.

Value | Meaning
BS_DIBPATTERN | Specifies a pattern brush defined by a DIB specification. If elpBrushStyle is BS_DIBPATTERN, the elpHatch member contains a handle to a packed DIB. For more information, see discussion in elpHatch
BS_DIBPATTERNPT | Specifies a pattern brush defined by a DIB specification. If elpBrushStyle is BS_DIBPATTERNPT, the elpHatch member contains a pointer to a packed DIB. For more information, see discussion in elpHatch.
BS_HATCHED | Specifies a hatched brush.
BS_HOLLOW | Specifies a hollow or NULL brush.
BS_PATTERN | Specifies a pattern brush defined by a memory bitmap.
BS_SOLID | Specifies a solid brush.

elpColor

If elpBrushStyle is BS_SOLID or BS_HATCHED, elpColor specifies the color in which the pen is to be drawn. For BS_HATCHED, the SetBkMode and SetBkColor functions determine the background color.

If elpBrushStyle is BS_HOLLOW or BS_PATTERN, elpColor is ignored.

If elpBrushStyle is BS_DIBPATTERN or BS_DIBPATTERNPT, the low-order word of elpColor specifies whether the bmiColors members of the BITMAPINFO structure contain explicit RGB values or indices into the currently realized logical palette. The elpColor value must be one of the following.

Value | Meaning
DIB_PAL_COLORS | The color table consists of an array of 16-bit indices into the currently realized logical palette.
DIB_RGB_COLORS | The color table contains literal RGB values.

The RGB macro is used to generate a COLORREF structure.

elpHatch

If elpBrushStyle is BS_PATTERN, elpHatch is a handle to the bitmap that defines the pattern.

If elpBrushStyle is BS_SOLID or BS_HOLLOW, elpHatch is ignored.

If elpBrushStyle is BS_DIBPATTERN, the elpHatch member is a handle to a packed DIB. To obtain this handle, an application calls the GlobalAlloc function with GMEM_MOVEABLE (or LocalAlloc with LMEM_MOVEABLE) to allocate a block of memory and then fills the memory with the packed DIB. A packed DIB consists of a BITMAPINFO structure immediately followed by the array of bytes that define the pixels of the bitmap.

If elpBrushStyle is BS_DIBPATTERNPT, the elpHatch member is a pointer to a packed DIB. The pointer derives from the memory block created by LocalAlloc with LMEM_FIXED set or by GlobalAlloc with GMEM_FIXED set, or it is the pointer returned by a call like LocalLock (handle_to_the_dib). A packed DIB consists of a BITMAPINFO structure immediately followed by the array of bytes that define the pixels of the bitmap.

If elpBrushStyle is BS_HATCHED, the elpHatch member specifies the orientation of the lines used to create the hatch. It can be one of the following values.

Value | Meaning
HS_BDIAGONAL | 45-degree upward hatch (left to right)
HS_CROSS | Horizontal and vertical crosshatch
HS_DIAGCROSS | 45-degree crosshatch
HS_FDIAGONAL | 45-degree downward hatch (left to right)
HS_HORIZONTAL | Horizontal hatch
HS_VERTICAL | Vertical hatch

elpNumEntries
Specifies the number of entries in the style array in the elpStyleEntry member. This value is zero if elpPenStyle does not specify PS_USERSTYLE.
elpStyleEntry

Specifies a user-supplied style array. The array is specified with a finite length, but it is used as if it repeated indefinitely. The first entry in the array specifies the length of the first dash. The second entry specifies the length of the first gap. Thereafter, lengths of dashes and gaps alternate.

If elpWidth specifies geometric lines, the lengths are in logical units. Otherwise, the lines are cosmetic and lengths are in device units.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.

See Also

BITMAPINFO | COLORREF | ExtCreatePen | GetObject | GlobalAlloc | RGB | SetBkColor | SetBkMode

Без примера


RECT

Структура RECT впределяет координаты верхнего левого и нижнего правого углов прямоугольника.

typedef struct _RECT {
  LONG left;
  LONG top;
  LONG right;
  LONG bottom;
} RECT, *PRECT;

Члены

left
Определяет x-координату верхнего левого угла прямоугольника.
top
Определяет y-координату верхнего левого угла прямоугольника.
right
Определяет x-координату нижнего правого угла прямоугольника.
bottom
Определяет y-координату нижнего правого угла прямоугольника.

Замечания

Когда структура RECT передаётся в функцию FillRect, прямоугольник начинает заливаться, но не включая, правый ряд и нижнюю строку пикселей. Эта структура идентична структуре RECTL.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.

См. так же

FillRect | RECTL | SMALL_RECT

RECT

The RECT structure defines the coordinates of the upper-left and lower-right corners of a rectangle.

typedef struct _RECT {
  LONG left;
  LONG top;
  LONG right;
  LONG bottom;
} RECT, *PRECT;

Members

left
Specifies the x-coordinate of the upper-left corner of the rectangle.
top
Specifies the y-coordinate of the upper-left corner of the rectangle.
right
Specifies the x-coordinate of the lower-right corner of the rectangle.
bottom
Specifies the y-coordinate of the lower-right corner of the rectangle.

Remarks

When RECT is passed to the FillRect function, the rectangle is filled up to, but not including, the right column and bottom row of pixels. This structure is identical to the RECTL structure.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Windef.h; include Windows.h.

See Also

FillRect | RECTL | SMALL_RECT

Без примера


POINT

Структура POINT определяет x- и y- координаты точки.

typedef struct tagPOINT {
  LONG x;
  LONG y;
} POINT, *PPOINT;

Члены

x
Определяет x-координату точки.
y
Определяет y-координату точки.

Требования

Windows NT/2000/XP: Включена в Windows NT 3.1 и дальнейших.
Windows 95/98/Me: Включена в Windows 95 и дальнейших.
Хэдер: Объявлена в Wingdi.h; подключать Windows.h.

См. так же

GetBrushOrgEx | PtInRect | SetBrushOrgEx

POINT

The POINT structure defines the x- and y- coordinates of a point.

typedef struct tagPOINT {
  LONG x;
  LONG y;
} POINT, *PPOINT;

Members

x
Specifies the x-coordinate of the point.
y
Specifies the y-coordinate of the point.

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Windef.h; include Windows.h.

See Also

GetBrushOrgEx | PtInRect | SetBrushOrgEx

Без примера