블로그 이미지
대갈장군

calendar

1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

Notice

2009. 11. 17. 02:44 프로그래밍/Windows API
윈도우는 CreateWindow() 함수에 의해 만들어진다. 
HWND CreateWindow(      
    LPCTSTR lpClassName,     LPCTSTR lpWindowName,     DWORD dwStyle,     int x,     int y,     int nWidth,     int nHeight,     HWND hWndParent,     HMENU hMenu,     HINSTANCE hInstance,     LPVOID lpParam );
윈도우 역시 클래스로 부터 만들어지는데 이른바 '윈도우 클래스' 중 하나로 부터 만들어진다. 첫번째 인자 lpClassName은 바로 그 '윈도우 클래스'를 지칭하는 인자이다.

재미 있는 것은 MSDN에도 나와 있듯이, 
lpClassName
[in] Pointer to a null-terminated string or a class atom created by a previous call to the RegisterClass or RegisterClassEx function. The atom must be in the low-order word of lpClassName; the high-order word must be zero. IflpClassName is a string, it specifies the window class name. The class name can be any name registered with RegisterClass or RegisterClassEx, provided that the module that registers the class is also the module that creates the window. The class name can also be any of the predefined system class names. For a list of system class names, see the Remarks section.
이 첫번째 인자에 올수 있는 놈은 Null-Terminated String 혹은 A Class Atom (클래스 부류) 라고 했는데 이 놈들은 RegisterClass 함수나 RegisterClassEx 함수에 의해서 미리 (이전에) 등록되어진 놈이라고 한다.

윈도우 클래스를 크게 두가지 종류로 나누자면 시스템 (운영체제)에서 제공하는 기본 윈도우 클래스와 사용자가 정의해서 사용하는 사용자 윈도우 클래스가 있다.

운영체제가 제공하는 윈도우는 우리가 자주 사용하는 "button" "edit" 과 같은 놈들이고 사용자가 정의하는 윈도우는 WNDCLASS 구조체를 사용자가 원하는 윈도우 형태로 채워넣은 다음 RegisterClass 함수를 이용해서 등록한 후 사용하는 것을 말한다. 

그래서 내가 원하는 형태의 윈도우를 그리고 싶다면,
1. 우선 WNDCLASS 구조체의 각 요소를 내가 원하는 옵션으로 설정한다.
2. RegisterClass 함수를 이용해서 생성한 WNDCLASS 구조체를 등록한다.
3. CreateWindow 함수의 첫번째 인자에 내가 작성한 WNDCLASS 의 이름을 넣어준다. 

조금 복잡하더라도 이렇게 함으로써 사용자는 같은 형태의 윈도우를 쉽게 재생성 할 수 있다. (그것이 WNDCLASS를 생성하고 등록하는 이유)

윈도우 클래스는 범위로 분류하자면 시스템 전역 클래스, 응용 프로그램 전역 클래스 그리고 응용 프로그램 로컬 클래스로 나뉜다.

시스템 전역 클래스는 운영체제가 제공하는 윈도우 클래스들로 부팅하면 자동으로 등록되는 놈이다. 이것들이 바로 기본으로 제공되는 놈들로 button, edit, scrollbar, listbox 등이다.

응용 프로그램 전역 클래스는 주로 DLL에 의해 등록되며 이 DLL을 불러들인 프로세스에서 자유롭게 사용된다. 이것들의 예로는 프로그래스, 트리뷰, 리스트뷰 등이 있다. 의외로 이런 것들이 운영체제에서 제공되는 시스템 전역 클래스가 아니라는 점이다. 고로 윈도우의 버전과 종류에 따라 저런 부분의 구현이나 기능, 색상등이 달라지는 것이다. (DLL의 버전이 다르니까)

마지막으로 응용 프로그램 로컬 클래스는 사용자가 WNDCLASS를 정의하고 RegisterClass 함수로 등록하여 사용하는 윈도우 클래스를 말한다. 중요한 점은 클래스 이름이 중복될 경우 가장 먼저 로컬 클래스 부터 선택하고 그다음이 응용 프로그램 전역 클래스 그리고 마지막이 시스템 전역 클래스이다. 뭐, DLL과 검색 순위가 동일하다만. :)


posted by 대갈장군