본문 바로가기

Library/Windows Programming

Windows Template Library Startup 1 WTL을 프로젝트에 이용하기로 마음 먹었다면, PCH(Precompile Header)를 사용하는게 좋다. 대부분의 C++ 컴파일러가 아직 export 키워드를 구현하지 않았기 때문에, 분할 컴파일 모형을 적용할 수 없으며, 템플릿 라이브러리는 아직까지 대부분 헤더 파일만의 형태로 제공된다. 완전히 빈 상태인 stdafx.h와 같은 PCH에서 출발한다면, 다음과 같은 내용이 포함되어야 한다. stdafx.h #include // base ATl classes #include // base WTL classes #include // ATL GUI classes #include // WTL frame window classes #include // WTL enhanced msg map macros #incl.. 더보기
Windows Template Library Installation 사실, WTL과 같은 고전적인 C++ 라이브러리는 MS 입장에서는 더 이상 강력하게 추진할만한 것은 아니다. 무엇보다 .NET이란 대단한 물건을 가지게 되었기 때문인데, 기존의 MFC와 ATL 조합이 복잡하기는 해도 기존의 요구는 그런대로 처리할 수 있기 때문이다. MS에서 WTL을 공식적으로 지원하지 않으며, 오픈 소스로 공개한 것은 위와 같은 이유 때문이다. VMS 유전자를 이어받은 NT 기반 이후의 윈도우들이, 그 특성상 개발 문화가 단일화되고, 전문적이며, 무거워지는 뚜렷한 경향을 보이는 것을 생각한다면, 이러저러한 이유로 오픈 소스로 공개된 WTL은 Windows 최후의 캐주얼한 개발 문화의 상징이라 해도 될 것 같다. ATL은 COM 컴포넌트를 만드는데 대단히 유용한 툴이지만, 전통적인 윈도우.. 더보기
WTL을 사용할 때 주의할 점 Window Template Library(WTL)은 MFC에 비해 아주 작고 빠른 코드를 만들어 낼 수 있으며, 그 구조 또한 MFC와 비교되지 않을 정도로 깔끔하다. MFC 클래스들의 경우, CObject에서부터 개체를 상속 받기 때문에, CWnd에 이르러서는 엄청난 크기를 가진다. 즉, CWnd를 생성하는 것은 대단히 비싼 일이다. 반면, WTL은 interface / implementation이 엄격하게 분리된 구조로 설계되었다. CWnd에 해당하는 WTL의 CWindow은 사실 데이터멤버 밖에 가지고 있지 않으며, 크기가 매우 작다. 따라서, MFC처럼 CWnd 개체를 파라미터나 리턴값으로 사용하기 위해 상대적으로 TemporaryMap을 유지할 필요가 없으며, 이것은 MFC처럼 Idle 타임에.. 더보기
WPF는 Win32를 대체하는 것인가? Windows Form 이후, WPF라는 물건을 접하면 대단히 놀라게 된다. 일단, WPF를 위시한 .NET Framework 3.0이 과거 WinFX로 알려졌던 것처럼, 20년간 윈도우 프로그래밍을 지배해온 Win32 기반의 프로그래밍이 드디어 대체되나 하는 기대를 했으니 말이다. WinFX라는 단어를 처음 들었을 때는, 확실히 그 이름에서 Win32의 후계자라는 느낌이 강했으니 무리는 아니다. 결국, WinFX는 Win32의 후계자가 아니라 .NET Framework에서 돌아가는 녀석이라는 것을 알았을 때 그 아쉬움이란.. 그동안 윈도우에서 뭔가 UI 작업을 하려면 귀찮음의 연속이었다. 사실 경험있는 개발자라면, C#으로 .NET Framework에서 Windows Form 이벤트 핸들러를 추가하나 .. 더보기
WTL, Windows Template Library MFC는 강력한 클래스 라이브러리이다. Win32 API로 Windows 프로그래밍을 하는 것은, Windows 프로그래밍을 배울 때가 아니라면 이 방법으로 실제로 일하는 것은 엄청난 시간이 걸리는 일이고, 그럼에도 불구하고 원하는 기능을 제대로 구현할 수 있을지 여부도 장담할 수 없다. 왜냐하면, MSDN에서 API에 대한 설명이 잘 되어 있다고 하더라도, 그 API를 처음부터 조합해서 원하는 기능을 만들어내는 것은 쉬운 일이 아니기 때문이다. API만 사용해서 ActiveX 컨트롤을 만든다고 생각해보라. 끔찍하지 않은가? MFC는 사실 잘 구성되어 있는 클래스 라이브러리가 아니다. API를 래핑하는 구조에서 크게 벗어나지 못하고 있고, CObject에서 파생되어 나가는 구조라 가장 자주 쓰이는 CWn.. 더보기
윈도우 메세지와 메세지 큐 너무나 잘 알려진 이야기지만, 윈도우는 Event Driven 방식에 의해서 동작한다. 윈도우는 메세지 큐를 가지고 있으며, 윈도우가 생성하는 메세지는 이 메세지 큐를 이용하여 처리된다. 그렇지만, 중요한 것은 모든 메세지가 메세지 큐에 저장되는 것은 아니라는 점이다. 예를 들어, MFC의 CWnd 파생 개체들은 PreTranslateMessage()라는 메서드에서 메세지 큐에 들어있는 메시지를 미리 처리할 수 있는 기회를 가질 수 있는데, 가끔 원하는 메세지를 찾을 수 없는 경우가 있을 것이다. 그 이유는, 윈도우가 특정 메세지는 메세지 큐로 보내지 않고 바로 처리하기 때문이다. 또, 특정 메세지는 반드시 처리한다는 보장도 없다. 그러한 메세지 중 대표적인 것인 WM_TIMER 메세지이다. WM_TIM.. 더보기
MFC와 Windows Form Windows Form 프로그래밍을 처음 접하면, MFC에서의 지저분한 구조를 한번에 대체할 수 있을 것만 같은 느낌이 들지만, 실제로는 그렇지 않다. MFC 구조는 깔끔하지 못하다. 대표적으로, MFC는 윈도우로 가는 메세지를 모두 잡아내기 위해서 2개의 훅을 설치하는데, 그 중 하나는 WH_CBT라는, 이름부터 마음에 들지 않는 훅이다. CBT는 Computer Based Training의 약자인데, 이 훅의 목적은 윈도우의 작동 방식을 배우라는건가? 여튼, 이 훅을 설치해야 윈도우의 시스템 메시지까지 잡아낼 수 있다. 만들어진지 꽤나 오래되는 클래스 라이브러리이고, 구조로 봤을 때도 그렇게 깔끔한 라이브러리가 아니라서 항상 이런 저런 불만은 많았지만, 직접 클래스 라이브러리를 만들어보려고 하면 MF.. 더보기
WM_CTLCOLOR 메세지로 컨트롤의 배경색 바꾸기 컨트롤의 색을 바꾸는데는 WM_CTLCOLOR 메세지를 이용하게 된다. MFC를 사용하는 경우라면, 미리 정해진 OnCtlColor() 메서드를 사용하게 된다. 그러나, 여기서 주의할 점이 하나 있다. 배경색을 지정하기 위해서 OnCtlColor()의 인자인 pDC를 사용하여 pDC->SetBkColor()로 아무리 지정해봤자 컨트롤의 배경색을 변경되지 않는다는 점인데, 메서드 내부에서 로컬 변수로 브러시를 생성해서 브러시 핸들을 리턴해도 컨트롤의 배경색은 변경되지 않는다. Win32 API에서 인자로 전달되거나 리턴값으로 넘어가는 값이 함수가 종료된 다음에도 계속 유효해야 하는 함수들이 종종 있다. 즉, OnCtlColor의 경우에는, 메세지를 받은 부모가 유효한 브러시 핸들을 계속 가지고 있어야 하며.. 더보기
CView를 어떻게 생성해야 하는가? SDI 형태든, MDI 형태든 CView를 생성해서 CDocument와 연결하려고 하면 가장 먼저 다음과 같은 의문이 떠오른다. 어느 위치에서, 언제 CView를 생성해야 하는가? 먼저, 이론적으로 가장 적절한 위치는 ProcessShellCommand를 호출한 다음, 그 다음 필요한 View를 생성해서 CDocument와 연결하는 것이 가장 적절해 보인다. 따라서, CWinApp::InitInstance()가 적절한 위치가 될 것이다. 그렇지만, 가장 중요한 것은, 어떻게 CView를 생성하느냐이다. 물론, CView 역시 CWnd에서 파생받은 개체이므로 CWnd::Create()를 사용할 수 있을 것 같지만, CWnd를 생성하는 것처럼 Create()를 생성하고 CDocument::AddView()를.. 더보기
CView 파생 클래스를 사용하기 MFC의 Doc / View 구조를 번거로워 하는 사람들이, 그냥 바닥에서 바로 코드를 쌓아올리다가 만나는 가장 귀찮은 문제는 이것이다. CView의 파생클래스들은 그야말로 편리한 클래스들이 많다. 대표적으로, 스크롤 기능을 제공하는 CScrollView가 있는데, 스크롤 기능을 추가하고자 할 때 CScrollView 클래스를 사용하지 않는다면 WS_HSCROLL이나 WS_VSCROLL 스타일을 줘서 윈도우를 생성하거나, 스크롤바를 생성해서 윈도우에 붙여줘야 하고, 더구나 화면의 스크롤를 생각해서 WM_PAINT 메세지를 처리해야 한다. 참으로 귀찮은 일이 아닐 수 없다. 그렇다면, CScrollView를 평범하게 그냥 상속받아 사용할 수 있을까? 결론부터 말하자면 어렵다. 매우 힘들다. Doc / Vi.. 더보기