Использование OnPaint и Invalidate в MFC

416
11 января 2017, 01:57

Возникла проблема в MFC при работе с OnPaint и Invalidate. Дело в том, что при срабатывании Invalidate (которая делает недействительной клиентскую часть окна) вызывается OnPaint (которая эту самую часть перерисовывает). То есть посредством этих двух функций происходит обновление картинки в окне и все это делается в классе, отвечающем за клиентскую часть окна (который в моем случае называется AVIPlayerDlg). Так вот, мне нужно функцию OnPaint вынести в новый, производный от CWnd класс (назовем его MyWnd). Я так сделал, но проблема в том, что теперь при вызове Invalidate (вызываемого из AVIPlayerDlg.cpp) OnPaint (находящийся в MyWnd.cpp) не вызывается. Так вот, вопрос, как сделать так, чтобы вызывался?

P.S.: я попытался описать суть проблемы, опуская ненужную информацию, поэтому она выглядит как-будто "вырванной из контекста". Надеюсь, я смог описать все достаточно четко для понимания.

Обновление

void Cpr2Dlg::OnTimer(UINT_PTR nIDEvent)//Таймер, считающий время
{
    // TODO: добавьте свой код обработчика сообщений или вызов стандартного
    {
        //Здесь происходит обработка 
        //времени работы таймера, 
        //вследствие чего раз в некоторый 
        //n-ный промежуток времени вызывается...
        Invalidate(false);
    }
    CDialogEx::OnTimer(nIDEvent);
}

//Так было изначально
//Функции принадлежали одному классу
//Поэтому через некоторое время после вызова Invalidate
//автоматически вызывался OnPaint
void Cpr2Dlg::OnPaint()
{
    CPaintDC dc(this); // контекст устройства для рисования
    HRESULT re = SetDIBitsToDevice (dc, 140, 20, 210, 180, 0, 0, 0, 180, dlg.dataConv, theApp.bmpInfoOut, DIB_RGB_COLORS);
}
//Теперь же OnPaint принадлежит другому классу
//И при срабатывании Invalidate не вызывается
//А нужно, чтобы вызывалась
//class MyWnd : public CWnd - Класс MyWnd я создал сам и он наследуется от CWnd - основного класса окна
void CMyWnd::OnPaint()
{
    CPaintDC dc(this); // контекст устройства для рисования
    HRESULT re = SetDIBitsToDevice (dc, 140, 20, 210, 180, 0, 0, 0, 180, dlg.dataConv, theApp.bmpInfoOut, DIB_RGB_COLORS);
}

Попытался предоставить фрагмент кода, проблема в том, что проект довольно-таки обширный и разбит на несколько файлов. Надеюсь, так будет понятнее

READ ALSO
Вызов виртуальной функции С++

Вызов виртуальной функции С++

Не понимаю как вызывается функция Receiver::Process() в проектеИскал через (ctrl+shift+f), нашел только использование в Task::TaskExec()

322
Вывести в консоль квадрат в квадрате со ***

Вывести в консоль квадрат в квадрате со ***

Здравствуйте! С обычным квадратом все просто, но как в него засунуть поменьше квадрат, вот это проблемка

413
Передача массива в функцию и range-based цикл

Передача массива в функцию и range-based цикл

Весь мозг поломал, перечитал все об указателях и так и не понял как сделать этот код работоспособнымКак прямо сказать циклу что я ему подсовываю...

304
Как собрать библиотеки WebM для MinGW

Как собрать библиотеки WebM для MinGW

Стоит задача реализовать в приложении на C++ потоковое видео (для браузеров), дали направление - WebMНа официальном сайте куча репозиториев (кодеки,...

311