본문 바로가기

IT/WindowsProgramming

윈도우(Window)의 구성요소(Style) 및 종류

/* 
written by kaspy (kaspyx@gmail.com)
*/ 

 이번 블로그 내용은 Windows 운영체제 환경에서 실제적인 출력을 담당하고 있는 윈도우에 대해서 다루기로 하겠습니다.-*

기초적인 내용이라기보다는 기본적인 내용에 가깝고, 공부하면서 도움이 될만한 중요한것들만 정리해 보았습니다..



1. 윈도우는 'Windows 운영체제'(이하 Windows)가 관리하는 객체이다.

 화면에 뜨고 우리가 직접 보는 '윈도우'는 Windows 에서 관리하는 객체의 일종이다. 객체에 따라 대응되는 화면이 표시된다. 즉 평상시 사용자가 보고있는 윈도우는 Windows 내부에 있는 윈도우 객체가 출력된 형태이다. 대표적으로 윈도우를 띄우는 함수는 CreateWindow API이며 프로토 타입은 아래와 같다. Windows 에서는 기본값으로 픽셀 단위 좌표계를 사용하며, 화면의 좌측 상단 구석이 원점(0,0), 우측 방향이 X축 방향(양수+), 아래 방향이 y축 양수(+) 방향이다. (화면 해상도가 1024 x 768 일 경우 우측 하단 구석의 좌표는 1023, 767)


  1. HWND CreateWindow(              // 리턴값: 생성된 윈도우 핸들
  2.         LPCTSTR lpClassName,    // 윈도우 클래스명
  3.         LPCTSTR lpWindowName,   // 윈도우 이름
  4.         DWORD dwStyle,          // 윈도우 스타일
  5.         int x,                  // 출력할 윈도우의 좌측 상단 x좌표
  6.         int y,                  // 출력할 윈도우의 좌측 상단 y좌표
  7.         int nWidth,             // 수평방향 크기
  8.         int nHeight,            // 수직방향 크기
  9.         HWND hWndParent,        // 부모 윈도우 핸들
  10.         HMENU hMenu,            // 메뉴 핸들
  11.         HINSTANCE hInstance,    // 윈도우를 생성하는 프로그램의 인스턴스 핸들
  12.         LPVOID lpParam          // WM_CREATE 메시지에 넘길 전달 인자
  13. );

2. 윈도우 스타일로 윈도우의 구성요소및 종류를 지정한다.

 세번째 인자중에 'dwStyle' 이라는 멤버가 있는데 이값은 윈도우의 외관이나 종류 등을 지정하기 위한 32비트 정수값이다. 제목 표시줄의 유무나 크기 변경 가능 여부 등등을 지정해줄수 있다. 

 각각의 속성을 부여해주고 싶으면 OR 연산으로 조합해주면 된다. 예를들어 최대화 버튼을 추가하고 싶으면 WS_MAXIMIZEBOX를 OR연산 해주면된다. 아래는 구성요소에 따른 속성값 들이다.


- 윈도우 스타일 

 스타일

구성요소 

WS_CAPTION 

제목 표시줄 

WS_BORDER

가는 윈도우(크기변경 불가능) 프레임 

WS_DLGFRAME 

대화상자에서 사용하는 윈도우 프레임 

WS_THICKFRAME 

굵은(크기 변경 가능) 윈도우 프레임 

WS_HSCROLL 

수평 스크롤바 

WS_VSCROLL

수직 스크롤바 

WS_SYSMENU 

시스템 메뉴, WS_CAPTION과 함께 지정 

WS_MAXIMIZEBOX

최대화 버튼, WS_SYSMENU와 함께 지정 

WS_MINIMIZEBOX 

최소화 버튼, WS_SYSMENU와 함께 지정 


CreateWindow 함수를 호출 하기전에 

  1. ....
  2. DWROD style = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU;
  3. ...
  4. CreateWindow("haha","hoho",style,...);
  5. ...

(대략 요로코롬 쓴다...)


그런데 구성요소 값들을 미리 OR로 묶어서 간편하게 만든 값들이 있는데 이값에 따라 윈도우의 종류가 결정된다.윈도우는 성질의차이에 따라 세가지로 구별된다.


(1) 오버랩(Overlapped) 윈도우

(2) 팝업(Popup) 윈도우

(3) 자식(Child) 윈도우


오버랩 윈도우란 애플리케이션의 메인 윈도우로 사용하는 형식이다. 그냥 일반적으로 보는 윈도우 화면이라고 보면된다. 또한 팝업 윈도는 트레이 아이콘에 출력되는 윈도우라고 보면되고 자식 윈도우는 메인 윈도우가 될수없는 윈도우 타입으로 엑셀 편집기 안에 떠있는 sheet 라는 화면을 예로 들면 될것이다.


- 윈도우 스타일값에 따른 윈도우 종류

 스타일

윈도우의 종류

 WS_OVERLAPPED

 오버랩 윈도우. 제목 표시줄과 프레임이 있다. 

 WS_POPUP

 팝업 윈도우

 WS_CHILD

 자식 윈도우. 메뉴 표시줄을 사용하지 못한다.

 WS_OVERLAPPEDWINDOW

 WS_OVERLAPPED에 WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MAXIMIZEBOX, WS_MINIMIZEBOX를 조합한 윈도우이다. 

 WS_POPUPWINDOW

 WS_POPUP에 WS_BORDER와 WS_SYSMENU를 조합한 윈도우로, WS_CAPTION을 조합했을 경우에만 메뉴가 나온다. 

 WS_CHILDWINDOW

 WS_CHILD와 같다.


-그외의 윈도우 스타일

 스타일

의미

 WS_MAXIMIZE

 초기 상태에서 윈도우를 최대화 한다.
 WS_MINIMIZE

 초기 상태에서 윈도우를 최소화 한다. 

 WS_VISIBLE

 초기 상태에서 윈도우를 나타낸다. 

 WS_DISABLED

 초기 상태에서 윈도우를 사용할수 없다. 

 WS_TABSTOP

 대화상자에서 탭 키를 눌렀을때, 입력 포커스를 사용할수 있다. 

 WS_GROUP

 대화 상자에서 컨트롤을 그룹화할때 지정한다. 

 WS_CLIPCHILDREN

 클라이언트 영역 내의 자식 윈오두가 있는 부분은 그릴 대상에서 제외한다. 

 WS_CLIPSIBLINGS

 같은 부모를 가진 자식 윈도우끼리 겹쳐진 부분은 그릴 대상에서 제외한다


- 확장 윈도우 스타일

 WS_EX_CLIENTEDGE  클라이언트 영역을 두드러져 보이게한다. 

 WS_EX_WINDOWEDGE

 윈도우 프레임을 입체적으로 보이게한다.

 WS_EX_OVERLAPPEDWINDOW

 WS_EX_CLIENTEDGE와 WS_EX_WINDOWEDGE를 조합한것이다.

 WS_EX_CONTEXTHELP

 콘텍스트 도움말 출력용 버튼을 제목표시줄에 추가한다. 

 WS_EX_DLGMODALFRAME

 입체적으로 보이는 대화상자용 프레임을 출력한다. 

 WS_EX_TOOLWINDOW

 작은 제목 표시줄을 사용하는 플로팅 툴바용 윈도우


3. 부모 윈도우는 자식 윈도우의 디스플레이

 윈도우 스타일에 WS_CHILD를 지정하거나 CreateWindow의 인자인 hWndParent에 부모 윈도우의 핸들을 지정하면 자식 윈도우를 생성할수 있다.

자식 윈도우는 다른 윈도우와 달리 부모 윈도우의 클라이언트 영역의 바깥쪽에 출력하거나 이동할수 없는 특징이 있다. 부모 윈도우가 종료되면 자식 윈도우도 자동으로 종료되게 된다.


4. 윈도우 간 소유관계가 있다.

 부모와 자식 관계에서 파생된 개념인데, 자식 관계에 있는 윈도우는 부모 윈도우 밖으로 나올수 없다. 그러나 피소유 윈도우는 소유 윈도우 윈도우 바깥으로 나와서 출력될수 있다. 대표적인 예로 IE에서 Ctr + F를 눌렀을때 뜨는 대화상자라고 보면 되겠다. 소유 관계를 설정하고 싶다면, 피소유 윈도우를 생성할떄, CreateWindow AIP에서 WS_CHILD를 설정하지 않으면서 hWndParent에 소유 윈도우 핸들을 지정하면 된다.


(* 대략 아래와 같이 조금 다르다.)

  1. // Child Window
  2. hWndChild = CreateWindow("ClassName","Child",
  3.                         WS_CHILDWINDOW | WS_CAPTION | WS_VISIBLE,
  4.                         0,0,200,100,
  5.                         hWnd0, hInst, NULL);
  6.  
  7. // Owned Window
  8. hWndOwned = CreateWindow("ClassName","Owned",
  9.                         WS_POPUPWINDOW | WS_CAPTION | WS_VISIBLE,
  10.                         0,0,200,100,
  11.                         hWnd0, hInst, NULL);



* 참고자료 및 서적

API로 배우는 Windows 구조와 원리

C언어 윈도우즈 API 프로그래밍

 

* 링크 참조


윈도우(Windows) 애플리케이션(application)의 구조

윈도우 메시지(Message)