전체 글 389

문자열(스트링) 전격 분석

백택 (bektekk@yahoo.co.kr) 홈페이지 : http://bektekk.wo.to 문자열(스트링) 전격 분석1강 본강좌는 코드 프로젝트에 제가 좋아하는 프로그래머인 Michael Dunn의 강좌 The Complete Guide to C++ Strings, Part I 과 II 를 번역한 글입니다. 최대한 의역을 하려고 노력했지만, 이런쪽의 경험이 부족하다 보니 많이 모자란 강좌가 되겠지만, 많은 도움이 되셨으면 합니다. 기타 문의 사항이나 질문은 쪽지나 메일을 이용해 주셨으면 합니다. 본강좌는 제 홈페이지(위의 링크)를 통해서도 보실수 있습니다. 사실 이글은 Part I/II 두 강의로 구성이 되있지만 제 역량이 모자라는 관계로 더 잘게 쪼개 여러강좌로 재구성하겠습니다. 소개 프로그래밍 작..

C, C++ 문법 2008.09.01

CWnd Class

CWnd Class - CWnd 클래스는 MFC의 모든 윈도우 클래스들에 대해서 기본적인 기능을 제공 하는 클래스이다. 데이터 멤버 m_hWnd : CWnd와 관련된 HWND를 가리킨다. 생성/소멸 관련 함수 CWnd : CWnd객체를 생성한다. DestroyWindow : 윈도우를 소멸한다. 그렇지만 객체를 소멸시키는 것은 아니다. 초기화 관련 함수 Create : CWnd 객체와 관련된 자식 윈도우를 만들고 초기화한다. PreCreateWindow : CWnd 객체와 관련된 실제 윈도우를 만들기 전에 호출된다. CaleWindowRect : 클라이언트 사각형 영역에서 윈도우를 만들기 전에 호출된다. GetStyle : 현재 윈도우의 스타일을 반환한다. GetExStyle : 확장된 윈도우의 스타일을 ..

MFC 2008.09.01

DECLARE_DYNCREATE()와 IMPLEMENT_DYNCREATE() 다른이 글 고찰 발췌 - 실행중 타입정보

DECLARE_DYNCREATE()와 IMPLEMENT_DYNCREATE() 최근 CFrameWnd를 이용해 원하는 View를 창에 넣어 마치 Dialog 창 처럼 띄우는 방법을 사용해 문제를 해결한 적이 있다. 이번에 또 그런 필요성이 생겼고 이 창 Frame에 포함될 View가 경우에 따라 여러 가지로 확장될 가능성이 있기 때문에 이 부분을 dll로 분리하기로 결정하였다. 그런데 우연히 MFC 확장 DLL로 만들려던 것을 잘못하여 기본 MFC DLL로 프로젝트(_AFXEXT의 pre define 유무에 따라 결정된다)를 생성하게 되었다. 특정 클래스 통째를 AFX_EXT_CLASS 키워드를 통해 외부에 공개할려고 하다가 다음과 같은 compile warnning을 접하게 되었다. warning C42..

MFC 2008.08.31

MFC 내부구조 #2 MFC Internals - 대충 읽어볼 글

MFC 내부구조 #2 MFC Internals 2004/07/25 06:48 http://blog.naver.com/synchrog/140004387209 이 포스트를 보낸곳 () 2. MFC와 C/SDK 자, 두번째다. 이번엔 MFC와 기존의 API를 비교해가며 분석해보자. Windows 프로그렘은 2개의 핵심 요소로 이루어 저있다. (1) main application 그 자체 (2) message를 처리할 수 있는 1개 이 상의 window. MFC가 개발된 궁극적인이유, 다시한번 강조하지만 역시, 시간의 효율성을 최적화한, 생산성 향상에있다고 생각한다.(뭐 절대 틀린말은 아니겠지?) 기존의 API를 살펴보면 최소한 boilerplate code 가 90줄 이상 copy and paste로 베이스 ..

MFC 2008.08.31

MFC 내부구조 #1 MFC Internals - 대충 읽어볼 글

MFC 내부구조 #1 MFC Internals 2004/06/22 21:03 http://blog.naver.com/synchrog/140003492891 이 포스트를 보낸곳 () 간단히 정리하자. MFC는 MS의 천재들이 기어나와서 (MS가 아닌사람도있다) Application Framework 라는 팀을 개설하고 진정한 객체지향 프로그레밍을 위해 힘썼다. 근데 AFX가 된이유는 AF만 쓰면 뭔가 약자같아보여서 X를 붙였다고한다.(진짜로) 아무튼 MFC 1.0의 경우 엄청난 비난과 찬사를 받았지만 궁극적으로 운영체제와너무 동떨어진 프레임웍이 나왔다. 그래서 완전 폐기해버리고 전격적인 윈도우즈 프로그레밍 전용 객체지향 프레임웍을 내놓은것이 지금의 MFC이다.MFC는 COM으로 만들어졌다. 그래서 디테일한..

MFC 2008.08.31

WM_PAINT의 비밀...? - 메시지 큐잉 관련 좋은 글....비큐 메시지/큐 메시지 정확한 구분

WM_PAINT의 비밀...? 을 이해 하기 위해서는 몇가지 간략한(!?) 사전지식이 필요하다. Windows와 메시지큐는 안다는 가정 하에 하나씩 적어보자... 참고용 메시지루프 되시겠다. 다들 기억이 안날테니 ^______^ BOOL bRet; while( (bRet = GetMessage( &msg, hWnd, 0, 0 )) != 0) { if (bRet == -1) { // handle the error and possibly exit } else { TranslateMessage(&msg); DispatchMessage(&msg); } } 0 : 윈도우즈에서 모든 객체의 소유권은 쓰레드가 가지고 있다. 윈도우의 메세지 큐는 해당 윈도우를 가지고 있는 쓰레드가 가지고 있다. 각 쓰레드는 한 쓰레드..

API 2008.08.31

mfc 메시지 관련 좋은 자료

첨부한 자료에 메시지 구분을 잘못한 부분이 있다. queued message의 경우 키스트로크 (WM_KEYDOWN / WM_KEYUP등)과 키스트로크에 의한 문자(WM_CHAR), 마우스 이동(WM_MOUSEMOVE), 마우스 클릭(WM_LBUTTONDOWN), 타이머 메세지(WM_TIMER), 그리기 메세지 (WM_PAINT), 종료 메세지(WM_QUIT)가 있으며, non-queued message는 그 외의 다른 모든 메시지가 되겠다. 가운데 메시지맵에서 찾는 부분에 빠진 부분이 있다. 중요한 루프 부분이다. 다음과 같다. BOOL CWnd::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult) { LRESULT lResul..

MFC 2008.08.31

WM_PAINT 메시지의 특별한 동작

WM_PAINT 메시지의 특별한 동작 WM_PAINT 메시지가 메시지 큐에 있을 때, GetMessage()는 메시지를 제거하지 않는다. WM_PAINT 메시지를 제거하는 곳은 BeginPaint() 호출에서다. 그러므로 WM_PAINT 메시지를 처리하는 곳에서는 반드시 BeginPaint()를 호출해야 한다. 그렇지 않으면 윈도우 프로시저는 제거되지 않는 WM_PAINT메시지를 계속 받게 된다. 또한 WM_PAINT 메시지가 아닌 곳에서 DC를 얻기 위해 BeginPaint()를 사용하는 것은 메시지 큐에서 WM_PAINT를 지울 수 없으므로 타당한 DC를 얻지 못하게 된다. - 반드시 기억하여 두자. WM_PAINT 메시지에서는 BeginPaint()로 DC를 얻고, 다른 메시지에서는 GetDC()를..

API 2008.08.31

[MFC Hole]CWnd::SubclassWindow(), CWnd::UnsubclassWindow()

[MFC Hole]CWnd::SubclassWindow(), CWnd::UnsubclassWindow() | 프로그래밍 전반 2008/08/31 08:55 스파이럴(gae11) http://memolog.blog.naver.com/gae11/578 삶 그리고 깨달음 | 프리맨 http://blog.naver.com/lonekid/60007134487 MFC CWnd 클래스의 SubclassWindow()를 사용함에 있어 주의해야 하는 제약 사항이 있다. 이미 CWnd 오브젝트에 맵핑되어 있는 hWnd를 파라미터로 하여 CWnd::SubclassWindow()를 호출하게 되면 충돌이 발생한다. 이런 경우는 서브클래싱을 통해 추가적인 기능을 제공하는 범용 클래스를 소스 레벨에서 통합시킬 때 발생할 수 있다...

MFC 2008.08.31