2009년 11월 6일 금요일

윈도우 함수 정리

[윈도우 관련 함수]

1. 생성 및 파괴
BOOL DestroyWindow(HWND hWnd);
-> 윈도우를 파괴


BOOL CloseWindow(HWND hWnd);
-> 윈도우를 단순히 최소화 ShowWindow(hWnd,SW_MINIMIZE)와 기능적으로 동일

 

 

2. 위치와 크기
▷ 윈도우의 좌표 구하기
BOOL GetWindowRect(HWND hWnd,LPRECT lpRect);
-> 대상 윈도우의 좌표를 구해 RECT 구조체에 채워 리턴.
   윈도우의 좌표이므로 리턴 값은 항상 화면 좌표 기준이다.


BOOL GetClientRect(HWND hWnd,LPRECT lpRect);
-> 대상 윈도우의 작업영역 좌표를 구한다.


* GetWindowRect는 윈도우의 위치와 좌표를 구하는 함수
  GetClientRect는 작업영역의 크기를 구하는 함수
 


MoveWindow
BOOL MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint);
- 1st 인자: 이동 대상이 되는 윈도우의 핸들
- 2nd ,3rd, 4th ,5th 인자: 최상위 윈도우일 경우는 화면 좌표이며
                           차일드윈도우일 경우 부모윈도우의 작업영역 내에서의 좌표
- 6th 인자: 이동 후에 윈도우를 다시 그릴 것인가를 지정

 

LTRB방식
좌표지정이   직관적
RECT구조체, Ellipse,Recangle함수
XYWH방식
동일한   크기를 가지는 영역을 여러개 지정할때 편리
CreateWindow,BitBlt함수

 


SetWindowPos
BOOL SetWindowPos(HWND, hWnd, HWND, hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags);
-> hWnd는 대상 윈도우 핸들, hWndInsertAfter 이윈도우를 어느 윈도우 다음에 배치할 겻인가를 지정하는 윈도우 핸들(윈도우 Z순서 변경가능)

 

 

DeferWindPos
HDWP BeginDeferWindowPos(int nNumWindows);
-> 복수 윈도우의 크기와 위치를 저장하기 위한 메모리 할당, 사용자가 직접조작X

HDWP DeferWindowPos(HDWP hWinPosInfo, HWND hWnd, HWND hWndInsertAfter,
                                                   int x, int y, int cx, int cy, UINT uFlags);
-> 윈도우들의 배치 상태를 배열에 기록,

BOOL EndDeferWindowPos(HDWP hWinPosInfo);
-> 만들어진 정보대로 윈도우를 일괄 재배치한다. 이동, 크기 조정이 화면을 한번 갱신하는 동안 완료(속도가 빠르고 이동 화면이 안 보여 깔끔)

 

WindowPlacement
BOOL GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT *lpwndpl);
BOOL SetWindowPlacement(HWND hWnd, CONST WINDOWPLACEMENT *lpwndpl);
->  윈도우의 위치, 크기, 최대, 최소화 상태를 조사 및 변경할 수 있는 함수
화면 좌표와 작업영역 좌표

BOOL ScreenToClient(HWND hWnd, LPPOINT lpPoint);
-> 화면의 원점을 기준으로 하는 좌표 lpPoint를 hWnd의 작업 영역을 기준으로 하는 좌표로 변환, hWnd윈도우의 작업 영역 원점의 화면 좌표가 cx, cy일 때 lpPoint는 lpPoint.x - cx, lpPoint - cy로 변환되고 화면 좌표를 리턴하는 함수로부터 작업 영역의 좌표로 변환하고자 할 때 사용한다.
(lpPoint : 변환 대상 좌표이며 논리 단위가 아닌 장치 단위(픽셀))

 

BOOL ClientToScreen(HWND hWnd, LPPOINT lpPoint);
-> hWnd의 작업 영역 원점을 기준으로 하는 좌표 lpPoint를 전체 화면을 기준으로 하는 좌표로 변환, hWnd윈도우의 작업 영역 원점의 화면 좌표가 cx, cy일 때 lpPoint는 lpPoint.x + cx, lpPoint + cy로 변환되고 작업 영역의 좌표를 받아 화면 좌표를 요구하는 함수로 좌표를 전달하기 위해 이 함수를 사용한다.

 

int MapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UINT cPoints);
-> 특정 윈도우를 기준으로 한 좌표들을 다른 윈도우를 기준으로 한 좌표로 변환, 여러 개 좌표를 한번에 변환 가능하기에 RECT 구조체도 POINT *로 캐스팅해서 넘기면 한번에 변환할 수 있음.
리턴 값은 두 윈도우 간의 좌표 차이를 리턴, 하위 워드에 수평으로 더해진 값, 상위 워드엔 수직으로 더해진 값이 리턴 된다.

 

void MoveToParent(HWND hWnd);
-> 크기는 그대로 유지한 채 부모 윈도우의 가운데로 이동 시켜야 한다. 보통 대화상자가 초기화 되는 시점인 WM_INITDIALOG에서 이 함수를 호출할 것이고 부모 윈도우가 최소화 되어 있다면 먼저 부모 윈도우를 먼저 복구한 이후에 화면 중앙으로 이동해야 한다.

 

 

3. 작업영역 크기 설정
BOOL AdjustWindowRect(LPRECT lpRect, DWORD dwStyle, BOOL bMenu);
BOOL AdjustWindowRectEx(LPRECT lpRect, DWORD dwStyle, BOOL bMenu, DWORD dwExStyle);
-> 원하는 작업영역의 크기를 주면 작업영역 크기에 맞는 윈도우 크기를 계산한다.
lpRect에 작업영역 크기를 주고 dwStyle에 윈도우 스타일, bMenu에 메뉴의 존재 여부를 전달한다.
AdjustWindowRectEX는 AdjustWindowRect와 동일한 일을 하며 전달 받은 스타일값과 메뉴 존재 여부를 참고하여 원하는 작업영역 크기에 맞는 윈도우 크기를 계산하여 첫 번째 인수인 lpRect에 다시 대입한다.

 

 

4. 상태 조사 및 변경
윈도우의 타이틀 바에 나타나는 캡션 문자열은 최초 CreateWindow 함수에 의해 윈도우가 만들어 질때 지정되며 실행중에는 다음 함수를 사용하여 조사하거나 변경한다.

int GetWindowText( HWND hWnd, LPTSTR lpString, int nMaxCount);
-> 윈도우의 캡션을 조사한다. 윈도우 핸들이 무효한 경우 0을 리턴한다. 성공한 경우 조사된 캡션의 길이를 리턴하되 널 종료 문자는 제외된다.

- hWnd:윈도우 또는 컨트롤의 핸들
- lpString:캡션을 리턴받을 버퍼
- nMaxCount:버퍼의 크기

BOOL SetWindowText(HWND hWnd, LPCTSTR lpString);
-> 윈도우나 컨트롤의 캡션을 설정한다. 윈도우의 캡션은 타이틀 바에 나타나며 컨트롤의 캡션은 작업 영역에 나타난다.

- hWnd:윈도우 또는 컨트롤의 핸들
- lpString:새로 설정할 캡션 문자열

int GetWindowTextLength(HWND hWnd);
-> 에디트는 굉장히 긴 문자열을 가질 수도 있으므로 GetWindowTextLength함수로 길이를 먼저 조사하여 충분한 메모리를 할당한후 텍스트를 읽어야 한다.

 

윈도우의 현재 상태를 조사하는 함수
BOOL lsWindow(HWND hWnd);
-> 인수로 주어진 hWnd가 유효한 윈도우 핸들인지 조사한다. 이 윈도우가 존재하는지, 생성되어 있는지 검사하고자 할 때 이 함수를 사용한다. CreateDialog의 예제를 보면 모델리스 대화상자의 존재 여부를 조사할 때 이 함수를 사용하는 코드를 볼 수 있다.
핸들이 유효하면 TRUE를 리턴하며 그렇지 않으면 FALSE를 리턴한다.

- hWnd : 검사할 윈도우의 핸들

BOOL lsWindowVisible(HWND hWnd);
->윈도우가 보이는 상태인지 숨겨진 상태인지를 조사한다. 윈도우가 화면에 보이려면 WS_VISIBLE 스타일을 가지고 있어야 하며 또한 부모 윈도우가 WS_VISIBLE 스타일을 가지고 있어야 한다. 보인다는 뜻은 이 스타일이 설정되어 있다는 뜻일 뿐 실제로 화면에 나타나 있다는 뜻은 아니다. 이 함수가 TRUE를 리턴하더라도 다른 윈도우에 완전히 가려져 있을 경우 화면에 보이지 않을 수도 있으며 폭이나 높이가 0일 경우도 이 함수는 TRUE를 리턴하지만 화면에서는 숨겨져 있을 수 있다. 이 함수는 다만 윈도우의 WS_VISIBLE 스타일이 설정되어 있는지만을 검사할 뿐이다.
윈도우가 보이는 상태이면 0이 아닌 값을 리턴하며 그렇지 않으면 0을 리턴한다.

-  hWnd : 상태를 조사할 윈도우의 핸들

BOOL lsWindowEnabled(HWND hWnd);
->hWnd 윈도우가 사용 가능한 상태인지 조사한다. 사용 가능한 윈도우만 사용자로부터 입력을 받아들일 수 있다. 그러나 사용 금지된 윈도우도 내부적인 메시지는 처리한다. 버튼, 에디트 등의 컨트롤이 입력을 받을 수 있는 상태인지를 조사할 때 이 함수가 사용된다.
윈도우가 사용 가능한 상태이면 0이 아닌 값을 리턴하며 그렇지 않으면 0을 리턴한다.
 

-  hWnd : 상태를 조사할 윈도우의 핸들

BOOL lsChild(HWND hWndParent, HWND hWnd);
->윈도우가 차일드 윈도우 인지 조사한다

 

BOOL lslconic(HWND hWnd);
->hWnd 윈도우가 최소화 상태, 즉 아이콘 상태인지를 조사한다. 최소화된 상태에서는 특별한 다른 처리를 하고자 할 때 이 함수로 윈도우의 현재 상태를 조사할 수 있다. 예를 들어 최소화 상태일 때 아이콘을 직접 그리고 싶으면 WM_PAINT에서 이 함수를 호출하여 현재 상태를 조사하고 작업 영역 대신 아이콘으로 출력을 내보낸다.
윈도우가 최소화되어 있으면 0이 아닌 값을 리턴하며 그렇지 않으면 0을 리턴한다.

- hWnd : 최소화 상태를 조사할 윈도우의 핸들

BOOL lsZoomed(HWND hWnd);
->hWnd 윈도우가 최대화되어 있는 상태인지를 조사한다. 최대화된 상태에서는 특별한 다른 처리를 하고자 할 때 이 함수로 윈도우의 현재 상태를 조사할 수 있다.
윈도우가 최대화되어 있으면 0이 아닌 값을 리턴하며 그렇지 않으면 0을 리턴한다.

- hWnd : 최대화 상태를 조사할 윈도우의 핸들

상태를 변경하는 함수
BOOL EnableWindow(HWND hWnd, BOOL bEnable);
->윈도우를 사용 금지하거나 허가한다.

- hWnd : 윈도우의 핸들
- BOOL bEnable : True면 사용가능, False면 사용불가능

BOOL ShowWindow(hWND hWnd, int nCmdShow);
->윈도우의 보이기 상태를 지정한다. 보이기 상태(show state)란 보이기/숨기기는 물론이고 최대화/최소화/복구 상태 등 윈도우의 현재 상태를 통칭하는 용어이며 nCmdShow 인수가 지정하는 여러 가지 보이기 상태 중 하나를 선택할 수 있다.
단, 이 함수가 처음 호출될 때는 반드시 WinMain의 인수로 전달된 nCmdShow를 그대로 넘겨 주는 것이 좋다. 쉘은 프로그램을 실행할 때 사용자가 지정해 놓은 등록 정보를 WinMain으로 전달해 주는데 이 설정 상태대로 보여야 하기 때문이다. 만약 이 프로그램이 STARTUPINFO 구조체의 정보대로 생성되었다면 첫번째 ShowWindow 호출에서 nCmdShow 인수 지정은 무시되며 이 구조체가 지정하는 보이기 상태가 적용된다. 두번째 호출부터는 원하는 보이기 상태로 변경할 수 있다.
윈도우가 이전에 보이는 상태였으면 0이 아닌 값을 리턴하며 보이지 않는 상태였으면 0을 리턴한다.
- hWnd : 대상 윈도우 핸들
- nCmdShow : 지정하고자 하는 보이기 상태이며 다음 값중 하나를 지정한다.

 

 

5. Z순서 변경
BOOL SetForegroundWindow(HWND hWnd);
-> 이 윈도우가 속한 스레드를 포그라운드 상태로 만들고 메인 윈도우를 활성화 시킴
   단, 자신이 포그라운드이거나 포그라운드 프로세서가 없을 때 또는 핫키 등의 입력
   메시지를 받았을 때만 다른 스레드를 포그라운드로 만들 수 있다.
   ( 포그라운드: 사용자가 사용하고 있는 상태 )

HWND GetForegroundWindow(void);
-> 현재 사용자가 사용하고 있는 포그라운드 윈도우를 찾아 그 Handle 값을 리턴한다.

 

HWND SetActiveWindow(HWND hWnd);
-> 활성 윈도우를 변경. 단, 같은 스레드 내의 윈도우에 대해서만 동작.
   윈도우가 포그라운드 일 때만 변경 가능.

HWND GetActiveWindow(void);
-> 활성화된 윈도우의 Handle 값을 리턴

 

 

6. 윈도우찾기
HWND FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName);
-> 최상위 윈도우 중에 조건에 맞는 윈도우를 검색.
   윈도우 클래스 이름과 캡션을 조건으로 지정(인수)
   조건에 맞는 윈도우를 찾으면 Handle을 리턴, 찾지 못할 경우 NULL
   지정 조건이 단순하여 정확하게 검색하기 곤란함.
   검색조건인 클래스명과 캡션명을 전달하는데 부분 문자열 검색이 안되는 것과
   클래스명이 중복될 수 있다는 한계가 있음.

HWND FindWindowEx(HWND hwndParent, HWND hwndChildAfter, LPCTSTR lpszClass, LPCTSTR lpszWindow);
-> FindWindow함수의 확장형태. hwndParent 윈도우에 속한 차일드 윈도우를 검색
   인수 hwndChildAfter는 검색을 시작할 차일드 윈도우를 지정하는데
   이 차일드의 z 순서 다음 차일드부터 검색됨.

 

HWND WindowFromPoint(POINT Point);
-> Point 화면 좌표 아래에 있는 윈도우를 조사해서 그 핸들을 리턴한다.
   단 사용금지된 윈도우는 검색 대상에서 제외.
   Point 위치에 스태틱 컨트롤이 있는 경우는 그 아래의 윈도우가 조사된다.
   이 함수는 스파이같이 다른 윈도우의 조사할 때 등 여러 모로 쓸모가 많다.

 

HWND ChildWindowFromPoint(HWND hWndParent, POINT Point);
-> 부모 윈도우 내의 좌표로 차일드 윈도우 검색.
   Point 좌표는 hWndParent 부모 윈도우의 작업영역 좌표이다.
   Point 가 작업영역의 범위를 벗어나면 이 함수는 NULL 을 리턴하며
   차일드 윈도우 위가 아니라면 부모 윈도우 자신의 핸들을 리턴한다.
   숨겨진 윈도우와 사용금지된 윈도우까지도 검색함.

 

HWND ChildWindowFromPointEx(HWND hWndParent, POINT Pt, UINT uFlags);
-> uFlags에 검색 제외 조건을 지정함으로써 특정 조건의 차일드를 검색에서 제외


 

7. 윈도우 열거
BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam);
-> 존재하는 모든 윈도우를 열거.
   현재 실행중인 모든 최상위 윈도우들을 열거하여 첫 번째 인수로 지정된 콜백함수 호출
   lParam은 콜백함수로 전달될 사용자 정의 데이터 (필요없을 경우 NULL지정)
   모든 최상위 윈도우를 검색해서 그 핸들을 콜백함수로 전달.
   단, 모든 윈도우를 다 찾거나 콜백함수가 FALSE 를 리턴할때까지 검색을 계속한다.
   차일드 윈도우는 검색에서 제외된다.
   단, 시스템이 생성한 일부 최상위 윈도우는 WS_CHILD 스타일을 가지고 있더라도 검색에
   포함된다.

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam);
-> EnumWindows로부터 검색된 윈도우의 핸들을 전달받으므로 모든 윈도우에 대해 모든 작업을 다 할 수 있다. 원하는 윈도우를 찾기 위해 캡션 문자열을 부분 검색할 수도 있고 좌
표를 비교하거나 스타일을 조사하는 것도 가능하다.

 

BOOL EnumChildWindows(HWND hWndParant,WNDENUMPROC lpEnumFunc,LPARAM lParam); 
-> 특정 윈도우의 Child만 검색  (EnumWindows 유사.)

 

BOOL EnumThreadWindow(DWORD dwThreadId,WNDENUMPROC lpfn,LPARAM lParam);
-> Thread에 속한 윈도우 목록을 조사. (EnumWindows 유사.)

 

 

[특수한 윈도우]

1. 윈도우 리전
SetWindowRgn(HWND hWnd,HRGN hRgn,BOOL bRedraw);
-> 윈도우 리전 (직사각형이 아닌 모양의 윈도우를 만들데 사용)
   - 2nd 인자: 윈도우 리전으로 설정.
   - 3rd 인자: 윈도우 리전 설정한 후 윈도우를 다시 그릴 것인가 아닌가를 지정.
          TRUE:다시 그린다.

2. 반투명한 윈도우
SetLayeredWindowAttributes(HWND hwnd,COLORREF crKey,BYTE bAlpha,DWORD dwFlags);
-> 레이어드 윈도우(리전보다 훨신 더 복잡한 모양) 투명 및 반투명 속성을 설정.
   - 1st 인자: 설정 대상 윈도우의 핸들.
   - 2nd 인자: 투명으로 처리할 색상을 지정.
   - 3rd 인자: 윈도우 전체의 반투명 정도 지정.
               0 : 완전 투명 255: 불투명 128: 반투명
   - 4th 인자: 두 효과중 어떤 효과를 적용할 것인가를 지정.
               Ex) LWA_COLORKEY:투명 색상 지정. 
                   LWA_ALPHA:반투명 정도를 지정 (동시 사용가능)
 

3. 윈도우 애니메이션
BOOL AnimateWindow(HWND hwnd,DWORD dwTime,DWORD dwFlags);
-> 윈도우 애니메이션 (메뉴가 슬라이딩 되거나 점점 또렷해지는 효과)
   - 1st 인자: 대상 윈도우 핸들.
   - 2nd 인자: 애니메이션 진행 시간 지정.
   - 3rd 인자: 애니메이션 종류와 방식을 지정.
               Ex)슬라이딩 방식(AW_SLIDE), 블렌딩 방식(AW_BLEND),
                  중앙에서 열리는 방식(AW_CENTER)

댓글 없음:

댓글 쓰기