본문 바로가기

비쥬얼스튜디오2008

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 이다. 그러나 클라이언트 영.. 더보기
그림판 만들기 프로젝트. 1. 외형구도. 메뉴와 도구 모음 간의 연동. 2. 버튼 클릭시 다른 메뉴 버튼 비활성화 처리를 IF문으로 해보려다가 실패. 3. 타 프로그램의 소스를 보며 IF문이 아닌 int값과 switch 문 등을 이용하는것을 발견. 목표를 그대로 따라하여 작성하는 식으로 공부할 예정. 완성화면은 저러함. 보다시피 지금 목표로 삼는 예제도 기본적 MFC 프로그램 에다가 덧붙여서 만든것을 알 수 있음. [도움말 이후에 메뉴를 넣었다던가. 하는 것들.] 목표 파일 업로드.[웹에거 검색한 것. 비영리 목적으로 퍼왔으니 저작권 문제는 없다고 봄..] 그나저나 매번 느끼는거지만 무료로 배포하려고 블로그에 올리는 사람들이 있는 반면 만얼마~2만 얼마까지 돈받고 파는 소스도 있음. 개인적인 생각으론 전혀 돈내고 살 필요가 없다.. 더보기
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.. 더보기