Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с отрисовкой окна 
V
    Опции темы
zzzenia
  Дата 6.2.2009, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте!
Я создаю окно, в нем 2 слайдера и перемещается некоторое количество точек. Окно постоянно перерисовывается по таймеру (Invalidate(TRUE)). Сперва все отображается корректно, но после определенного количества отрисовок пропадают оба слайдера и точки из цветных становятся черно-белыми... :(
Не могу понять, почему...
Код функции:

void MainDialog::OnPaint() 
{
    PAINTSTRUCT ps;
            CDC* pDC = BeginPaint(&ps);
    m_objects = *m_context.getObjects();    
    for (objMap::iterator i = m_objects.begin(); i != m_objects.end(); ++i)
    {
        if (i->second->getInterface(I_BUS) == 0)
        {
                                    HPEN hPen = CreatePen (PS_SOLID, 3, RGB(255,0,0) );
            pDC->SelectObject(hPen);
        }
        else
        {
            HPEN hPen = CreatePen (PS_SOLID, 3, RGB(0,200,0) );
            pDC->SelectObject(hPen);
        }
        Point2d p = i->second->getPos();
        pDC->Ellipse(INIT_X + p.x - 5 , INIT_Y + p.y - 5, INIT_X + p.x + 5, INIT_Y + p.y + 5);
    }
    EndPaint(&ps);
Спасибо!
PM MAIL   Вверх
Earnest
Дата 6.2.2009, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ты постоянно создаешь перья, но никогда их не удаляешь. Вот и кончаются у тебя GDI-ресурсы.
Правильно так:
1) создал перо и выбрал в контекст
2) нарисовал
3) востановил старое перо
4) удалил перо

Судя по коду, тебе всего-то 2 пера разных нужны. Создай их один раз и запомни в переменных класса, где-нибудь в конструкторе. И рисуй на здоровье. А в деструкторе класса разрушь. Но при этом убирать перо их контектса все равно надо, в конце рисования. Есть 2 обешепринятых способа:
1) при установке пера запоминаешь, что там было установлено до тебя (SelectObject возвращает), а после завершения риования восстанавливаешь старое перо
2) просто устанавливаешь одино из предопределенных перьев функцией SelectStockObject.
В твоем случае удобнее второй способ, т.к. ты постоянно меняешь перья в цикле



--------------------
...
PM   Вверх
zzzenia
Дата 6.2.2009, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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


 




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


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

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