자료 저장소

# 작업영역 크기 설정

BOOL AdjustWindowRect(LPRECT lpRect,DWORD dwStyle,BOOL bMenu)
BOOL AdjustWindowRectEx(LPRECT lpRect,DWORD dwStyle,BOOL bMenu,DWORD dwExStyle)
원하는 작업영역의 크기를 전달하면 작업 영역에 크기에 맞는 윈도우 크기를 계산한다.
첫번째 인수 lpRect에 작업영역의 크기를 주고 dwStyle에 윈도우의 스타일을,
bMenu에 메뉴의 존재 여부를 전달한다.
확장스타일의 Ex함수는 확장 스타일을 지정하는 인수 외에는 하는일은 동일하다.



# 작업영역에 맞는 윈도우 크기 계산 래퍼 함수


void SetClientRect(HWND hWnd,int width,int height)
{
 RECT crt;
 DWORD Style,ExStyle;
 SetRect(&crt,0,0,width,height);
// 전달된 width와 height로 RECT 구조체에 값을 대입하여 사각영역을 정의
Style=GetWindowLong(hWnd,GWL_STYLE);
// 현재 윈도우의 속성 값 중에서 스타일 속성 값을 얻어와서 변수에 대입
 ExStyle=GetWindowLong(hWnd,GWL_EXSTYLE);
// 현재 윈도우의 속성 값 중에서 스타일 속성 값을 얻어와서 변수에 대입(확장일 경우)
 AdjustWindowRectEx(&crt,Style,GetMenu(hWnd) != NULL,ExStyle);
// crt 구조체로 위에서 정의한 구조체와 스타일, 메뉴 존재 여부, 확장 스타일 값을 전달하면
// 각각의 속성 값들을 참조하여 작업영역 크기에 맞는 윈도우 크기를 계산하여 다시 crt에 대입한다.
 if(Style & WS_VSCROLL) crt.right += GetSystemMetrics(SM_CXVSCROLL); 
 if(Style & WS_HSCROLL) crt.bottom += GetSystemMetrics(SM_CYVSCROLL);
// Style 속성 값 중에 VSCROLL(HSCROLL)이 존재한다면 스크롤바에 대한 계산은 직접 해야 한다.
 SetWindowPos(hWnd,NULL,0,0,crt.right-crt.left,crt.bottom-crt.top,SWP_NOMOVE | SWP_NOZORDER);
// 위에서 정의한 값으로 윈도우의 크기를 변경한다. 이때 윈도우의 위치와 Z순서는 변하지 않는다.
}


# 부모윈도우의 가운데로 차일드 윈도우 배치하기

void MoveToParentCenter(HWND hWnd)
{
 RECT wrt,crt;
HWND hParent;
hParent=GetParent(hWnd);
// 부모윈도우의 핸들을 얻어서 변수에 대입 
if(IsIconic(hParent)){
// 최소화 여부를 판단하여 TRUE일 경우 화면을 표시한다.
  ShowWindow(hParent,SW_RESTORE);
 }
 GetWindowRect(hParent,&wrt);
// hParent의 윈도우 작업영역을 얻는다.
 GetWindowRect(hWnd,&crt);
 // 전달된 윈도우 hWnd의 작업영역을 얻는다.
 SetWindowPos(hWnd,NULL,wrt.left+(wrt.right-wrt.left)/2-(crt.right-crt.left)/2,
  wrt.top+(wrt.bottom-wrt.top)/2-(crt.bottom-crt.top)/2,0,0,SWP_NOSIZE | SWP_NOZORDER);
 // 전달한 값으로 윈도우의 크기를 변경한다. 이때 윈도우의 사이즈와 Z순서는 변하지 않는다.
 // 만약 부모의 사각영역이 300,300 이고 전달된 차일드 윈도우의 크기가 100,100이라면
 // x = 0 + (300-0)/2 - (100-0)/2 , 
 // y = 0 + (300-0)/2 - (100-0)/2
 // 전체 부모 윈도우를 반으로 나누고 그 값에서 차일드 윈도우의 크기를 반으로 나눈값까지 뺀 위치부터
 // 그리기를 시작해야 차일드 윈도우가 정 중앙에 위치하게 된다.

}


# 상태 조사 및 변경 관련

int GetWindowText(HWND hWnd,LPWSTR lpString,int nMaxCount)
// 타이틀바의 문자열을 읽어들인다.
BOOL SetWindowText(HWND hWnd,LPCWSTR lpString)
// 타이틀바의 문자열을 변경시킨다.
int GetWindowTextLength(HWND hWnd)
// 윈도우 캡션의 길이를 조사한다.

※ Window가 포함된 함수는 모든 윈도우에 사용이 가능하다.(리스트박스,에디트,버튼,스태틱...)

BOOL IsWindow(HWND hWnd)// 윈도우가 존재하는가?
BOOL IsWindowVisible(HWND hWnd)// 윈도우가 보이는가?
BOOL IsWindowEnabled(HWND hWnd)// 윈도가 사용가능한가?
BOOL IsChild(HWND hWndParent,HWND hWnd)// 차일드 윈도우 인가?
BOOL IsIconic(HWND hWnd)// 최소화 상태인가?
BOOL IsZoomed(HWND hWnd)// 최대화 상태인가?


BOOL EnableWindow(HWND hWnd,BOOL bEnable)
// 윈도우를 사용 금지하거나 허가한다. 금지된 경우 마우스,키보드로 입력을 받지않는 상태가 된다.
BOOL ShowWindow(HWND hWnd,int nCmdShow)
// 윈도우를 숨기거나 보이거나 최대, 최소화 시키는 작업을 한다.

# Z순서 변경
화면상의 윈도우 끼리는 상호 겹칠 수 있는데 이때 수직적인 윈도우의 위치를 Z순서(Z Order)라고 한다.
X,Y축으로 구성된 2차원 화면 공간에서 화면에 수직인 사용자 시선쪽을 Z축으로 가정하여 Z축상의 위치를
칭하는 개념이다. 윈도우 끼리 겹쳐져 있을 때 위쪽에 있는 윈도우의 Z순서가 빠르다고 표현한다.


■ 포그라운드 : 사용자가 지금 이 프로그램을 사용하고 있는 상태라는 뜻이다. 한번에 하나의 프로그램만
포그라운드가 될 수 있다. 포그라운드 프로세스는 사용자를 직접 대면하고 있는 중이므로 다른 프로세스에
비해 우선 순위가 두 단계 더 높아서 CPU 시간을 더 많이 할당 받는다.

■ 백그라운드 : 실행중이기는 하지만 사용자가 당장 관심을 보이지 않는 프로세스이다. 지금 워드 작업을
하고 있다면 탐색기나 웹 브라우저 등은 백그라운드에서 실행 대기중이다. 포그라운드 프로세스보다 CPU
시간을 덜 받으며 포그라운드 프로세스가 시간을 양보해야만 자신의 코드를 처리 할 수 있다.


사용자가 직접 포그라운드의 상태를 변경하거나 조사하려면 아래 두가지 함수를 사용한다.

BOOL SetForegroundWindow(HWND hWnd)
현재 윈도우가 속한 스레드를 포그라운드 상태로 만들고 메인 윈도우를 활성화한다.
단, 아무나 이 함수를 호출할 수 있는 것은 아니며 자신이 포그라운드이거나 포그라운드 프로세스가
없을 때 또는 핫키 등의 입력 메시지를 받았을 때만 다른 스레드를 포그라운드로 만들 수 있다.
자신이 백그라운드에 있을 때는 이 함수로 프로그램 사이를 마음대로 스위칭할 수 없는데 왜냐하면
사용자의 허락없이 임의의 프로그램이 마음대로 활성화되어서는 안되기 때문이다.

HWND GetForegroundWindow(VOID)
포그라운드 상태를 조사한다.

BOOL BringWindowToTop(HWND hWnd)
지정한 윈도우를 Z순서의 제일 처음으로 이동시키는데 포그라운드 스레드가 호출할 때만 동작한다.

HWND SetActiveWindow(HWND hWnd)
활성 윈도우를 변경한다. 단, 같은 스레드내의 윈도우에 대해서만 동작하며 다른 스레드의
윈도우를 활성화 하지는 못한다.

HWND GetActiveWindow(VOID)
현재 활성화된 윈도우를 조사한다.

댓글 로드 중…

최근에 게시된 글