반응형
발췌 : 열혈강의 Visual C++ 2008 MFC 윈도우 프로그래밍 p608
윈도우의 깜빡임을 제거하는 최선의 방법은 더블 버퍼링(Double Buffering)입니다. DC에 직접 출력하는 것이 아니라, 화면 DC와 호환되는 메모리 DC(버퍼DC)를 만들어서 모든 그리기 작업을 수행한 후 , 메모리 DC의 내용을 화면 DC로 복사하는 기법입니다.
아래 코드는 트리플버퍼링을 사용하였고, 배경의 색을 설정하고 있다.
memSuiteDC는 실제 화면인 DC에 그려질 메모리DC이다.
memDC는 memSuiteDC에 그려질 메모리DC이다.
CBufferingDlg::CBufferingDlg()
{
m_pBitmap = new CBitmap();
m_pBitmap->LoadBitmap(IDB_BITMAP1); //리소스ID로 이미지 로드
m_pBitmap->SetBitmapDimension(56, 88); //이미지크기 설정.
}
void CBufferingDlg::OnPaint()
{
CPaintDC dc(this); //BeginPaint(), 실제 출력화면
CDC memDC, memSuiteDC; //메모리DC 화면
CBitmap *pOldBitmap, BackgroundBitmap;
CRect rect;
//Suite 메모리 DC(Device Context) 설정
GetClientRect(&rect);
memSuiteDC.CreateCompatibleDC(&dc);
BackgroundBitmap.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height());
pOldBitmap = memSuiteDC.SelectObject(&BackgroundBitmap);
memSuiteDC.FillSolidRect(0, 0, rect.Width(), rect.Height(), RGB(0,0,0)); //배경색 설정
윈도우의 깜빡임을 제거하는 최선의 방법은 더블 버퍼링(Double Buffering)입니다. DC에 직접 출력하는 것이 아니라, 화면 DC와 호환되는 메모리 DC(버퍼DC)를 만들어서 모든 그리기 작업을 수행한 후 , 메모리 DC의 내용을 화면 DC로 복사하는 기법입니다.
아래 코드는 트리플버퍼링을 사용하였고, 배경의 색을 설정하고 있다.
memSuiteDC는 실제 화면인 DC에 그려질 메모리DC이다.
memDC는 memSuiteDC에 그려질 메모리DC이다.
CBufferingDlg::CBufferingDlg()
{
m_pBitmap = new CBitmap();
m_pBitmap->LoadBitmap(IDB_BITMAP1); //리소스ID로 이미지 로드
m_pBitmap->SetBitmapDimension(56, 88); //이미지크기 설정.
}
void CBufferingDlg::OnPaint()
{
CPaintDC dc(this); //BeginPaint(), 실제 출력화면
CDC memDC, memSuiteDC; //메모리DC 화면
CBitmap *pOldBitmap, BackgroundBitmap;
CRect rect;
//Suite 메모리 DC(Device Context) 설정
GetClientRect(&rect);
memSuiteDC.CreateCompatibleDC(&dc);
BackgroundBitmap.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height());
pOldBitmap = memSuiteDC.SelectObject(&BackgroundBitmap);
memSuiteDC.FillSolidRect(0, 0, rect.Width(), rect.Height(), RGB(0,0,0)); //배경색 설정
//단일 메모리 DC 설정
memDC.CreateCompatibleDC(&dc);
//단일메모리DC를 전체메모리DC에 출력
CImageInfo *pImageInfo;
CSize bitmapSize;
bitmapSize = m_pBitmap->GetBitmapDimension();
memDC.SelectObject(pBitmap);
memSuiteDC.BitBlt(0, 0, bitmapSize.cx, bitmapSize.cy, &memDC, 0, 0, SRCCOPY);
//전체메모리DC를 실제화면에 출력
dc.BitBlt(0, 0, rect.Width(), rect.Height(), &memSuiteDC, 0, 0, SRCCOPY);
//DC제거
memSuiteDC.SelectObject(&pOldBitmap);
memDC.DeleteDC();
memSuiteDC.DeleteDC();
}
반응형
'프로그래밍 > MFC' 카테고리의 다른 글
[MFC] Static Text Control (문자&배경색) (2) | 2011.01.04 |
---|---|
MFC 그림으로 버튼, 스크롤, 리스트 만들기 - 더블버퍼링 & UML 문서화 기법 (0) | 2010.11.26 |
쓰레드 (0) | 2010.10.27 |
쓰레드에서 Main핸들 얻기 (0) | 2010.10.27 |