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


Автор: Alexander777 31.12.2006, 14:15
Я делаю в  Visual C++ v. 6.0 вручную линейный индикатор в виде растущего закрашенного прямоугольника. На этот индикатор, в середину, я хочу вывести сколько процентов работы выполнено. Как сделать так чтобы цвет выводимых цифр сильно отличался и от закрашенной части индикатора и от незакрашенной части? Напрмер, как сделать, чтобы выводимый текст складывался с цветами уже выведенного изображения (прямоугольника) по xor?

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

Автор: Alexander777 2.1.2007, 16:31
а как создать временный dc?
строка CDC dc даёт нулевые указатели на контекст устройства  smile 

Автор: zkv 2.1.2007, 17:39
Цитата(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;
}

Автор: Alexander777 5.1.2007, 13:40
Почему-то функция 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);

}

Автор: zkv 7.1.2007, 01:21
удалил

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

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

Автор: Alexander777 11.1.2007, 01:44
Да у меня что-то и не получается через 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 работал?



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

Автор: Alexander777 12.1.2007, 20:30
Да, теперь всё работает smile 
Всем большое спасибо. 

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