본문 바로가기

Information

Win API 개념

윈도우의 정의 / 구성요소 / 클래스 / 스타일 


1. 윈도우의 정의
2. 윈도우의 구성요소
3. 작업 영역이란 무엇인가 ?
4. 비작업 영역이란 무엇인가 ?
5. 윈도우 클래스란 무엇인가 ?
6. 윈도우 클래스의 종류
7. WNDCLASS 구조체
8. WNDCLASSEX 구조체
9. 윈도우 스타일
10. 확장 윈도우 스타일


1. 윈도우의 정의
-> 윈도우의 정의 : 프로그램이 출력 결과를 내보내고 사용자로부터 입력을 받아들이는 화면상의 사각영역


2. 윈도우의 구성요소

사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지

3. 작업 영역이란 무엇인가 ?

-> 방금 예시한 첫번째 그림의 파란색 네모칸 안쪽은 작업 영역(Client Area)이다.
   작업 영역이란 출력을 내보내고 사용자에게 명령을 받아들이는 부분을 말하며
   이 부분이 주 프로그래밍 대상이다.
   프로그램은 일반적으로 작업 영역에만 출력을 할 수 있으며 작업 영역의 좌상단이
   원점인 (0, 0) 이 된다.

4. 비작업 영역이란 무엇인가 ?

-> 작업 영역 이외의 부분, 즉 메뉴, 타이틀 바, 경계선 등의 영역을
   비작업영역( Non Client Area ) 이라고 하며 이 부분은 운영체제가 대신 관리해주므로
   프로그램에서 특별히 신경써주지 않아도 된다.

5. 윈도우 클래스란 무엇인가 ?

-> 윈도우 클래스는 “WIN 32 API 기본틀”에서 간략하게 알아본적이 있다.
   이번에는 윈도우 클래스를 좀더 자세히 알아보기로 하자.

   윈도우 클래스(window class)는 윈도우를 만들기 위한 형틀이며 생성될 윈도우의 여러 가지 특징들을
   모아놓은 구조체를 말한다.

6. 윈도우 클래스의 종류

① 시스템 전역 클래스 (System global class)

-> 이것은 운영체제가 부팅될 때 등록되는 클래스이며 주로 컨트롤 윈도우를 만들 때 사용된다.
   button, edit, scrollbar, listbox 등이 그 예이며 클래스 이름이 시스템에 의해 미리 정해져 있다.
   운영체제가 직접 등록하기 때문에 응용 프로그램은 이 클래스를 등록할 필요가 없으며
   파괴할 수도 없다.

② 응용 프로그램 전역 클래스 (Application global class)
-> 이것은 주로 DLL에 의해 등록되며 프로세스의 모든 모듈에서 이 클래스를 사용할 수 있다.
   주로 여러 프로그램이 함께 공유해야 할 커스텀 컨트롤을 만들 때 사용된다.

③ 응용 프로그램 로컬 클래스 (Application local class)

-> 이것은 응용프로그램 자신이 메인 윈도우(또는 커스텀 윈도우)를 만들기 위해 프로그램 선두에서
   등록하는 클래스이며 프로그램 내부에서만 사용된다. 윈도우 클래스를 등록한 프로그램이
   종료되면 윈도우 클래스도 같이 파괴된다.
   WNDCLASS 의 구조체를 채워서 그것을 등록하고(RegisterClass) 그 클래스로부터 윈도우를
   만들어(CreateWindow) 사용하는 것은 모두 응용 프로그램 로컬 클래스를 이용한 것이다.

7. WNDCLASS 구조체

----> 이 구조체의 멤버의 특성에 대해서는 Win 32 API 의 기본틀을 분석할 때 알아보았다.

① lpszClassName
-> 등록하고자 하는 윈도우 클래스의 이름을 나타내는 문자열이며 윈도우 클래스의 구분에 사용된다.

② hInstance
-> 이 윈도우 클래스를 등록한 응용 프로그램의 인스턴스 핸들이다.
   메인 윈도우를 만들 때는 hInstance 또는 HInstance 인수를 그대로 대입해 주면 된다.

③ lpfnWndProc
-> 메시지 처리 함수를 지정한다. 이 클래스로부터 만들어진 윈도우에 메시지가 전달되면 이 멤버가
   지정하는 함수로 메시지가 전달되어 윈도우 고유의 처리를 하게 된다.
   이 멤버의 값은 메시지 처리 함수의 이름을 적어주면 된다. 이름은 아무렇게 해도 좋으며,
   메인 윈도우의 경우에는 WndProc 를 적는 것이 보통이다.

   <예> Test_WndClass.lpfnWndProc := @WndProc;

④ hCursor
-> 클래스 커서를 지정한다. 이는 LoadCursor 함수로 읽어들이는데,
   이 함수의 첫인자에 인스턴스 핸들을, 두번째 인자에 커서의 값을 대입해 주면 된다.
   두번째 인자는 리소스가 될수도 있고, 윈도우즈가 제공하는 디폴트 커서가 될수도 있다.
   다음은 윈도우즈가 제공하는 커서이다.

   - IDC_ARROW : 일반적으로 윈도우즈에서 사용하는 화살표 (일반적으로 사용함.)
   - IDC_CROSS : 십자모양의 커서
   - IDC_IBEAM : 영문자 I 자모양의 커서
   - IDC_NO : 동그라미에 대각선이 그어진 모양의 커서
   - IDC_WAIT : 모래시계 모양의 커서

⑤ hIcon
-> 윈도우 아이콘을 지정한다. 이는 LoadIcon 함수로 읽어들이는데,
   이 함수의 첫인자에 인스턴스 핸들을, 두번째 인자에 커서의 값을 대입해 주면 된다.
   두번째 인자는 리소스가 될수도 있고, 윈도우즈가 제공하는 디폴트 아이콘이 될수도 있다.
   디폴트 아이콘은 보통 IDI_APPLICATION 이 쓰인다.

⑥ hbrBackground
-> 윈도우의 작업영역을 칠한 배경 브러시를 지정한다. GetStockObject 나 그 외 브러시를
   만드는 함수를 사용하여 브러시 핸들을 얻은 후 핸들을 이 멤버에 대입해 주면 윈도우의
   배경을 칠할 때 이 브러시를 사용하게 된다.
   윈도우즈가 기본적으로 제공하는 브러시는 GetStockObject 함수를 사용하며,
   이 함수의 인자는 다음 중에서 쓰일 수 있다.

    - WHITE_BRUSH : 흰색
    - BLACK_BRUSH : 검정색
    - LTGRAY_BRUSH : 회색

⑦ lpszMenuName
-> 이 클래스로부터 만들어진 윈도우가 사용할 메뉴를 지정한다. 메뉴는 윈도우 클래스에서뿐만
   아니라 CreateWindow 함수에서 개별 윈도우를 만들 때도 지정할 수 있다.
   메뉴는 주로 리소스에서 불러와 사용된다.

⑧ cbClsExtra
-> 윈도우 클래스에서 사용하고자 하는 여분의 메모리 양을 바이트수로 지정한다.
   운영체제는 윈도우 클래스를 등록할 때 이 멤버가 지정하는만큼의 메모리를 추가로 할당해준다.
   여분의 메모리이므로 사용목적은 프로그램에서 정하기 나름이며 SetClassLong, GetClassLong 등의
   함수로 이 메모리를 사용한다. 여분의 메모리를 사용하지 않는 윈도우는 이 값을 0 으로 해줘야
   한다.

⑨ cbWndExtra
-> 기능은 cbClsExtra 와 유사하다. 단, cbClsExtra와는 달리 개별 윈도우에서 사용하고자 하는
   여분의 메모리 양을 지정한다는데 차이점이 있다.

⑩ style
-> 윈도우 클래스의 스타일을 지정한다. 이는 CreateWindow 에서 지정하는 개별 윈도우의
   스타일과는 다른 것으로서, 다음과 같은 스타일들이 있다.

   CS_HREDRAW : 작업영역의 폭이 변경되면 윈도우를 다시 그리도록 한다.
   CS_VREDRAW : 작업영역의 높이가 변경되면 윈도우를 다시 그리도록 한다.
   CS_DBLCLKS : 마우스 더블클릭 메시지를 보내도록 한다. 이 스타일을 지정하지 않으면
                더블클릭은 무시된다.
   CS_NOCLOSE : 시스템 메뉴의 닫기 명령을 사용하지 못하도록 한다.
   CS_BYTEALIGNWINDOW : 윈도우를 X축으로 바이트 정렬하도록 하여 이동이나 크기조정의
                        속도를 빠르게 한다.
   CS_BYTEALIGNCLIENT : 작업영역을 X축으로 바이트 정렬하도록 하여 이동이나 크기조정의
                        속도를 빠르게 한다.
   CS_CLASSDC : 이 클래스로부터 만들어진 모든 윈도우가 하나의 DC를 공유하도록 한다.
   CS_OWNDC : 각 윈도우가 하나의 DC를 독점적으로 사용하도록 한다.
   CS_PARENTDC : 차일드 윈도우가 부모 윈도우의 DC를 사용하도록 한다.
   CS_GLOBALCLASS : 응용 프로그램 전역 클래스로 등록한다.
   CS_SAVEBITS : 이 윈도우가 차지하는 화면 영역을 비트맵으로 저장하도록 한다.

8. WNDCLASSEX 구조체

-> 이 구조체는 기존의 WNDCLASS 멤버의 특성에 몇가지가 추가된 것이다.
   클래스 등록은 RegisterClassEx 함수가 사용된다.
   추가된 것은 cbSize 와 hIconSm 멤버이다.

① cbSize
-> 버전 확인을 위해 구조체의 크기를 대입해주는 멤버이다.

② hIconSm
-> 기존의 hIcon 이 32 * 32 크기의 큰 아이콘을 지정하는데 비해,
   hIconSm 은 16 * 16 크기의 작은 아이콘을 지정한다.

9. 윈도우 스타일
-> 윈도우 스타일을 대입하여 윈도우 창을 생성할 때는 CreateWindow 함수를 사용한다.
   다음은 윈도우 스타일을 나열한 것이다.

 // 윈도우 스타일 ;

 WS_OVERLAPPED : 디폴트 윈도우
 WS_POPUP : WS_CHILD 와 함께 쓸 수 없다.
 WS_CHILD : WS_POPUP 과 함께 쓸 수 없다.
 WS_VISIBLE : 윈도우를 만들자마자 화면에 출력
 WS_DISABLED
 WS_CAPTION
 WS_BORDER : 단선으로 된 경계선을 만들며 크기 조정은 할 수 없다.
 WS_SYSMENU
 WS_THICKFRAME
 WS_MINIMIZE
 WS_MAXIMIZE
 WS_MINIMIZEBOX
 WS_MAXIMIZEBOX
 WS_VSCROLL
 WS_HSCROLL

 ( WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICHFRAME |
    WS_MINIMIZEBOX | WS_MAXIMIZEBOX == WS_OVERLAPPEDWINDOW )

 ( WS_POPUP | WS_BORDER | WS_SYSMENU == WS_POPUPWINDOW )


 WS_CLIPSIBLINGS : 차일드끼리 상호 겹친 영역은 그리기영역에서 제외된다.
 WS_CLIPCHILDREN : 차일드가 위치한 영역은 그리기영역에서 제외된다.
 WS_DLGFRAME : 두꺼운 경계선을 가지며 타이틀바를 가질수 없다.
 WS_GROUP : 라디오버튼등 그룹을 이루는 컨트롤의 그룹지정에 사용
 WS_TABSTOP : Tab키로 포커스를 이동할 수 있도록 한다.

10. 확장 윈도우 스타일

-> 윈도우 스타일과는 별개로 확장 윈도우 스타일이 있다.
   윈도우 스타일을 대입하여 윈도우 창을 생성할 때는 CreateWindow 함수를 사용한다.
   윈도우 확장 스타일의 경우에는 CreateWindowEx 함수가 사용된다.
   다음은 확장 윈도우 스타일을 나열한 것이다.

 // 확장 윈도우 스타일 ;

 WS_EX_DLGMODALFRAME : 이중 경계선을 가진 윈도우를 만든다.
 WS_EX_NOPARENTNOTIFY : 생성되거나 파괴될 때 부모 윈도우에게
                 WM_PARENTNOTIFY 메시지를 보내지 않도록 한다.
 WS_EX_TOPMOST : 모든윈도우보다 수직적으로 위에 있는 윈도우를 만든다.
 WS_EX_ACCEPTFILES : 드래그되는 파일을 받을 수 있다.
 WS_EX_TRANSPARENT : 형제 윈도우가 다 그려지기 전에 그려지지 않아 투명하게 보이는
                            윈도우를 만든다.
 WS_EX_MDICHILD : MDI 차일드 윈도우를 만든다.
 WS_EX_TOOLWINDOW : 플로팅 툴바 형식의 윈도우를 만든다.
 WS_EX_WINDOWEDGE : 양각 모양의 경계선을 가진 윈도우를 만든다.
 WS_EX_CLIENTEDGE : 작업영역이 쑥 들어간 음각 모양으로 만든다.
 WS_EX_CONTEXTHELP : ? 모양의 도움말 버튼 표시
 WS_EX_LAYERED : 2000에서 추가된 속성이며 레이어드 윈도우를 생성한다.
 WS_EX_CONTROLPARENT : TAB키로 차일드 사이를 전환할 수 있도록 한다.
 WS_EX_STATICEDGE : 사용자의 입력을 받아들이지 않는다는 의미의 삼차원 장식을 한다.
 WS_EX_APPWINDOW : 윈도우가 보일때 강제로 태스크바 위에 있도록 한다.
 WS_EX_OVERLAPPEDWINDOW : (WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE)
 WS_EX_PALETTEWINDOW : (WS_EX_WINDOWEDGE | WS_EX_TOOLWINDOW | WS_EX_TOPMOST)

출처 : http://blog.naver.com/kirin9?Redirect=Log&logNo=140037804816

'Information' 카테고리의 다른 글

Musicovery (자기에게 어울리는 음악 찾기?)  (1) 2008.01.11
Chris Tomlin, Lincoln Brewster 벨소리  (0) 2007.11.05
오버 클럭 테스트 완료  (1) 2007.10.27
네이트온 메모짱  (0) 2007.10.24
Java 란??  (0) 2007.10.24