2016-12-19 6 views
0

私はそれが正常に移動がCScrollViewがCScrollViewの移動中にちらつきを避けるには?それが動いている間

を移動させるためにしようとしていたが、私は問題を発見...

CScrollViewがランダムに点滅しました。以下は

は私のプロジェクトの全体のコードです:

#include <afxwin.h> 
#include <afxext.h> 
#include "resource.h" 

class MyView : public CScrollView 
{ 
public: 
    void OnDraw(CDC *aDC){ 
     CRect rc; 
     GetClientRect(&rc); 

     aDC->FillSolidRect(&rc, RGB(0,0,255)); 
    } 

    BOOL PreCreateWindow(CREATESTRUCT& cs) 
    { 
     cs.style &= ~WS_BORDER; 
     return CScrollView::PreCreateWindow(cs); 
    } 

    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct) 
    { 
     if(CScrollView::OnCreate(lpCreateStruct) == -1) 
      return -1; 
     CSize DCSize(200, 800); 

     SetScrollSizes(MM_TEXT, DCSize); 
     return 0; 
    } 


    DECLARE_DYNCREATE(MyView) 
    DECLARE_MESSAGE_MAP() 
}; 

IMPLEMENT_DYNCREATE(MyView, CScrollView) 

BEGIN_MESSAGE_MAP(MyView, CScrollView) 
    ON_WM_CREATE() 
END_MESSAGE_MAP() 

class CMainDlg : public CDialog 
{ 
public: 
    CMainDlg(CWnd* pParent = NULL); 

    enum { IDD = IDD_MAIN_DIALOG }; 

    CWnd* pFrameWnd; 
    CCreateContext context; 
    MyView* pView; 
    int time; 

    virtual BOOL OnInitDialog(); 
    afx_msg void OnTimer(UINT_PTR timer); 

    void OnPaint(){ 
     CPaintDC dc(this); 
     CRect rc; 
     GetClientRect(&rc); 
     dc.FillSolidRect(&rc,RGB(255,187,187)); 
    } 


    DECLARE_MESSAGE_MAP() 

}; 

BEGIN_MESSAGE_MAP(CMainDlg, CDialog) 
    ON_WM_TIMER() 
    ON_WM_PAINT() 
END_MESSAGE_MAP() 


CMainDlg::CMainDlg(CWnd* pParent /*=NULL*/) 
    : CDialog(CMainDlg::IDD, pParent) 
{ 
} 


BOOL CMainDlg::OnInitDialog() 
{ 
    CDialog::OnInitDialog(); 

    pFrameWnd = this; 
    context.m_pCurrentDoc = NULL; 
    context.m_pNewViewClass = RUNTIME_CLASS(MyView); 

    pView = (MyView*)((CFrameWnd*)pFrameWnd)->CreateView(&context); 
    pView->ShowWindow(SW_SHOW); 

    time = 0; 
    SetTimer(1, 1, 0); 
    return TRUE; 
} 

void CMainDlg::OnTimer(UINT_PTR timer) 
{ 
    if(timer == 1){ 
     if(time > 300){ 
      KillTimer(1); 
      return; 
     } 
     pView->MoveWindow(CRect(time,10,time+300,200),FALSE); 
    } 
    time+=1; 
    Invalidate(FALSE); 
} 
class MyApp : public CWinApp 
{ 
public: 
    BOOL InitInstance() 
    { 
     CWinApp::InitInstance(); 

     CMainDlg Frame; 

     Frame.DoModal(); 

     return true; 
    } 
} a_app; 

それが動いている間CScrollViewが点滅なぜ私にはわかりません。誰でもこの問題を解決できますか?

答えて

1

ウィンドウ全体を無効にしているため、ちらついています。これにより、WM_ERASEが発生し、WM_ERASEがウィンドウを空白にし、WM_PAINTが全体を再描画します。 をbRepaint(最終)パラメータとしてMoveWindowに渡すので、ウィンドウを移動した後に必要なウィンドウ領域が再描画されません。

通常、ウィンドウが移動するとコンテンツが移動し、再描画が必要な部分はオフスクリーンまたは別のウィンドウの下にあるビットだけです。最後のパラメータとしてTRUEを渡すと、ウィンドウのこれらの領域のみが再描画され、ちらつきが回避されます。

+0

[CWnd :: Invalidate](https://msdn.microsoft.com/en-us/library/ax04k970.aspx)の呼び出しは、* bErase *引数として 'FALSE'を渡します。 – IInspectable

関連する問題