Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [GDI+] DrawImage - странный эффект при отрисовке 
:(
    Опции темы
ksili
Дата 31.3.2009, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

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



Не знаю в том ли подфоруме я спрашиваю...

В приложении на C++ (MFC) используется GDI+ для масштабирования и отрисовки фоновых рисунков. Кроме всяких рисуночков и изображений шапок форм есть рисунок основного фона. Он на самом деле меньше всех форм, поэтому при отрисовке растягивается. Так вот было замечено, что при его отрисовке, он сначала рисуется в некотором одном и том же месте экрана (не окна приложения, а в глобальных координатах!) нерастянутый, а потом уже нормально отбражается форма приложения. При этом предыдущая косячная отрисовка исчезает. Но видна она только в тех местах, где это пересекается с формой приложения. Т.е. если эти области не пересекаются, то никакого эффекта не видно. 
При масштабе экрана 96dpi (стандартный) область, где сначала отрисовывается эта неотмасштабированная картинка вот такая:
user posted image
При масштабе 120dpi соответственно побольше:
user posted image
Вот в таком случае взаимного положения окна приложения и этой области никакого неприятного эффекта  нет:
user posted image
Вот в таком случае левую отрисовку видно в заштрихованной области:
user posted image

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

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 и глюк проявляется только в некоторых из них. 


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




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


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

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