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

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

  1. BFS

    BFS Гость

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

    Pasha Гость

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

    BFS Гость

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

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

    Dimmuborgir Гость

    Репутация:
    0
    если хочешь чтоб не моргало, рисуй Битмапками.
    Код:
    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 Гость

    Репутация:
    0
    эх ты, некромант!
     
Загрузка...

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