Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > неправильное заполнение прямоугольника


Автор: Andrej23 5.4.2012, 15:22
Доброго времени суток.

Делаю метод, выводящий график на основное окно программы. Заливаю фон цветом Graph1.BkColor, когда копирую картинку из hMemDC на экран, заливка появляется, но почему-то другого цвета. Graph1.BkColor=RGB(110,210,110);, а здесь появляется белый с зелеными точками (при том, что кисть делаю solid). 
когда пытаюсь нарисовать линию, она рисуется тоже другим цветом (рисую светло-серую, а она черная).

Подскажите плз, в чем ошибка?
(в файле, если он прикрепился, снимок графика, зеленый обод по краям, это Graph1.BkColor, посередине заливка).


Код

void CGraphWindow::PaintGraph2(HWND hWnd){
    HDC hdc=GetDC(hWnd);    //получаю указатель на окно приложения
    hMemDC=::CreateCompatibleDC (hdc); //создаю совместимый контекст устройства
    HBITMAP bmp, oldbmp;
    bmp=::CreateCompatibleBitmap (hMemDC, Graph1.Width - 2*Graph1.Frame.Width, Graph1.Heigh - 2*Graph1.Frame.Width);   //создаю карту нужного размера
    oldbmp = (HBITMAP)::SelectObject (hMemDC, bmp);    //прицепляю битовую карту к совместимому контексту

    //вывожу фон графика
    RECT GrRect; 
        
    GrRect.left=0;
    GrRect.right=Graph1.Width - 2*Graph1.Frame.Width-1;
    GrRect.top=0;
    GrRect.bottom=Graph1.Heigh - 2*Graph1.Frame.Width-1;
HBRUSH hBrush=CreateSolidBrush(Graph1.BkColor);
    
FillRect(hMemDC, &GrRect, (HBRUSH) hBrush);
    DeleteObject(hBrush);
    
                //рисую линию, должна быть светло-серой, рисуется черной
                HPEN pen = CreatePen(PS_SOLID,2,RGB(220,220,220));
    SelectObject(hMemDC,pen);
    MoveToEx(hMemDC,10,10,NULL);
    LineTo(hMemDC,100,100);
    DeleteObject(pen);

                ::BitBlt (hdc, Graph1.x0+Graph1.Frame.Width, Graph1.y0+Graph1.Frame.Width, Graph1.Width - 2*Graph1.Frame.Width, Graph1.Heigh - 2*Graph1.Frame.Width, hMemDC, 0, 0, SRCCOPY); //переношу картинку из памяти на экран

}


Добавлено @ 15:29
При создании битовой карты указал оригинал hdc, а не совместимый hMemDC и всё заработало правильно.
Код

bmp=::CreateCompatibleBitmap (hdc, Graph1.Width - 2*Graph1.Frame.Width, Graph1.Heigh - 2*Graph1.Frame.Width);   //создаю карту нужного размера




Вопрос снимаю (можно сказать генеральский эффект - с обеда мучился, а как на форум выложил, сразу ответ нашел). smile

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