본문 바로가기

Library/Windows Programming

PCH 수동 설정하기 MFC는 적당한 솔루션을 제공하는 괜찮은 라이브러리지만, Doc / View 구조는 너무 개발자를 프레임워크로 몰아넣고 개발을 강요하는 단점이 있다. 단순히, MFC 클래스를 이용하고, Doc / View 구조를 사용하지 않는 방법도 있지만, 이럴 경우 라이브러리 링크부터 리소스 추가까지 IDE 환경을 도움을 거의 받을 수 없기 때문에 상당한 고통이 뒤따른다. Precompiled Header를 사용하는 것도 수동으로 설정하기 까다로운 부분 중 하나인데, AppWizard를 사용하여 프로젝트를 생성했다면 stdafx.h에 프로젝트에서 사용할 설정을 간단히 추가하는 것만으로 모든 것이 끝나지만, Empty Project부터 시작했다면 Precompiled Header를 사용하기 위해 좀 더 복잡한 일을 해.. 더보기
Window의 화면 깜빡임을 줄이는 방법 WM_PAINT 메세지를 처리할 때, API를 직접 사용한다면 BeginPaint()를 사용하여 디바이스 컨텍스트(DC)를 얻어내겠고, MFC를 사용한다면 CPaintDC를 통해 DC를 얻을 것이다. 그런데, 이 DC는 현재 보여지고 있는 스크린에 대한 DC를 얻어낸 것이기 때문에, 이것을 사용하여 GDI 조작을 하게되면 빠른 화면 갱신이 발생할 경우 깜빡임이 발생하게 된다. 이 깜빡임을 없애기 위해 다음 3가지를 주로 사용하게 된다. 첫번째, 윈도우가 자식 윈도우를 많이 가지고 있고, 부모 윈도우에 발생한 WM_PAINT 메세지가 자식들에게 전달되는 경우, 자식 윈도우들 역시 불필요한 WM_PAINT 메세지를 처리하는 것을 방지하는 WS_CLIPSIBLINGS 스타일을 준다. WS_CLIPSIBLING.. 더보기
CxImage에서 투명 픽셀을 표시하려면? 투명 픽셀을 이용할 수 있는 PNG 파일과 같은 경우, CxImage에서는 SetTransIndex(), SetTransColor(), AlphaStrip()을 이용하여 투명 픽셀을 표시하게 된다. 먼저, 필요한 파일을 부르고, 이 파일에 대해서 SetTransIndex(0)을 호출하여 투명 처리를 가능하게 해주어야 한다. 그 다음, SetTransColor()을 호출하는데, 이 메서드는 인자로 RGBQUAD를 요구한다. 여기에 넘겨지는 값은 투명도를 표시하는 픽셀의 RGBQUAD 값이다. 그리고, 마지막으로 AlphaStrip()을 호출하면 해당 이미지의 투명 픽셀을 출력할 수 있다. 예를 들어, RGBA = 0xFF, 0xFF, 0xFF, 0xFF의 값이 투명을 의미하는 픽셀값일 경우, 다음과 같이 .. 더보기
CWnd::PostNcDestroy() 일반적으로, 가장 바깥의 프레임 윈도우를 만드는데는 CFrameWnd가 사용되는데, 이것은 따로 청소 작업을 해주지 않아도 된다. 즉, CWinApp의 m_pMainWnd에 CFrameWnd에서 파생된 윈도우를 붙였다면, 이것은 따로 삭제해주지 않아도 CFrameWnd가 알아서 삭제된다. 그렇지만, 프레임 윈도우를 CFrameWnd가 아니라 CWnd에서 파생받아서 사용했고, 이것을 힙에 생성했다면, 청소 작업을 반드시 해주어야 한다. 2가지 방법이 있을 수 있는데, 가장 일반적인 방법인, PostNcDestroy() 메서드를 오버라이딩해서 자신을 삭제해주어야 한다. (delete this와 같은 방법으로) 두번째 방법은, 만약 PostNcDestroy() 메서드를 오버라이딩하지 않는다면 스마트 포인터와 .. 더보기
Memory Leak Check Visual C++에서는 MFC나 C 런타임 라이브러리 내에서 메모리 누수를 검사할 수 있는 간단한 방법을 제공한다. MFC는 사용자가 특별히 작업해주지 않아도 메모리 누수를 보고해주는 기능이 포함되어 있는 반면, MFC를 사용하지 않는 프로그램들은 메모리 누수를 검사하도록 사용자가 직접 코드를 추가해주어야 한다. 간단히 절차를 말하면, 다음과 같다. 전처리 부분의 가장 위쪽, 보통 PCH 다음에 #define _CRTDBG_MAP_ALLOC를 선언하고, #include "crtdbg.h"를 포함한다. #include "stdafx.h" #define _CRTDBG_MAP_ALLOC #include "crtdbg.h" 그리고, 필요한 함수는 _CrtSetDbgFlag(), _CrtDumpMemoryLea.. 더보기