본문 바로가기

열혈강의

MFC 더블 버퍼링 [ Double Buffering ] 책의 608 페이지 에 있는 내용으로 프로젝트명은 RedrawDemo로 작성한다. 윈도우의 깜박임을 제거하는 최선의 방법은 더블 버퍼링 이다. 더블 버퍼링은 화면 DC에 직접 출력하는 것이 아닌 화면 DC와 호환이 되는 메모리 DC를 만들어서 모든 그리기 작업이 끝난 값을 집어넣어둔 후 메모리 DC의 내용을 화면 DC로 복사하는 기법이다. 이렇게 하면 화면의 크기를 변경하더라도 흰색 깜박임이 발생하지 않게 된다.[흰색으로 초기화 시키는게 아닌 메모리 DC의 내용을 가져오기만 하기 때문에.] 전에 쓴 OnPaint()함수의 코드에서 CPaintDC dc(this); 를 CBufferDC dc(this); 로 변경하고 CBufferDC 클래스를 프로젝트에 인클루드 하면 간단히 더블 버퍼링을 구현할 수 있다... 더보기
Visual C++ 2008 MFC Chapter 18 깜박임 방지 이번 챕터에 있는 더블버퍼링 을 공부하기 위한 챕터 18 공부. 응용 프로그램에서 화면의 크기를 조정할 때 대부분 화면 상 깜박임이 발생한다. 메인 프레임 윈도우 일부가 그러는 것은 어쩔 수 없다고 하더라도. 클라이언트 뷰 윈도우가 통째로 깜빡이면 그리 좋은 모습은 아니라 개선을 해야하는 필수 대상이라고 한다. 뭐 본적은 없지만 . WM_ERASEBKGND 메시지에 대하여 알아야 한다. --------- 화면 그리기의 구조 ------- 이 메시지는. WM_PAINT 메시지와 더불어 윈도우를 다시 그릴 때 발생하는 메시지 중 하나이다. 윈도우가 클라이언트 영역과 비 클라이언트 영역으로 구별되어 있고, 각각을 그리도록 하는 메시지 는 WM_PAINT 와 WM_ERASEBKGND 이다. 그러나 클라이언트 영.. 더보기
Visual C++ 2008 MFC Chapter 10 메뉴~ - 4 지금까지 사용한 메뉴 코드는 내부적으로 TrackPopupMenu()함수를 가지고 만들어진 것이라고 한다. 이 함수의 원형은 다음과 같다. BOOL TrackPopupMenu(UINT nFlags, //메뉴 윈도우의 위치, 에니메이션효과 등 동작특성을 결정 int x, int y, //출력할 좌표 **반드시 스크린 기준 CWnd* pWnd, // WM_COMMAND 메시지를 전송할 윈도우 객체의 주소. LPCRECT lpRect = NULL //이값은 현재 사용하지않음. ); 다음으로는 속성값들을 정리한 내용이다 TPM_CENTERALIGN 지정한 위치의 중앙에 오게한다. TPM_LEFTALIGN 지정한 위치의 좌측에 정렬 TPM_RIGHTALIGN 지정한 위치의 오른쪽에 정렬 TPM_BOTTOMALIG.. 더보기
Visual C++ 2008 MFC Chapter 10 메뉴~ -3 다른 메뉴를 만들듯이 일시 정지 메뉴를 만들고 일시정지 메뉴를 만들기 전에 구분선을 하나 넣어본다.[생성시에 메뉴에 다 한글로 써있으니 설명이 필요치 않다.] m_bRunning 을 넣었듯이 m_bPause 도 넣어준다. 역시 마찬가지로 시작 종료 메뉴를 만든것처럼 void CMainFrame::OnMenuPause()와 void CMainFrame::OnUpdateMenuPause(CCmdUI *pCmdUI) 를 추가하고 다음과 같이 입력한다. ========================================================== void CMainFrame::OnMenuPause() { if(m_bPause)AfxMessageBox(_T("다시 시작합니다.")); elseAfxMes.. 더보기
Visual C++ 2008 MFC Chapter 10 메뉴~ -2 아까의 코드에서 헤더파일 public 부분에 BOOL m_bRunning; 으로 플래그를 추가해주고 cpp에 가서 =================================================== CMainFrame::CMainFrame() { // TODO: 여기에 멤버 초기화 코드를 추가합니다. m_bRunning = FALSE; //초기화 } =================================================== 처럼 추가수정을 하여 초기화를 해준뒤 =================================================== void CMainFrame::OnMenuStart() { m_bRunning = TRUE;//실행 중이라는 의미로 플래그를 T.. 더보기