Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > [GDI+] DrawImage - странный эффект при отрисовке


Автор: ksili 31.3.2009, 10:04
Не знаю в том ли подфоруме я спрашиваю...

В приложении на C++ (MFC) используется GDI+ для масштабирования и отрисовки фоновых рисунков. Кроме всяких рисуночков и изображений шапок форм есть рисунок основного фона. Он на самом деле меньше всех форм, поэтому при отрисовке растягивается. Так вот было замечено, что при его отрисовке, он сначала рисуется в некотором одном и том же месте экрана (не окна приложения, а в глобальных координатах!) нерастянутый, а потом уже нормально отбражается форма приложения. При этом предыдущая косячная отрисовка исчезает. Но видна она только в тех местах, где это пересекается с формой приложения. Т.е. если эти области не пересекаются, то никакого эффекта не видно. 
При масштабе экрана 96dpi (стандартный) область, где сначала отрисовывается эта неотмасштабированная картинка вот такая:
http://ipicture.ru/Gallery/Viewfull/16557122.html
При масштабе 120dpi соответственно побольше:
http://ipicture.ru/Gallery/Viewfull/16557173.html
Вот в таком случае взаимного положения окна приложения и этой области никакого неприятного эффекта  нет:
http://ipicture.ru/Gallery/Viewfull/16557257.html
Вот в таком случае левую отрисовку видно в заштрихованной области:
http://ipicture.ru/Gallery/Viewfull/16557339.html

Отрисовка выполняется так:
Код

BOOL CBaseDlg::OnEraseBkgnd(CDC* pDC)
{
    BOOL result = CDialogEx::OnEraseBkgnd(pDC);
    Status st;

    try
    {
        Graphics graphics(pDC->m_hDC);

        if(m_ImageBottom!=NULL)
        {
        
            RECT bounds;
            this->GetClientRect(&bounds);

            int imageHeight = (float)(bounds.right - bounds.left)/m_ImageBottom->GetWidth() * m_ImageBottom->GetHeight();

            Rect rc(0 , bounds.bottom - imageHeight , bounds.right - bounds.left, imageHeight );

            st = graphics.DrawImage(
                m_ImageBottom,rc,0,0,m_ImageBottom->GetWidth(),m_ImageBottom->GetHeight(),UnitPixel);
        
        }
    
    }
    catch(...)
    {
        //TODO:

    }

    return result;
}

Логгированием я проверил, что  кординаты в DrawImage всегда одинаковые. Т.е. никаких выездов за форму нет.

Кто-нибудь сталкивался с таким? Может это стандартный глюк GDI+ и уже известно как его лечить?

В приложении несколько диалогов, все они наследники этого CBaseDlg и глюк проявляется только в некоторых из них. 

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