ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 다이얼로그에서의 더블 버퍼링
    MFC 2010. 10. 15. 15:34


    void CTestDlg::OnPaint()
    {
     SolidBrush bgBrush(Color(255,255,255)); // 흰색으로 초기화

     CPaintDC dc(this);

     CBrush brhBack;
     brhBack.CreateSolidBrush(RGB(255,255,255)); // 배경색

     CRect rlClientRect;
     GetClientRect(rlClientRect);

     Rect rclClient(rlClientRect.left,rlClientRect.top,rlClientRect.Width(),rlClientRect.Height());

     CBitmap bmp;
     CBitmap* pOldBmp;
     CDC memDC;

     bmp.CreateCompatibleBitmap(&dc, rlClientRect.right, rlClientRect.bottom);
     memDC.CreateCompatibleDC(&dc);
     pOldBmp = (CBitmap*)memDC.SelectObject(&bmp);

     Graphics mem(memDC.m_hDC);
     mem.SetSmoothingMode(SmoothingModeHighQuality);
     mem.SetTextRenderingHint(TextRenderingHintClearTypeGridFit);
     mem.FillRectangle(&bgBrush,rclClient); // 배경을 흰색으로 지운다

    //  여기에서 그리고 싶은 내용을 그려준다

     dc.BitBlt(0,0, rlClientRect.right, rlClientRect.bottom,&memDC, 0, 0, SRCCOPY);

     memDC.SelectObject(pOldBmp);
     memDC.DeleteDC();
    }

    참고로 다이얼로그 기반에서는 컨트롤이 안깜빡거리도록 하기 위해서 다이얼로그 -> Properties 에서
    Clip Children 속성을 true로 해 줘야 한다.

    //2012년 6월 20일 아래 내용 추가

    1) CWinApp 헤더에 ULONG_PTR gdiplusToken; 추가

    2) CWinApp c++의 InitInstance() 함수에 아래 내용 추가

    여기서 주의할 점은 반드시 다이얼로그 DoModal() 앞에 넣어줘야함

    GdiplusStartupInput gdiplusStartupInput;

    if(::GdiplusStartup(&gdiplusToken,&gdiplusStartupInput,NULL) != Ok)

    {

    AfxMessageBox(_T("ERROR: Failed to initialize GDI+ library!"));

    return FALSE;

    }


    3) 다이얼로그 클래스에서 아래 내용 추가

    BOOL CTestDlg::OnEraseBkgnd(CDC* pDC)

    {

    return true;

    //return CDialog::OnEraseBkgnd(pDC);

    }


Designed by Tistory.