BLOG main image
LoofBackER's Blog
Jun - Sik , Yang Blog

'Windows concept'에 해당되는 글 2건

  1. 2006.12.12 윈도우 생성 보고서
  2. 2006.11.29 윈도우 움직임 관찰 보고서 (1)

윈도우 생성 보고서

분류없음 2006.12.12 20:03 by LoofBackER

윈도우 프로그래밍을 할때 윈도우를 생성 하는 루틴을 설명 해 드리겠습니다.
먼저 WinMain 에서 HWND  를 선언 하고 WNDCLASS 를 선언 합니다.
HWND는 윈도우 핸들을 선언 하는것입니다. HWND  라는 구조체가 있는데 여기의  멤버를 채워놓고 윈도우의 정보를 저장 합니다.
WNDCLASS는 윈도우 클래스를 선언 하는것입니다.
윈도우 클래스라는 구조체와 윈도우 핸들이라는 구조체 두개가 있습니다.
이 두개가 왜 있어야만 하냐면 윈도우 개발자 측면을 강조 하기 위해 만들어 진것 같습니다.

WinMain()이라는 메인 즉 첫 진입 함수 에서는 WndClass의 여러가지 구조체 멤버에게 값을 지정 해줍니다.
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
WndClass.hInstance=hInstance;
WndClass.lpfnWndProc=(WNDPROC)WndProc;
WndClass.lpszClassName=lpszClass;
WndClass.lpszMenuName=NULL;
WndClass.style=CS_HREDRAW | CS_VREDRAW;
이런식으로 백그라운드 색깔이나 커서 아이콘 인스턴스 콜백 함수 포인터 주소
클래스 이름 스타일 등등 의 멤버의 값을 넣고
RegisterClass()함수를 이용해서 클래스를 등록 합니다.
이때 RegisterClass()함수는 내부적으로 지금까지 등록 되어 있는 윈도우 들의 링크들 즉 링크드 리스트와 같이 클래스를 연결 시켜 놓은 링크를 따라 여러 윈도우 클래스를 검색 하면서 지금 등록 하려는 윈도우 클래스와 같은것이 있는지 검사 하고 없으면 등록을 합니다.
여기서 RegisterClass()에서 등록을 못하게 되면 윈도우는 생성이 되지 않습니다.
왜냐면 CreateWindow()함수에서는 RegisterClass()에서 등록을 한 윈도우 클래스만 윈도우 핸들로서 윈도우를 만들어 주기 때문입니다.
CreateWindow()함수의 인자는 CreateWindow(lpszClassName, lpszWindowName, dwStyle, x, y, nWidth, nHeight, hwndParent, hmenu, hinst, lpvParam) 이렇게 많습니다.
이런것들을 인자로 받은 CreateWindow()함수는 내부적으로 HWND 구조체의 멤버에 값을 넣겠죠.
이때 RegisterClass()에서 등록을 실패 했으면 윈도우는 생성 되지 않습니다.
핸들을 리턴 하지 않는 것이죠..
이때 WM_CREATE 메시지는 CreateWindow()함수가 발생을 시킵니다.
CreateWindow()함수가 리턴을 하게 되면 이제 윈도우의 생성 준비는 이미 마친것입니다.
윈도우는 등록 되었고 모든 설정값은 저장 되었습니다.
이제 ShowWindow()라는 함수가 호출 됨으로서 윈도우가 화면상에 나오게 됩니다.
이제 어떠한 사용자의 동작에 따라 메시지 햔들러에게 메시지를 보내는 그런 동작을 할 준비가 끝나고 이미 윈도우는 화면상에 나타난것입니다.

신고
크리에이티브 커먼즈 라이선스
Creative Commons License

윈도우 움직임 관찰 보고서

분류없음 2006.11.29 19:53 by LoofBackER


윈도우 움직임 관찰 보고서

회사 다닐때 사수로 부터 레포트를 써오라는 명령으로 쓴 보고서 너무 대충 쓴거 같지만 이때는 이런거 하면서 많은 공부를 했다. 책도 보지 않고 그냥 모두 다 내 생각만 쓴건데 맞는건지 모르겠다.
김상형 선생님책 보니까 아주 잘 정리 되어 있네 ㅋㅋㅋ
작년 글 보니 아주 잠깐 그때 향수가 ...ㅋㅋ



윈도우가 사용자나 코드의 부름을 받고 크기가 바뀌었을 때 어떤 내부적인 메시지가 불리는지에 대해서 알아보고자 한다.

WM_SIZE

WM_SIZING

WM_WINDOWPOSCHANGED

WM_WINDOWPOSCHANGING

WM_MOVE

WM_MOVING

먼저 WM_SIZE 메시지가 불릴 때 즉 윈도우의 사이즈가 바뀌었을 때 framework가 이 메시지를 호출 한다.

Window Message 동작 구현부의 원형은 다음과 같다.

afx_msg void OnSize(

  UINT nType,

  int cx,

  int cy

);

파라미터를 보면

먼저 nType 에 들어가는 것은

#define SIZE_RESTORED       0

#define SIZE_MINIMIZED      1

#define SIZE_MAXIMIZED      2

#define SIZE_MAXSHOW       3

#define SIZE_MAXHIDE        4

WINUSER.H 에 이렇게 정의 되어 있다.

DEFINE문 의 이름만 보면 무엇인지는 알 것 이므로 그냥 넘어가기로 한다.

그 다음은 cx 새로운 클라이언트 x 영역이다.

그 다음은 cy 새로운 클라이언트 y 영역이다.

이 메시지 함수는 윈도우의 크기가 바뀌고 난 후에 호출 된다.

WM_SIZING 메시지가 불릴 때 즉 윈도우의 사이즈가 바뀌는 중에 framework는 이 함수를 부른다.

원형은 다음과 같으며

afx_msg void OnSizing(

  UINT nSide,

  LPRECT lpRect

);

이 함수는 윈도우의 사이즈가 바뀌는 중에 불리는 함수 이다.

파라미터는 먼저 nSide : 윈도우의 어떤 영역이 리사이징 되는가?

nSide의 종류는 WINUSER.H에 보면

#define WMSZ_LEFT              1

#define WMSZ_RIGHT             2

#define WMSZ_TOP               3

#define WMSZ_TOPLEFT          4

#define WMSZ_TOPRIGHT         5

#define WMSZ_BOTTOM        6

#define WMSZ_BOTTOMLEFT   7

#define WMSZ_BOTTOMRIGHT  8

이렇게 정의 되어 있다.

lpRect : CRect RECT structure를 받아 온다.

이 함수를 가지고 윈도우의 크기를 제어 할 수 있다.

사용자가 윈도우 크기를 어떻게 바꾸더라도 어디로 이동 시키더라도 이 함수에서 리싸이징이 될 때 제어를 한다면 윈도우 포지셔닝을 잘 제어 할 수 있다.

WM_WINDOWPOSCHANGING 메시지가 불릴 때 즉 윈도우의 위치 크기 Z-order가 바뀌고 있을 때 framework는 이 함수를 부른다.

원형은 다음과 같다.

afx_msg void OnWindowPosChanging(

  WINDOWPOS* lpwndpos

);

Parameters는 다음과 같다.

lpwndpos WINDOWPOS라는 구조체이며 WINUSERS.H에 정의 되어 있다.

typedef struct tagWINDOWPOS {

   HWND    hwnd;

   HWND    hwndInsertAfter;

   int     x;

   int     y;

   int     cx;

   int     cy;

   UINT    flags;

} WINDOWPOS, *LPWINDOWPOS, *PWINDOWPOS;

새로운 윈도우의 핸들 x y cx cy 가 들어가있는 구조체 이다.

WM_WINDOWPOSCHANGINGED 메시지가 불릴 때 즉 윈도우의 위치 크기 Z-order가 바뀌고 난 후에 framework는 이 함수를 부른다.

afx_msg void OnWindowPosChanged(

  WINDOWPOS* lpwndpos

);

파라미터는 위 함수와 같다.

이 메시지는 윈도우가 바뀌고 난 후에 불리므로 자석 효과 같은 것을 구현 할 때 쓰이면 될 것 이다.

마우스로 끌 때 윈도우 내용 표시 하기 속성이 표시 되어 있으면

OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)

OnSizing(UINT nSide, LPRECT lpRect)

OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)

OnSize(UINT nType, int cx, int cy)

OnWindowPosChanged(WINDOWPOS FAR* lpwndpos)

OnSizing(UINT nSide, LPRECT lpRect)

OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)

이런 순서로 불리고

그렇지 않으면

OnSizing(UINT nSide, LPRECT lpRect)

마우스가 움직일 때 if(nFlags & MK_LBUTTON) 이 조건을 만족 할 때 회색의 껍데기 윈도우가 만들어진다. 이때 발생하는 OnSizing 이때 WM_LBUTTONUP 발생 하면

진짜 윈도우의 크기가 바뀌면서 불린다. 그 순간의 사이즈로 진짜 윈도우가 바뀌면서

OnSizing이 불리고 OnWindowPosChanging가 불린다.

OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)

OnSize(UINT nType, int cx, int cy) 이제 윈도우가 바뀌었으므로 OnSize가 불린다.

OnWindowPosChanged(WINDOWPOS FAR* lpwndpos)

이런 순서로 불린다.

여기서 두 가지 차이점을 볼 수 있다. ING ED가 있다.

ING는 바뀌는 중에 불리는 함수이다. 그러므로 아직 바뀌지 않은 것이다. 바뀌지도 않았는데 내 멋대로 그 윈도우를 바꿔 버리면 어떻게 될까?

정상적이지 않는 동작을 한다. 그 정상적이지 않은 동작을 원한다면야 상관 없을 것이다.

윈도우가 바뀔 때 발생하는 메시지를 잘 생각 해보면 윈도우의 위치나 크기 조정을 잘 할 수 있을 것이다. 운영체제가 제공하는 윈도우를 드래깅해서 윈도우를 움직이는 행위나 윈도우의 주변 픽셀을 잡아서 리사이징 하는 행위나 Minimize Maximize 등등 여러가지 일들을 직접 구현 한다면 윈도우가 어떻게 움직이는지는 알 수 있을 것이다.

그런 동작을 구현 하기 위해서는 위의 6가지 메시지를 잘 연구해 보고 윈도우 메시지 즉 WM_가 있는 메시지를 정복 한다면 윈도우에 대해서는 자신감이 붙을 것이다.

후에 세부적인 콘트롤 메시지도 정복 하면 WIN32 API를 내 것으로 만들 수 있을 것이다.

신고
크리에이티브 커먼즈 라이선스
Creative Commons License
1 

카테고리

분류 전체보기 (107)
::::::Dairy::::: (5)
:::::what?::::: (1)
:::::Computer::::: (5)
:::::Idea::::: (2)
:::::Want::::: (1)

달력

«   2017/08   »
    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 31    

티스토리 툴바