Мигание окна при постоянной перерисовке графики
От: flower Украина  
Дата: 05.05.03 09:43
Оценка:
При постоянной перерисовке большого объема графики на диалоговом окне по таймеру эта самая графика начинает мигать и дергаться. Как от этого избавиться?
Re: Мигание окна при постоянной перерисовке графики
От: peterbes Россия  
Дата: 05.05.03 09:50
Оценка:
Здравствуйте, flower, Вы писали:

F>При постоянной перерисовке большого объема графики на диалоговом окне по таймеру эта самая графика начинает мигать и дергаться. Как от этого избавиться?


Переопредели стирание и заполнение фона

MESSAGE_HANDLER(WM_ERASEBKGND, OnErBkgr)


LRESULT AxGC::OnErBkgr(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
    HDC dc = GetDC();
    if(dc)
    {
        SIZE rcSize;
        HBRUSH blackBrush, oldBrush = NULL;
        COLORREF colBack;
        OleTranslateColor(m_clrBackColor, m_hPalette, &colBack);
        blackBrush = CreateSolidBrush(colBack);
        oldBrush = (HBRUSH)::SelectObject(dc,blackBrush);
        rcSize.cx = LOWORD(lParam);
        rcSize.cy = HIWORD(lParam);
        
        ::PatBlt(dc,0,0,rcSize.cx,rcSize.cy,PATCOPY);
        if(oldBrush)
        {
            ::SelectObject(dc,(HGDIOBJ)oldBrush);
            ::DeleteObject(blackBrush);
        }
        ReleaseDC(dc);    
    }else return E_FAIL;
    
    return S_OK;
}
Re: Мигание окна при постоянной перерисовке графики
От: Aristocrat Россия  
Дата: 05.05.03 10:25
Оценка:
Здравствуйте, flower, Вы писали:

F>При постоянной перерисовке большого объема графики на диалоговом окне по таймеру эта самая графика начинает мигать и дергаться. Как от этого избавиться?


Возможно это тебе поможет, и несомненно будет полезно:)
http://www.rsdn.ru/Forum/?mid=51770
Автор: Trantor
Дата: 06.05.02
Если отладка — процесс исправления ошибок,
то программирование — процесс их внесения.
Re: Мигание окна при постоянной перерисовке графики
От: Serguei666 Беларусь  
Дата: 05.05.03 13:12
Оценка:
Здравствуйте, flower, Вы писали:

F>При постоянной перерисовке большого объема графики на диалоговом окне по таймеру эта самая графика начинает мигать и дергаться. Как от этого избавиться?


Рисовать в буфер, а потом буфер одной функцией выплевывать на экран. Если нужен ипример и вы не сможете его найти — пишите, я код прямо тут помещу
Хотите сказать 'спасибо'? Тогда поставьте оценку
Re[2]: Мигание окна при постоянной перерисовке графики
От: flower Украина  
Дата: 06.05.03 08:28
Оценка:
Здравствуйте, Serguei666, Вы писали:

S>Здравствуйте, flower, Вы писали:


F>При постоянной перерисовке большого объема графики на диалоговом окне по таймеру эта самая графика начинает мигать и дергаться. Как от этого избавиться?


S>Рисовать в буфер, а потом буфер одной функцией выплевывать на экран. Если нужен ипример и вы не сможете его найти — пишите, я код прямо тут помещу


Был бы очень благодарен за пример.
Re[3]: Мигание окна при постоянной перерисовке графики
От: Serguei666 Беларусь  
Дата: 06.05.03 16:13
Оценка: 6 (3)
Здравствуйте, flower, Вы писали:

F>Здравствуйте, Serguei666, Вы писали:


S>Здравствуйте, flower, Вы писали:


F>При постоянной перерисовке большого объема графики на диалоговом окне по таймеру эта самая графика начинает мигать и дергаться. Как от этого избавиться?


S>Рисовать в буфер, а потом буфер одной функцией выплевывать на экран. Если нужен ипример и вы не сможете его найти — пишите, я код прямо тут помещу


F>Был бы очень благодарен за пример.


Тогда такой вот классик. Не мой. Взят с CodeGuru, немного изменен, что делает его чуть менее эффективным. В оригинальном классе не было второго параметра конструктора (CRect&) и прямоугольник брался прямо из DC. Но того кода у меня под рукой нет.

Использование:
void CMyView::OnDraw(CDC* pDC_)
{
CRect Rect;
GetClientRect(Rect);
if(Rect.IsRectEmpty() || Rect.IsRectNull())
return;

CMemDC pDC(pDC_, Rect);

pDC->FillSolidRect(Rect, RGB(255,255,220)); // вы должны сами заполнять фон, иначе он будет черным

... рисуете что хотите
}

Также надо перекрыть OnEraseBkgnd вашего View и в нем ничего не делать.
BOOL CMyView::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
//return CView::OnEraseBkgnd(pDC);
}


// H файл
#ifndef _MemDC_h_
#define _MemDC_h_

class CMemDC : public CDC
{
public:
// constructor sets up the memory DC
CMemDC(CDC* pDC, CRect &Rect);
// Destructor copies the contents of the mem DC to the original DC
~CMemDC();
// Allow usage as a pointer
CMemDC* operator->() { return this; }
// Allow usage as a pointer
operator CMemDC*() { return this; }

private:
CBitmap m_bitmap; // Offscreen bitmap
CBitmap* m_pOldBitmap; // bitmap originally found in CMemDC
CDC* m_pDC; // Saves CDC passed in constructor
CRect m_rect; // Rectangle of drawing area.
BOOL m_bMemDC; // TRUE if CDC really is a Memory DC.
};

#endif


// CPP файл
#include "StdAfx.h"
#include "MemDC.h"

CMemDC::CMemDC(CDC* pDC, CRect &Rect) : CDC(), m_rect(Rect)
{
ASSERT(pDC != NULL);

ASSERT(!m_rect.IsRectEmpty() && !m_rect.IsRectNull());
m_pDC = pDC;
m_pOldBitmap = NULL;
m_bMemDC = !pDC->IsPrinting();

if (m_bMemDC) // Create a Memory DC
{
CreateCompatibleDC(pDC);
m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());
m_pOldBitmap = SelectObject(&m_bitmap);
SetWindowOrg(m_rect.left, m_rect.top);
}
else // Make a copy of the relevent parts of the current DC for printing
{
m_bPrinting = pDC->m_bPrinting;
m_hDC = pDC->m_hDC;
m_hAttribDC = pDC->m_hAttribDC;
}
}

CMemDC::~CMemDC()
{
if (m_bMemDC)
{
// Copy the offscreen bitmap onto the screen.
m_pDC->BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),
this, m_rect.left, m_rect.top, SRCCOPY);

//Swap back the original bitmap.
SelectObject(m_pOldBitmap);
}
else
{
// All we need to do is replace the DC with an illegal value,
// this keeps us from accidently deleting the handles associated with
// the CDC that was passed to the constructor.
m_hDC = m_hAttribDC = NULL;
}
}
Хотите сказать 'спасибо'? Тогда поставьте оценку
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.