화면에 그림을 그리는 것이 Onpaint, Ondraw등 기본적인 함수가 많다.(나는 이것을 잘 구분 못한다. ㅠㅠ)
아무튼 이러한 곳에서 불필요한 하지만 들어가야할(필요악?ㅎ) 코드가 많아지고 새로 그릴것이 많아진다면
화면은 깜박 거리기 시작한다. 새로 그릴때마다 Windows 친절히 Invalidate를 호출해주어서 많이도
새로 그린다. 이럴때 더블 버퍼링을 사용하여 이러한 깜박거림을 줄일수 있다.!!
기본 개념은 그림을 그리는 곳과 출력하는 곳을 나누는 것이다.
그림을 그리는 곳에서 그리만 그리고 출력하는 곳에다 복사한다.
그림은 딴대다 그리고 Onpaint나 OnDraw부분에는 그 그려진 것을 복사해 오는 것이다.
화면을 지우고 그리는 두작업에서 화면이 그냥 바뀌는 것으로 눈을 속이는 것이다!
이거 겜프에서 들었던 Surface를 바꿔주는 것과 비슷하다고 느껴진다.
원래 코드가 이러하게 복잡하다고 생각하자.
void CStatic_Dial::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: 여기에 메시지 처리기 코드를 추가합니다. //여기 징하게 많은 코드들.. //........................ //아~~ 정말 많다. ㅠㅠ // 그리기 메시지에 대해서는 CStatic::OnPaint()을(를) 호출하지 마십시오. }
저 많은 코드를 새로 그린다면… 아무리 컴퓨터라 할지라고 컴퓨터가 아무리 빨리 새로 그린다고
하더라고 이제 보이지 않을까? 사람 눈에 보인다면… 깜박 거림이 얼마나 심하겠는가?
이런 프로그램을 만들었다고 누구한테 내놓을것인가. 그리나 바꾸자!!!
void CStatic_Dial::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: 여기에 메시지 처리기 코드를 추가합니다. CDC mDC; //정확하진 않지만 더블 버퍼링은 CDC가 필요한거 같다. CBitmap m_Bitmap; //그림을 그릴 곳의 비트맵!! CRect m_rtCtrlSize; //비트맵 설정을 위한 Rect 선언 GetClientRect(&m_rtCtrlSize); //현재 Rect의 크기를 가져온다. mDC.CreateCompatibleDC(&dc); //if (mB_itmap==NULL) //뭐 리소스가 부족해 질수도 있다고해서 했는데 Ambigous뜬다.ㅠ m_Bitmap.CreateCompatibleBitmap(&dc, m_rtCtrlSize.Width(), m_rtCtrlSize.Height()); mDC.SelectObject(&m_Bitmap); //비트맵을 선택한다. 여기다 그리는 거다!! mDC.PatBlt(0,0,m_rtCtrlSize.Width(), m_rtCtrlSize.Height(), WHITENESS); M_Draw(&mDC); //Switch!!! dc.BitBlt(0, 0, m_rtCtrlSize.Width(), m_rtCtrlSize.Height(), &mDC, 0, 0, SRCCOPY); // 그리기 메시지에 대해서는 CStatic::OnPaint()을(를) 호출하지 마십시오. }
이렇게 하고 실제 코드는 저 M_Draw로 다 짱박았다!! 징하게 많은 코드가. 나는 어차피 똑같이 코드가 돌아가서 변화가 없을줄 알았지만 정말로 줄었다. 그리는 작업에 CPU소모가 크고, 지우는 작업까지의 축소가 많이 적용 되나 보다.