Убрать мерцание при изменении размеров окна

Тема в разделе "MS Visual C++", создана пользователем BFS, 29 окт 2007.

  1. BFS

    BFS Гость

    Когда я изменяю размер окна(например перетаскивая правый нижний край моего окна), то GetClipBox всё-равно считает, что обновлять нужно ВСЁ окно! вот с этим я хочу бороться, а так из-за наслоения фигур мерцания видны. Слышал, что такое исправляется переопределением OnEraseBkgnd, но каким образом..? Там явно недостаточно лишь того, что она будет возвращать значение true. Подскажите, как всё сделать, чтобы было красиво :)
     
  2. Pasha

    Pasha Гость

    Для: BFS
    EDIT: почему не достаточно? :)
     
  3. BFS

    BFS Гость

    Pasha, а каким образом следует её определить, чтобы всё нормально работало?
    у меня функция
    Код (Text):
    BOOL CLastView::OnEraseBkgnd(CDC *pDC)
    {
    return (false);
    }
    описана в C*View, в сообщения я дописал ON_WM_ERASEBKGND(). соотвествтвенно в *.h файле у меня
    Код (Text):
    afx_msg BOOL OnEraseBkgnd(
    CDC* pDC
    );
    OnEraseBkgnd принимает это сообщения, но вне зависимости, от значения, которое она возвращает(true/false), я наблюдаю одну и ту же картину: моё окно не обновляется вообще :) То есть вот я запускаю на выполнение программу(из вижлы), а в окне представление - мой код :)

    Подскажите пожалуйста, как правильно всё сделать!
     
  4. Dimmuborgir

    Dimmuborgir Гость

    если хочешь чтоб не моргало, рисуй Битмапками.
    Код (Text):
    class CMemDC : public CDC {
    private:     
    CBitmap m_bitmap;      
    CBitmap*  m_oldBitmap;   
    CDC*      m_pDC;         
    CRect    m_rect;         
    BOOL      m_bMemDC;  
    public:

    CMemDC(CDC* pDC, const CRect* pRect = NULL);

    ~CMemDC();

    // Allow usage as a pointer
    CMemDC* operator->();

    // Allow usage as a pointer
    operator CMemDC*();

    };


    CMemDC::CMemDC(CDC* pDC, const CRect* pRect) : CDC()
    {
    ASSERT(pDC != NULL);

    // Some initialization
    m_pDC = pDC;
    m_oldBitmap = NULL;

    m_bMemDC = !pDC->IsPrinting();
    // Get the rectangle to draw
    if (pRect == NULL)
    {
    pDC->GetClipBox(&m_rect);
    }
    else
    {
    m_rect = *pRect;
    }

    if (m_bMemDC)
    {
    // Create a Memory DC
    CreateCompatibleDC(pDC);
    pDC->LPtoDP(&m_rect);

    m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(),m_rect.Height());
    m_oldBitmap = SelectObject(&m_bitmap);

    SetMapMode(pDC->GetMapMode());

    SetWindowExt(pDC->GetWindowExt());
    SetViewportExt(pDC->GetViewportExt());

    pDC->DPtoLP(&m_rect);
    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;

    }
    // Fill background
    FillSolidRect(m_rect, pDC->GetBkColor());
    }


    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_oldBitmap);     
    }
    else
    {
    // All we need to do is replace the DC with an illegal
    // value, this keeps us from accidentally deleting the
    // handles associated with the CDC that was passed to
    // the constructor.          
    m_hDC = m_hAttribDC = NULL;
    }    
    }

    CMemDC*
    CMemDC::operator->()
    {
    return this;
    }

    CMemDC::operator CMemDC*()
    {
    return this;
    }
    все.
    дальше вместо своего контекста используешь контекст CMemDC следующим образом
    CDC _dc(this);
    CMemDC dc(&dc);
    //рисуй
     
  5. gamecreator

    gamecreator Гость

    эх ты, некромант!
     
Загрузка...

Поделиться этой страницей