1. 자석 윈도우??
사람의 손은 컴퓨터만큼 미세하지 않기 때문에, 마우스로 조작하는데 어느 정도 한계가 있습니다. 예를들면 마우스를 통해서 하나의 윈도우를 화면 끝에 위치시킨다고 해봅시다. 잘 숙련된 사람도 한번, 두번, 세번 해서 위치시키더라도 그 위치가 정확하게 화면의 끝인지 아닌지 조금 찜찜합니다. 물론 이런 경우는 잘 없지만, 종종 이런 것에 굉장히 민감한 분들이 계십니다. 특히, 처음 컴퓨터를 접하는 분들은 더더욱 그렇죠. 저도 예전 윈도우 3.1쓸때, 바둑판식 배열을 알기 전까지는 윈도우가 조금만 흐트러지면 서로의 간격을 맞추느라 정신이 없었던 적이 있었습니다.
이러한 불편을 해소할 수 있는 것이 자석윈도우입니다. 자석 윈도우란 좀 더 진보된 형태의 트래킹 시스템입니다. 아마도 그 등장은 제가 생각하기에 윈앰프가 시초가 아닌가 하는 생각이 듭니다. 당시로써는 굉장히 파격적인 스킨 기반의 UI에다가 화면 근처로 가면 자동으로 처얼-썩 하고는 달라붙습니다. 자신의 윈도우끼리도 일정 영역 근처에 가면 자동으로 도킹이 되어버리죠. 이러한 것들을 보통 자석 윈도우라고 부릅니다.
일반적인 사람들의 경우 흐르러져 있는 것보다는 질서 정연한 것을 좋아합니다. 따라서 이렇게 어느정도 사람이 인지할 만큼의 갭 안에서는 정확하게 맞춰주도록 하는 시스템이 환영받는지도 모르죠. 그럼 이런 좋은 시스템을 자신의 프로그램에 접목 시키는 방법을 한번 알아보도록 하겠습니다.
2. 구현하기
자석 윈도우 구현의 핵심은 WM_WINDOWPOSCHANGING 메시지 입니다. 이 메시지의 이름에서도 알 수 있듯이, WM_WINDOWPOSCHANGING 메시지가 포스트 되는 시점은 윈도우의 포지션이 변경될때 입니다. 정확하게는 윈도우의 크가, 포지션, z-order 등이 변경될때 이 메시지는 포스트 됩니다. 한마디로 사용자가 윈도우의 형태를 변경하게 되면 이 메시지가 발생한다고 생각하면 됩니다.
이 메시지의 경우 WPARAM은 사용하지 않으며, LPARAM으로는 WINDOWPOS 구조체의 포인터가 넘어옵니다. 그럼, 중요한 WINDOWPOS 구조체에 대해서 잠시 살펴보겠습니다.
typedef struct {
HWND hwnd; // 메시지 받은 윈도우 핸들
HWND hwndInsertAfter; // z-order상 앞쪽에 위치한 윈도우 핸들
int x; // x좌표
int y; // y좌표
int cx; // 가로 크기
int cy; // 세로 크기
UINT flags; // 플래그
} WINDOWPOS;
파라미터 이름이 너무나 직관적입니다. 설명은 주석을 참고하시면 됩니다. flags의 경우 SWP_SHOWWINDOW, SWP_HIDEWINDOW등의 플래그 값을 가지게 됩니다. 자석 윈도우 구현과는 무관하기에 자세히 살펴보지는 않겠습니다.
자,.. 그러면 위의 구조체에서 우리에게 가장 관심을 끌만한 것이 무엇일까요?... 바로 x,y,cx,cy입니다. 그것들이 윈도우의 좌표와 크기를 결정하기 때문입니다. 자석 윈도우를 구현하려면 적당한 조건에서 x,y 값을 바꾸어 주면 됩니다. 예를들면, 왼쪽 상단에 도킹하려고 한다면 x,y값이 어느정도 범위(사용자에게 줄 입력 범위)안에 들어오게 되면 x,y 값을 강제로 0을 만들어 버리는 겁니다. 그러면 사용자가 보기엔 근처에 가면 처얼썩 달라 붙는 것 처럼 보입니다. 이것이 전부입니다. 간단한 샘플 코드를 보도록 합시다. 아래는 왼쪽 상단에 도킹하는 WM_WINDOWPOSCHANGING의 메시지 핸들러 입니다.
void CMagnetdlgDlg::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)
{
CDialog::OnWindowPosChanging(lpwndpos);
// TODO: Add your message handler code here
if(lpwndpos->x < 20 && lpwndpos->y < 20)
{
lpwndpos->x = 0;
lpwndpos->y = 0;
}
}
너무 간단하지 않습니까? 20안의 범위에 들어오면, 무조건 0으로 만들어 버리는 겁니다. 한가지 주의해야 할 점은 MFC의 경우 다이알로그는 기본적으로 WM_WINDOWPOSCHANGING 메시지가 필터링되어서 클래스 위저드에 나오지 않습니다. 클래스 위저드에서 Class info 부분으로 가셔서 메시지 필터를 Window로 설정한 후에 보시면 나타날겁니다. 여기까지 읽으셨다면 오른쪽 하단에 도킹시키는 것 또한 아주 간단하다는 것을 알 겁니다. 그건 과제로 남겨놓겠습니다. ㅋㅋㅋ~ 그럼 다들 즐거운 프로그래밍하세요~@@
- MFC AUTOMATION 자동화 (0)2007/01/05
- 프로그램 중복 실행 방지 (0)2007/01/03
- 자석 윈도우 만들기 (0)2007/01/02
- VMemPool (0)2006/12/29
- CPU 클럭 구하기 (0)2006/12/29

수안이의 컴퓨터 연구실



Leave your greetings.