Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с OnPaint. Не пойму, что не так, По простому - ОК. С буферизацией - :( 
V
    Опции темы
Kolia
Дата 22.10.2006, 01:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 132
Регистрация: 11.7.2003
Где: Вильнюс

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



Имею void CSaverWnd::OnPaint() (CWnd->CSaverWnd)
Ее могу реализовать в двух вариантах.
Первый. Он работает, но есть мерцание:
Код

void CSaverWnd::OnPaint() 
{
    CPaintDC dc(this); // device context for painting
    this->m_table.DrawTable(&dc);
}



Второй. С буферизацией.
Код

void CSaverWnd::OnPaint() 
{
    CDC *pDC;
    CDC dcMem;
    CBitmap *pOldBmpMem;
    CBitmap BmpNewMem;
    CRect rCl;
    BOOL ret;

    pDC = this->GetDC();
    this->GetClientRect(&rCl);

    dcMem.CreateCompatibleDC(pDC);
    BmpNewMem.CreateCompatibleBitmap(pDC, rCl.Width(), rCl.Height());

    pOldBmpMem = dcMem.SelectObject(&BmpNewMem);

    this->m_table.DrawTable(&dcMem);

    pDC->BitBlt(0, 0, rCl.Width(), rCl.Height(), &dcMem, 0, 0, SRCCOPY);

    dcMem.SelectObject(pOldBmpMem);
    BmpNewMem.DeleteObject();
    dcMem.DeleteDC();
    ReleaseDC(pDC);
}


В программе есть таймер, который через определенное время обновляет данные и заставляет окно перерисовываться. Проблема в том, что если я реализую OnPaint() вторым способом, то никакого обновления данных не происходит. Я вписал в нее строки

Код

...
    this->m_table.CalculateSchedulePos(); //тут что-то меняется с данными
    this->m_table.DrawTable(&dcMem);
...

Тогда все начало меняться. Но делается это естественно не после сообщения таймера. То есть такое чувство, что программа из этой функции не выходит, а в ней и зацикливается. И не реагирует не на какие сообщения таймера. Понимаю, что чего-то не учел, но чего не пойму. smile 

Добавил в конец
Код

CWnd::OnPaint();

и заработало. Может кто пояснит сей факт... smile 


Это сообщение отредактировал(а) Kolia - 22.10.2006, 02:18
--------------------
Риспект
PM MAIL ICQ Skype GTalk MSN   Вверх
Step
Дата 23.10.2006, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Kolia @  22.10.2006,  01:42 Найти цитируемый пост)
В программе есть таймер, который через определенное время обновляет данные и заставляет окно перерисовываться. Проблема в том, что если я реализую OnPaint() вторым способом, то никакого обновления данных не происходит. Я вписал в нее строки

а как она заставляет


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
maxim1000
Дата 23.10.2006, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Kolia @ 22.10.2006,  00:42)
Добавил в конец
Код

CWnd::OnPaint();

и заработало. Может кто пояснит сей факт... smile

может, в нём вызывалось EndPaint?


--------------------
qqq
PM WWW   Вверх
Earnest
Дата 23.10.2006, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



А также BeginPaint().

Во втором варианте сделай так:
Код

CPaintDC dc(this);  // вместо GetDC
dcMem.CreateCompatibleDC(&dc);
// ... и далее по тексту

И не надо никакого CWnd::OnPaint();

Программа не реагирует на таймер, т.к. постоянно занимается обновлением: обрабатывает OnPaint. Без вызова BeginPaint\EndPaint не снимается "инвалидность". А таймер по приоритету - самый последний.

Основное правило: если уж хватаешь OnPaint, то будь любезен сделать валидным окно. Это можно сделать многими способами, но самый простой - создать объект CPaintDC, тем более что тебе в любом случае нужен контекст.

Все дело в волшебных пузырьках... smile 


--------------------
...
PM   Вверх
Kolia
Дата 25.10.2006, 02:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 132
Регистрация: 11.7.2003
Где: Вильнюс

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



да прибудет с вами бабмуча! smile 

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


 




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


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

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