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

윈도우 움직임 관찰 보고서

분류없음 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를 내 것으로 만들 수 있을 것이다.

신고
1 ··· 81 82 83 84 85 86 87 88 89 ··· 107 

카테고리

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

달력

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

티스토리 툴바