Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Наложение цвета выводимого шрифта на изображение 
V
    Опции темы
Alexander777
Дата 31.12.2006, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я делаю в  Visual C++ v. 6.0 вручную линейный индикатор в виде растущего закрашенного прямоугольника. На этот индикатор, в середину, я хочу вывести сколько процентов работы выполнено. Как сделать так чтобы цвет выводимых цифр сильно отличался и от закрашенной части индикатора и от незакрашенной части? Напрмер, как сделать, чтобы выводимый текст складывался с цветами уже выведенного изображения (прямоугольника) по xor?
PM MAIL   Вверх
_hunter
Дата 2.1.2007, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 5
Всего: 98



можно и ксорить. а можно и самому закрашивать (цвета ты всеравно знаеш)
т.е. делаеш так -- рисуеш прямоуголник. потом на временном dc рисуеш (DrawText/TextOut) текс. потому переносиш его попиксельно (GetPixel/PutPixel) (пиксели подложки (например цвет FFFFFF) не переносиш) переносиш на основную канву. а цвет пикселя выбираеш исходя из того -- перешел ли прогресс этот столбец или нет...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Alexander777
Дата 2.1.2007, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



а как создать временный dc?
строка CDC dc даёт нулевые указатели на контекст устройства  smile 

PM MAIL   Вверх
zkv
Дата 2.1.2007, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

Репутация: 16
Всего: 92



Цитата(Alexander777 @  2.1.2007,  16:31 Найти цитируемый пост)
как создать временный dc?

например
Код

int CMyView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
    if (CScrollView::OnCreate(lpCreateStruct) == -1)
        return -1;
    
    // Создадим совместимый контекст для виртуального экрана
    CPaintDC dc(this); 
    m_VirtScreenDC.CreateCompatibleDC(&dc); //CDC  CMyView::m_VirtScreenDC 

    return 0;
}

PM MAIL   Вверх
Alexander777
Дата 5.1.2007, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Почему-то функция GetPixel не работает (возвращает 0xFFFFFFFF) smile 

Код

void CTestPixelOperationsView::OnDraw(CDC* pDC)
{
    CTestPixelOperationsDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here

    COLORREF tsvet;
    RECT Rect;
    GetClientRect(&Rect);
    tsvet=pDC->GetPixel(Rect.left, Rect.top);

}

PM MAIL   Вверх
zkv
Дата 7.1.2007, 01:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

Репутация: 16
Всего: 92



удалил

Это сообщение отредактировал(а) zkv - 5.5.2007, 04:10
PM MAIL   Вверх
Earnest
Дата 10.1.2007, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(_hunter @  2.1.2007,  14:15 Найти цитируемый пост)
т.е. делаеш так -- рисуеш прямоуголник. потом на временном dc рисуеш (DrawText/TextOut) текс. потому переносиш его попиксельно (GetPixel/PutPixel) (пиксели подложки (например цвет FFFFFF) не переносиш) переносиш на основную канву. а цвет пикселя выбираеш исходя из того -- перешел ли прогресс этот столбец или нет... 

GetPixel\SetPixel не стоит использовать, когда есть BitBlt.
Т.е. 
1) строим совместимый контекст и выбираем туда битмап-маску (т.е. бинарный), 
2) рисуем в него текст (белым по черному), 
3) делаем BitBlt в экранный контекст из временного операцией, скажем, SRCINVERT. Операцию можно подобрать и поудачнее, разобравшись с кодами тернарных операций - см. MSDN. 



--------------------
...
PM   Вверх
Alexander777
Дата 11.1.2007, 01:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да у меня что-то и не получается через GetPixel\SetPixel   
Для теста я сделал SDI приложение и набрал следующий код:

Код

void CTestPixelOperationsView::OnDraw(CDC* pDC)
{
    CTestPixelOperationsDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    RECT Rect;
    GetClientRect(&Rect);
    //создаём временный dc
    CDC tempdc;
    tempdc.CreateCompatibleDC(pDC); 
    //рисуем закрашенный прямоугольник во весь экран
    CBrush brush(RGB(0, 0, 255));
    tempdc.SelectObject(&brush);
    tempdc.Rectangle(Rect.left, Rect.top, Rect.right, Rect.bottom);
    //получаем значение точки из центра закрашенного прямоугольника:
    int x=((float)Rect.right+Rect.left)/2;
    int y=((float)Rect.top+Rect.bottom)/2;
    COLORREF color;
    color=tempdc.GetPixel(x,y);//возвращает 0xffffffff
    //выводим на экран
    pDC->SetPixelV(x, y, color);
}



GetPixel возвращает ошибку  smile 
Интересно, как сделать, чтобы GetPixel работал?



PM MAIL   Вверх
Earnest
Дата 12.1.2007, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ты не  создал битмап и не выбрал его в совместимый контекст. А по умолчанию там выбран черно-белый битмап размером 1*1.


--------------------
...
PM   Вверх
Alexander777
Дата 12.1.2007, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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


 




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


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

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