Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нарисовать линии определенным цветом 
V
    Опции темы
Fedor
Дата 5.10.2005, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Днепрянин
****


Профиль
Группа: Участник
Сообщений: 2090
Регистрация: 8.2.2003
Где: Великий

Репутация: нет
Всего: 32



САБЖ. Нужно нарисовать линии заданным цветом. В помощь себе брал http://msdn.microsoft.com/library/default....evcons_34qa.asp, но что-то не получается в этой строке:

Код

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

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

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

Это сообщение отредактировал(а) Fedor - 5.10.2005, 15:52


--------------------
Мы - Днепряне. Мы всех сильней.
PM ICQ   Вверх
Coocky
Дата 5.10.2005, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



Код

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.







--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Fedor
Дата 5.10.2005, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Днепрянин
****


Профиль
Группа: Участник
Сообщений: 2090
Регистрация: 8.2.2003
Где: Великий

Репутация: нет
Всего: 32



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


--------------------
Мы - Днепряне. Мы всех сильней.
PM ICQ   Вверх
Coocky
Дата 5.10.2005, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



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

Да...
Код

pen.DeleteObject();

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

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


Это сообщение отредактировал(а) Coocky - 5.10.2005, 17:22


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Earnest
Дата 7.10.2005, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



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


--------------------
...
PM   Вверх
Coocky
Дата 7.10.2005, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



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


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Fedor
Дата 3.6.2007, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Днепрянин
****


Профиль
Группа: Участник
Сообщений: 2090
Регистрация: 8.2.2003
Где: Великий

Репутация: нет
Всего: 32



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

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


--------------------
Мы - Днепряне. Мы всех сильней.
PM ICQ   Вверх
Greeen
Дата 3.6.2007, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 710
Регистрация: 13.8.2006
Где: Петербург

Репутация: 10
Всего: 18



А как ты сейчас делаешь?


--------------------
Подпись больше не нужна
PM MAIL ICQ Skype   Вверх
Fedor
Дата 3.6.2007, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Днепрянин
****


Профиль
Группа: Участник
Сообщений: 2090
Регистрация: 8.2.2003
Где: Великий

Репутация: нет
Всего: 32



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


--------------------
Мы - Днепряне. Мы всех сильней.
PM ICQ   Вверх
Greeen
Дата 3.6.2007, 14:07 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 710
Регистрация: 13.8.2006
Где: Петербург

Репутация: 10
Всего: 18



 smile 


--------------------
Подпись больше не нужна
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0502 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.