Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Нарисовать линии определенным цветом


Автор: Fedor 5.10.2005, 15:51
САБЖ. Нужно нарисовать линии заданным цветом. В помощь себе брал http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/devcons_34qa.asp, но что-то не получается в этой строке:

Код

SetDCPenColor(hdc,RGB(0x00,0xff,0x00));

компилятор не может найти эту функцию.

Вот. Как исправить? Или может более удобный метод есть?

Автор: Coocky 5.10.2005, 16:23
Код

CPen pen(PS_DOT,3,RGB(255,0,0));//Карандаш красного цвета
pDC->SelectObject(&pen);// CDC*pDC-указатель на контекст устройство

Можно так smile
Добавлено @ 16:31



Контекст устройства и класс CDC.
Существует много видов аппаратуры ( много различных видов принтеров и мониторов и т.п.). Само собой вывод информации на различные виды аппаратуры различен.Он существенно зависит от характеристик и методов работы с ними. Чтобы унифицировать вывод информации была разработана специальная структура . Её название - контекст устройства. С помощью неё осуществляется связь с аппаратурой и вывод данных. Для контекста устройства характерны 3 основных параметра:

Шрифт - шрифт,которым будут выводиться данные.
Кисть - для закрашивания.
Перо - для рисования линий.
В любой момент времени используется только лишь один экземпляр этих инструментов. Для работы с контекстом устройства предназначен класс CDC. В нем есть все те функции, которые понадобятся вам для работы. В нем скрыты все сложности работы с различным аппаратным обеспечением. Вам не понадобится изучать устройство каждого отдельного монитора. Вам нужно лишь создать объект класса CDC и работать через него.

Генеалогия класса СDC:

Этот класс напрямую наследуется от CObject. В принципе это довольно не характерно для классов,которые мы уже рассмотрели. Просмотрим его внутренности (мы рассмотрим не все функции этого класса,а лишь те которые нам понадобятся для написания программ в ближайщем будущем ):

Создание

CDC();
Конструктор класса.

Создание

CPen* SelectObject(CPen* pPen);
CBrush* SelectObject(CBrush* pBrush);
virtual CFont* SelectObject(CFont* pFont);
CBitmap* SelectObject(CBitmap* pBitmap);
int SelectObject(CRgn* pRgn);
Выбирает новый объект в контекст устройства.
Возвращаемое значение равно старому значению.
Т.е. в зависимости от того какая функция вызывается заменяется
соответствующий параметр, например кисть или шрифт.
pPen - указатель на новое перо.
pBrush - указатель на новую кисть.
pFont - указатель на новый шрифт.
pBitmap - указатель на новую битмапину.
pRgn - указатель на новый регион (понятие региона будет введено позже).

virtual CGdiObject* SelectStockObject(int nIndex);
Выбирает новый объект в контекст устройства.
Объект берется из числа предопределенных.
Существуют преопределенные шрифты,кисти,перья ( карандаш ).
В случае удачного завершения функции возвращаемое значение равно
старому объекту или NULL в обратном случае.
nIndex - определяет предопределенный объект ( может принимать такие значения ):
BLACK_BRUSH - черная кисть.
DKGRAY_BRUSH - темно-серая кисть.
GRAY_BRUSH - серая кисть.
HOLLOW_BRUSH - пустая ( прозрачная кисть ).
LTGRAY_BRUSH - светло-серая кисть.
NULL_BRUSH - то же самое,что и HOLLOW_BRUSH.
WHITE_BRUSH - белая кисть.
BLACK_PEN - черный карандаш.
NULL_PEN - пустой ( прозрачный карандаш ).
WHITE_PEN - белый карандаш.
ANSI_FIXED_FONT - непропорциональный системный шрифт ANSI.
ANSI_VAR_FONT - пропорциональный системный шрифт ANSI.
DEVICE_DEFAULT_FONT - шрифт, зависящий от устройства.
OEM_FIXED_FONT - непропорциональный шрифт OEM.
SYSTEM_FONT - системный шрифт, используемый по умолчанию для
отображения пунктов меню и т.п. Пропорциональный.
SYSTEM_FIXED_FONT - непропорциональный системный шрифт,
используется для совместимости с предыдущими версиями Windows.
DEFAULT_PALETTE - основная палитра, в которой 20 цветов.

virtual COLORREF SetBkColor(COLORREF crColor);
Устанавливает новый цвет заднего фона.
Возвращаемое значение - предыдущий цвет фона. Если происходит ошибка
вернется - 0x80000000.
crColor - значение нового цвета в форме RGB.

virtual COLORREF SetTextColor(COLORREF crColor);
Устанавливает новый цвет для текста.
Возвращаемое значение - предыдущий цвет текста.
crColor - значение нового цвета в форме RGB.










Карандаш. Класс CPen
Генеалогия


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

Создание

CPen( );
// Конструктор по умолчанию

CPen( int nPenStyle, int nWidth, COLORREF crColor );
// nPenStyle - стиль карандаша:
// PS_SOLID - сплошная линия;
// PS_DASH - длинные штрихи, толщина которых <= 1 (в единицах
// устройства);
// PS_DOT - короткие штрихи, толщина которых <= 1 (в единицах
// устройства);
// PS_DASHDOT - штрих-пунктир, толщина которых <= 1 (в единицах
// устройства);
// PS_DASHDOTDOT - двойной штрих-пунктир, толщина которых <= 1
// (в единицах устройства);
// PS_NULL - "невидимая" линия;
// PS_INSIDEFRAME - сплошная линия для рисования по внутренней границе
// замкнутой области, например, при использовании функций класса CDC
// Rectangle, Ellipse и т. д.; при использовании карандаша данного типа
// для рисования линий, например, с помощью функции LineTo, результат
// будет тем же, что и для стиля PS_SOLID; еще одна область применения
// данного стиля - создание карандашей толщиной более одного пикселя и
// имеющих цвет, недоступный для текущего устройства; в этом случае
// линии будут состоять из пикселей доступных цветов, совокупность
// которых будет наиболее близко соответствовать заданному цвету.

// nWidth - толщина линии, если 0, то ширина линии в единицах устройства
// всегда будет равна одному пикселю.

// crColor - цвет линии.

Инициализация

BOOL CreatePen( int nPenStyle, int nWidth, COLORREF crColor );
// Создает карандаш (значения параметров функции см. соответствующий
// конструктор). Функция возвращает истину в случае успешного завершения.





Кисть. Класс CBrush
Генеалогия


Представляемый класс инкапсулирует графический объект Windows - "кисть". Данный объект служит, прежде всего, для закрашивания замкнутых фигур. Кисти бывают однотонные (сплошные), со штриховкой или созданные на основе шаблона.

Создание

CBrush( );
// Конструктор по умолчанию

CBrush( COLORREF crColor );
// Параметр служит для задания цвета кисти.

CBrush( int nIndex, COLORREF crColor );
// nIndex - задает стиль штриховки:
// HS_BDIAGONAL - 45-градусная штриховка слева направо и сверху вниз;
// HS_CROSS - горизонтальная и вертикальная штриховка крест-накрест;
// HS_DIAGCROSS - 45-градусная штриховка крест-накрест;
// HS_FDIAGONAL - 45-градусная штриховка слева направо и снизу вверх;
// HS_HORIZONTAL - горизонтальная штриховка;
// HS_VERTICAL - вертикальная штриховка.

// crColor - цвет штриховки.

CBrush( CBitmap* pBitmap );
// pBitmap - адрес битового массива (картинки), на основе которого
// создается кисть. Картинку необходимо предварительно загрузить.
// Причем картинка должна иметь размер более 8х8 пикселей.

Инициализация

BOOL CreateSolidBrush( COLORREF crColor );
// Создание сплошной (однотонной) кисти заданного цвета.
// В случае успешного завершения функция возвращает истину.

BOOL CreateHatchBrush( int nIndex, COLORREF crColor );
// Создание кисти со штриховкой заданного цвета (см. соответствующий
// конструктор). В случае успешного завершения функция возвращает истину.

BOOL CreatePatternBrush( CBitmap* pBitmap );
// Создание кисти на основе шаблона (битового массива).
// В случае успешного завершения функция возвращает истину.

BOOL CreateSysColorBrush( int nIndex );
// Создание кисти на основе системного цвета.
// В случае успешного завершения функция возвращает истину.

Примечание:
за более полной информацией обращайтесь в MSDN.





Автор: Fedor 5.10.2005, 17:15
Благодарю
Добавлено @ 17:17
Coocky а вот такой вопрос: а нужно потом уничтожать эти объекты CPen или не обязательно?

Автор: Coocky 5.10.2005, 17:20
Цитата(Fedor @ 5.10.2005, 17:15)
Coocky а вот такой вопрос: а нужно потом уничтожать эти объекты CPen или не обязательно?

Да...
Код

pen.DeleteObject();

Добавлено @ 17:22
Или так можно
Код

CPen*p_pen=pDC->SelectObject(&pen);// 
......
....
....
pDC->SelectObject(p_pen);// востановить прежнее перо..

Автор: Earnest 7.10.2005, 14:02
Coocky, это же не одно и то же.
Необходимо производить обе операции - сначала отцепить перо от контекста (выбрав другое), потом уничтожить. Правда, вторая операция выполняется неявно в деструкторе CPen.
Причем следует иметь в виду: если удалить перо, выбранное в этот момент в контекст, будет утечка GDI-ресурсов. Так что повнимательнее с этим.
А CPen::DeleteObject() имеет смысл вызывать только если ты хочешь повторно использовать объект CPen для другого пера... иначе MFC орет.

Автор: Coocky 7.10.2005, 16:52
Я забыл сказать, что pDC->SelectObject(p_pen);-обязательно
а pen.DeleteObject();, делается перед созданием другого пера, иначе -debuge smile
Пардон smile

Автор: Fedor 3.6.2007, 13:16
Е-мае smile Нашел свою старую тему, и как раз сейчас меня этот вопрос тревожит.

В общем, чтоб бы я ни делал, линии в любом случае рисуются черным. Цвет не меняется. Может ли это быть какая-то стандартная проблема? Типа что нужно заранее в DC или в CChildWindow указать что-то?

Автор: Greeen 3.6.2007, 13:24
А как ты сейчас делаешь?

Автор: Fedor 3.6.2007, 13:45
О, сорри. Все заработало. Был прикол с некорректным удалением объектов CPen. Я то удалял, то не удалял, в итоге лажа возникала.

Автор: Greeen 3.6.2007, 14:07
 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)