VisualC++(MFC 프로그램)에서 View를 생성하고 OnDraw함수에서 그림을 그리는 구조의 프로그램을 작성할 경우 일반적인 방법을 사용하면 윈도우 크기 변경등을 할 때 화면이 깜박이고 속도 또한 느려 보기에 좋지 않고, 또한 일정 주기로 화면을 갱신해야 하는 경우라면 그 갱신 주기 마다 전체 화면이 깜박인다는 것을 알 수 있습니다. 이런 문제를 격어 본 사람만 이 내용을 보기 바랍니다. 그렇지 않은 사람이 보았을 경우 혼란만 가중될 수 있습니다. 참고로 책에서 이런 내용은 찾을 수 없어 구현한 내용입니다.
VisualC++이 업그레이드 되면 이 문제는 View생성 옵션으로 처리가 가능하도록 해결되리라 생각되나 불행히도 현재는 그런 옵션이 없는 것으로 알고 있습니다. 이 문제를 해결하려면...
1. 화면 크기에 해당하는 Bitmap그림을 생성합니다.
2. OnDraw함수에서 생성된 Bitmap핸들(디바이스 컨택스트 핸들)을 얻습니다.
3. pDC대신 생성된 Bitmap 핸들을 사용하여 원하는 그림을 그립니다(화면대신 Bitmap에다 그림을 그립니다).
4. Bitmap 핸들을 Release해 줍니다.
5. Bitmap의 내용을 화면상에 출력합니다.
6. WM_ERASEBKGND 메시지에서 생성된 함수에서 아무일도 하지 않고 return FALSE해 줍니다.
이 전체 과정을 실행하기 위해서는 CBitmap에 대하여 어느 정도 지식이 있어야 합니다. 따라서 CBackImage라는 Class를 작성하여 CBitmap에 대하여 제대로 알지 못해도 사용 가능하게 했습니다. CBackImage에서 사용하는 함수를 보면 다음과 같습니다.
void Create(CDC *pDC, int nWidth, int nHeight); //Bitmap 생성, 크기가 바뀔때 삭제후 생성함
CDC* GetBitmapDC(CDC* pDC); //Bitmap 핸들을 얻는다.
void ReleaseBitmapDC(); //Bitmap 핸들을 Release합니다.
void Draw(CDC *pDC); //Bitmap의 그림을 화면상에 그린다.
데모 프로그램
void CViewFlickerView::OnDraw(CDC* pDC) { CViewFlickerDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here //1. 화면 크기에 해당하는 Bitmap그림을 생성합니다. //Create함수는 내부적으로 그림 크기가 변경되지 않으면 새로 생성되지 않도록 구성되어 있습니다. CRect rectClient; GetClientRect(&rectClient); m_BackImage.Create(pDC, rectClient.right, rectClient.bottom); //2. OnDraw함수에서 생성된 Bitmap핸들(디바이스 컨택스트 핸들)을 얻는다. CDC *pMemDC = m_BackImage.GetBitmapDC(pDC); pMemDC->BitBlt(0, 0, 1024, 768, NULL, 0, 0, WHITENESS); //배경을 하얀색으로 칠합니다. //3. pDC대신 생성된 Bitmap 핸들을 사용하여 원하는 그림을 그립니다(화면대신 Bitmap에다 그림을 그립니다). pMemDC->Rectangle(100, 100, 200, 200); pMemDC->TextOut(100, 50, _T("테스트용 프로그램입니다")); //4. Bitmap 핸들을 Release해 줍니다. m_BackImage.ReleaseBitmapDC(); //5. Bitmap의 내용을 화면상에 출력합니다. m_BackImage.Draw(pDC); } //6. WM_ERASEBKGND 메시지에서 생성된 함수에서 아무일도 하지 않고 return FALSE해 준다. BOOL CViewFlickerView::OnEraseBkgnd(CDC* pDC) { return FALSE; // return CView::OnEraseBkgnd(pDC); } |
CBackImage 클래스 다운로드
예제 프로그램 다운로드
'Visual C++(MFC)' 카테고리의 다른 글
MFC10. 메모리 (0) | 2022.03.07 |
---|---|
MFC09. 인쇄하기 (0) | 2022.03.07 |
MFC07. Doc-View 구조 (0) | 2022.03.07 |
MFC06. 대화상자 (0) | 2022.03.07 |
MFC05. RESOURCE (0) | 2022.03.07 |