sdi и invalidate
От: Scvorcov Dmitriy  
Дата: 02.05.02 03:18
Оценка:
Есть SDI интерфейс и в нем диалог, когда в диалоге я вожу slider нужно чтобы в это время выполнялся OnDraw в SDI, как правильно это сделать?

Сейчас использую Invalidate для главного окна, но появилась проблема — если слишком быстро водить slider то обновление замирает, т.е. почему-то приложение не ждет окончания OnDraw. Идеально было бы сделать какую-нибудь переменную которая обнулялась бы перед циклом а затем туда (уже после обработки OnDraw) заносилось бы какое-нибудь значение, но как это сделать. Полез было в WaitForSingleObject, но там дремучий лес. Help people!!!
Re: sdi и invalidate
От: Bell Россия  
Дата: 02.05.02 05:35
Оценка:
Здравствуйте Scvorcov Dmitriy, Вы писали:

SD>Есть SDI интерфейс и в нем диалог, когда в диалоге я вожу slider нужно чтобы в это время выполнялся OnDraw в SDI, как правильно это сделать?


SD>Сейчас использую Invalidate для главного окна, но появилась проблема — если слишком быстро водить slider то обновление замирает, т.е. почему-то приложение не ждет окончания OnDraw. Идеально было бы сделать какую-нибудь переменную которая обнулялась бы перед циклом а затем туда (уже после обработки OnDraw) заносилось бы какое-нибудь значение, но как это сделать. Полез было в WaitForSingleObject, но там дремучий лес. Help people!!!


Что-то я не совсем понял. Можно поподробнее о том,что за цикл, и куда нужно заносить значение?
Любите книгу — источник знаний (с) М.Горький
Re[2]: sdi и invalidate
От: Аноним  
Дата: 03.05.02 02:39
Оценка:
Здравствуйте Bell, Вы писали:

B>Здравствуйте Scvorcov Dmitriy, Вы писали:


SD>>Есть SDI интерфейс и в нем диалог, когда в диалоге я вожу slider нужно чтобы в это время выполнялся OnDraw в SDI, как правильно это сделать?


SD>>Сейчас использую Invalidate для главного окна, но появилась проблема — если слишком быстро водить slider то обновление замирает, т.е. почему-то приложение не ждет окончания OnDraw. Идеально было бы сделать какую-нибудь переменную которая обнулялась бы перед циклом а затем туда (уже после обработки OnDraw) заносилось бы какое-нибудь значение, но как это сделать. Полез было в WaitForSingleObject, но там дремучий лес. Help people!!!


B>Что-то я не совсем понял. Можно поподробнее о том,что за цикл, и куда нужно заносить значение?


Вот такой код стоит в диалоге:

DoImage();

CMainFrame* pAppFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
pAppFrame->Invalidate(false);

А вот здесь нужно дождаться окончания pAppFrame->Invalidate(false), т.е. OnDraw в SDI.

По идее должно быть что-то типа:

state=1;
while(state); //state меняется в OnDraw на 0, после окончания обработки.
....

Но так не работает....
Re[3]: sdi и invalidate
От: mitq Россия  
Дата: 03.05.02 05:14
Оценка:
Можно сделать примерно так:
class CMainFrame
{
// ...
private:
   HANDLE m_hDrawEvent;
};

CMainFrame::CMainFrame()
{
   m_hEventDrawed = ::CreateEvent( 0, FALSE, FALSE, _T("Моё событие для рисования") );
}

void CMainFrame::OnПоказатьДиалог()
{
   CMyDialog dlg(this);
   dlg.m_hEventDrawed = m_hEventDrawed;
   dlg.DoModal();
}

class CMyDialog
{
// ...
public:
   HANDLE m_hEventDrawed;
};

void CMyDialog::Где-тоТам()
{
   DoImage();
   CMainFrame* pAppFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
   pAppFrame->Invalidate(false);

   WaitForSingleObject( m_hEventDrawed, INFINITE );
}

И никакого дремучего леса.

Удачи.
Дмитрий.
Re[4]: sdi и invalidate
От: mitq Россия  
Дата: 03.05.02 05:34
Оценка:
Совсем забыл! В дополнение к предыдущему:
void CMyView::OnDraw(CDC* pDC)
{
// ...
   // После того, как всё отрисовал:
   SetEvent( ((CMainFrame*)AfxGetApp()->m_pMainWnd)->m_hEventDrawed );
}


Удачи.
Дмитрий.
Re[3]: sdi и invalidate
От: Bell Россия  
Дата: 03.05.02 05:38
Оценка:
Здравствуйте Аноним, Вы писали:


А>Вот такой код стоит в диалоге:


А>DoImage();

А>
А>CMainFrame* pAppFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
pAppFrame->>Invalidate(false);

А>А вот здесь нужно дождаться окончания pAppFrame->Invalidate(false), т.е. OnDraw в SDI.


А>По идее должно быть что-то типа:


А>state=1;

А>while(state); //state меняется в OnDraw на 0, после окончания обработки.
А>....

А>Но так не работает....

А>

Я бы попробовал так:
в класс CMainFrame добавляется мембер CCriticalSection m_critSection;

В диалоге:

DoImage();
    
CMainFrame* pAppFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
CSingleLock lock(&pAppFrame->m_critSection);
lock.Lock();//Ожидаем, пока не завершится OnDraw. 
//В функции Lock() также можно задать интервал ожидания, и если он превышен, 
//выйти из функции
pAppFrame->>Invalidate(false);
lock.Unlock();


В OnDraw:

CMainFrame* pAppFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
CSingleLock lock(&pAppFrame->m_critSection);
lock.Lock();
//Рисование...
lock.Unlock();


Почитай в MSDN про два этих класса (CCriticalSection и CSingleLock) — там нормально все это описано.
Любите книгу — источник знаний (с) М.Горький
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.