API 73

MAKEINTRESOURCE 매크로 분석

리소스 로딩시 다음과 같은 매크로를 사용한다. #define MAKEINTRESOURCE( i ) ( LPSTR )( ( DWORD )( ( WORD )( i ) ) ) 무의식적으로 사용하는 매크로이다. 대부분 다만 문자열 치환정도로 이해하고 책에도 별다르게 설명하지 않는다. api나 mfc 프로그래밍시 초반에는 워낙 배울게 많다 보니 리소스는 저런 매크로를 사용하는구나 하고 그려려니 하고 넘어간다. 내부를 들여다 보자. 어떻게 이런 처리가 가능할까? 함수호출은 명시적으로 문자열을 취하지만, 파일에 리소스를 저장시에는 실제적으로 두 가지 방식을 사용하고 있기 때문이다. 문자열로 저장하는 방법과 정수값으로 저장하는 방식이 그것이다. 실제로 EnumResourceNames - EnumResNameProc을 ..

API 2008.09.08

win32/DynamicLinkLibrary(dll) - Good

Written by 이동우(leedw at ssrnet.snu.ac.kr) 내용 Introduction 왜 DLL을 사용 하는가 DLL과 프로세스 주소 공간 DLL의 작성과 사용 Implicit Loading 방식 개요 DLL의 작성 실행 파일의 작성 실행 파일의 실행 Explicit Loading 방식 DLL Loading Unloading 내부 구조 Export Import 1 Introduction dynamic-link library는 어느 운영체제에서나 매우 중요한 이슈 사항이다. 프로그램을 실행하기 위해 소스 코드를 작성하고 이 소스 코드를 컴파일링해서 실행 파일을 생성하는 과정은 고전적인 프로그래밍 개발 모델로 오랫동안 자리를 잡아 왔다. 그러나 하드웨어 인프라가 발전하고 사용자 환경이 GU..

API 2008.09.05

큰 사이즈 그래픽(그림, 이미지) 화일 처리시 팁

이미지를 처리하는 경우... 보통 WM_PAINT 메시지 처리부에 리소스나 파일에서 DDB를 생성하고 화면에 뿌려주는 작업을 한다. 그런데 이경우 작은 파일의 경우는 별 상관이 없으나. 크기가 큰 파일의 경우 로딩하고 뿌리는 데 상당한 부하가 일어난다. 실제로 노트북의 경우 크기 1024*680 정도의 파일을 읽어서 화면 크기만 줄였다 늘였다 해도(WM_PAINT 메시지 발생) 상당히 버벅거림을 볼 수 있었다. 그래서 미리 DDB를 저장하는 변수를 만들어서 DDB 로딩을 먼저 시키고 그 핸들값을 저장한 후 처리해봤다. 이 경우 유효한 DDB가 있는 상태이니 WM_PAINT에서는 그냥 로딩은 하지 않고 뿌리는 작업만 하면 된다. 부하가 없어졌다. 이 결과로 비추어 볼때 화일에서 DDB를 생성하는 작업이 상..

API 2008.09.05

API 이용 MDI 구현 - 발췌

[Win32 - 김상형윈도우즈API정복-정리노트]MDI Win32 2008/09/02 09:59 http://blog.naver.com/blue7red/100054479397 이 포스트를 보낸곳 () 1.MDI - (1)정의 -동시에 여러 개의 문서를 열 수 있는 프로그램 형태를 의미한다. -요즘은 프로그램을 MDI로 작성하는 것은 별로 권장되지는 않는다. (2)MDI프로그램 구조 -프레임윈도우 : 메인윈도우 -클라이언트 윈도우 -차일드윈도우 :클라이언트윈도우의 자식윈도우다. (3)시스템의 MDI지원 -일단 운영체제의 지원 중 가장 중요한 부분은 클라이언트 윈도우가 미리 만들어져 있다. 2.MDI기본예제 (1)예제 - // 프레임 윈도우의 메시지 프로시저 LRESULT CALLBACK MDIWndProc..

API 2008.09.04

윈도우 메시지 종류 및 큐잉, 비큐잉 메시지

1 메시지 개요1.1 구조Windows는 메시지 기반의 운영체제이다. 메시지(Message)란 프로그램에 변화가 생겼을 때 Windows가 프로그램에게 알리는 정보이다. 메시지는 MSG로 정의되는 구조체인데 여기에는 윈도우 핸들, 메시지 식별 번호, 추가 정보, 시각, 커서 위치 등이 포함되어 있다. typedef struct tagMSG { HWND hwnd; // 메시지가 발생한 윈도우 핸들 UINT message; // message id WPARAM wParam; // 추가 정보 LPARAM lParam; // 추가 정보 DWORD time; // 메시지 발생 시간 POINT pt; // 커서 위치 } MSG; 1.2 식별 번호메세지 식별 번호(message id)는 0x0000에서 0xFFF 사..

API 2008.09.01

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

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

[Win32 - 김상형윈도우즈API정복-정리노트] 메타파일 Win32

[Win32 - 김상형윈도우즈API정복-정리노트]메타파일 Win32 2008/05/21 14:06 http://blog.naver.com/blue7red/100050978486 이 포스트를 보낸곳 () 1.메타파일에 대한 개요 -메타파일은 GDI함수호출을 부호화하여 모아놓은 파일이다. -비트맵이 그림자체를 저장하고 있는데 비해 메타파일은 그림을 그리는 명령을 저장하고 있기 때문에 장치독립적이라는 장점을 가지며 비트맵보다는 크기가 작다. 벡터그래픽은 일정한 크기의 비트맵으로 변환할 수 있으며, 모니터나 프린터 등의 장비가 래스터방식이기때문에 변환을 해야만 출력할 수 있다. -벡터그래픽은 선이나 면 등의 그래픽 개체에 대한 정보를 가지고 있기 때문에 다른 개체에 영향을 주지 않고 그래픽 개체를 자유롭게 편집..

API 2008.08.30