본문 바로가기

Study Memos/Windows Programming

Windows Class (Section 7)

참고> https://blog.naver.com/tipsware/221004018862

 

'Window Class'에 대하여~

: Win32 프로그래밍 관련 전체 목차http://blog.naver.com/tipsware/221059977193이 글은 C++ 언어의 cla...

blog.naver.com

 

1. Windows 운영체제는 멀티태스킹을 지원하기 때문에 중복된 데이터를 줄이기 위한 많은 고민을 하였다..!!

2. 코드 영역은 같은 프로그램이 여러 번 실행되었을 경우에도 모두 동일하다. 중복이므로 줄일 수 있다.
반면 전역 변수, 지역 변수, 힙에 저장되는 데이터등 실행 중에 수정 가능한 데이터는 줄일 수 없다.

3. 사용자가 서로 다른 프로그램들을 여러 개 띄우면 코드 영역도 모두 다르기 때문에 중복을 해결하기 위한 다른 방법이 필요하다.
    그래서 Windows 운영체제는 중복의 단위를 프로그램이 아닌 Window로 줄여서 좀 더 많은 중복을 해결하는 방법을 선택하였다.
===> Windows 운영체제에서 실행되는 프로그램은 Window 단위로 작업을 처리한다.
그리고 Window는 메시지를 주고받는 형태로 작업을 진행하기 때문에 Window Procedure를 정의해서 작업한다.

4. Window Procedure: 어떤 메시지가 Window에 발생한 경우 그 메시지를 어떻게 처리할 것인지를 정의한 함수

5. "서로 다른 프로그램에서 동일한 작업을 하는 Window가 있다면 그 Window를 위한 Window Procedure는 중복될 수 있다" 가 
Windows 운영체제에서 중복을 해결하기 위한 핵심 !!
===> 그래서 Windows 운영체제는 프로그램 단위가 아닌 Window 단위로 '실행 명령어' 중복을 줄일 수 있는 방법(Window Procedure를 공유하는 개념)을
만들었는데 이것이 'Window Class' 이다.

6. Window Class 개념은 Window가 사용하는 Window Procedure를 공유하기 위해서 만들어졌지만,
실제 Window Class를 구성하는 정보를 살펴보면 Window Procedure외에도 다양한 정보가 추가되어 있다.
===> Background Brush(배경을 채우는 색상과 속성), Cursor, Menu와 같은 기본적인 사항들은 Window 생성 시에 반드시 필요하기 때문에
이를 초기화하는 작업도 모두 중복 작업이다.

7. Window Class는 WNDCLASS 구조체로 관리되며 이 구조체는 'WinUser.h' 헤더파일에 정의되어 있다.

8. Window를 새로 생성할 때 이미 등록된 Window Class 이름과 동일하게 만들면 
기존에 만들어진 Window Procedure와 각종 초깃값을 같이 사용하기 때문에 이름을 중복되지 않게 짓는 게 좋다.
===> Window Class 이름은 대소문자를 구분하지 않기 때문에 주의해야 함

9. Window Class에 Window Procedure 함수의 주소를 저장하려면 해당 함수를 WNDPROC 형식으로 선언해야 한다.
이때 사용하는 파라미터가 lpfnWndProc.

10. hbrBackground(Background Brush) : Window 배경(클라이언트 영역 전체)을 그릴 때 사용할 'Brush Object(GDI에서 영역을 채울 때 사용하는 속성)'에 대한 핸들 값을 저장한다.
===> Windows 운영체제에서는 Window의 배경이 다시 그려져야 하는 경우(다른 Window 뒤에 가려졌다가 다시 보이는 경우) 운영체제는 해당 Window에게 WM_ERASEBKGND 메시지를 보내준다.
보통 사용자가 Window Procedure를 지정하지 않기 때문에 DefWindowProc 함수가 호출된다. DefWindowProc은 Window의 클라이언트 영역을 채우는 데 'Brush Object'를 사용하므로
이 항목에 제대로 핸들 값을 적지 않거나 NULL을 저장하게 되면 Window의 배경이 그려지지 않거나 이상한 형태로 색이 채워지기 때문에 주의가 필요하다.
===> CreateSolidBrush함수를 사용하면 자신만의 특별한 색상을 사용할 수 있지만, 이 경우 Window Class에 전달된 Brush Object를 운영체제가 관리해주지 않기 때문에 주의가 필요하다.
무턱대고 Brush Object를 지워버리면 Window의 배경이 사라져버리는 참사가 발생할 수도 있음..

11. 평범한 색상을 사용하고 싶다면 GetStockObject함수만으로도 충분하다. 이는 운영체제가 기본적으로 제공하는 'Brush Object'를 사용하므로 핸들 값이 운영체제에 의해서 계속 관리된다.
     즉, 프로그래머가 특별하게 관리할 필요가 없다.

12. 함수 호출 외에도 COLOR_WINDOW 라는 상숫값을 이용해 색상을 사용할 수도 있다. GetStockObject와 함께 많이 쓰이는 방법.

13. Class Style: 이 항목에는 Window의 그리기 특성과 관련된 정보를 설정하거나 몇 가지 사용자 환경을 추가하거나 제한하는 값을 저장합니다. 
===> 예를 들어, Window의 영역 일부가 커지거나 Window를 이동하다가 영역의 일부를 다시 그려야 할 때 그 부분만 다시 그릴 것인지 아니면 영역 전체를 다시 그릴지를 지정할 수 있다.
또 마우스 더블 클릭을 허용할 것인지, Window 닫기 메뉴를 비활성화 할 것인지 등도 설정할 수 있다.
===> 비트 OR 연산자를 사용하여 옵션을 지정한다.

14. cbClsExtra, cbWndExtra는 거의 안 쓰이므로 0으로 보통 할당한다.

15. RegisterClass: Window Class 정보를 다 구성하고 나면 RegisterClass함수를 사용하여 운영체제에 등록한다.

16. Window Class를 사용할 때에는 CreateWindow함수를 호출할 때 본인이 만든 Window Class의 이름을 넣으면 된다. 
===> 꼭 본인이 만든 Window Class 이외에도 운영체제에 다른 사람이 등록했거나 운영체제가 제공하는 Window Class도 물론 사용이 가능하다.
운영체제에서 만들어 준 대표적인 Window Class들이 "Button", "ComboBox", "Edit", "ListBox", "MDIClient", "ScrollBar", "Static" 등이다.
===> 컨트롤 외에도 특수한 목적으로 만들어진 Window Class도 있는데 "ComboLBox(드롭 다운 콤보 박스에 출력되는 리스트 박스)", "#32768(메뉴)",
"#32769(Desktop Window)", "#32770(Dialog)", "#32771(Task Switch Window)" 이다.

반응형

'Study Memos > Windows Programming' 카테고리의 다른 글

Bitmap (Section 13)  (0) 2020.08.27
Windows Message (Section 8)  (0) 2020.08.26
Windows Event (Section 6)  (0) 2020.08.24
HInstance (Section 5)  (0) 2020.08.24
Windows Handle (Section 3)  (0) 2020.08.24