수안이의 컴퓨터 연구실

  • Mainpage
  • About Me
  • Tags
  • Metapage
  • Notice
  • Location
  • Keywords
  • Guestbook
  • Admin
  • Write an Article
  • Total | 1620706
  • Today | 86
  • Yesterday | 482

1 Articles, Search for '자석 윈도우'

  1. 2007/01/02 자석 윈도우 만들기
Programming/MFC2007/01/02 17:19

자석 윈도우 만들기

고수닷넷 - 데미소다오렌지님

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" 카테고리의 다른 글
  • MFC AUTOMATION 자동화 (0)2007/01/05
  • 프로그램 중복 실행 방지 (0)2007/01/03
  • 자석 윈도우 만들기 (0)2007/01/02
  • VMemPool (0)2006/12/29
  • CPU 클럭 구하기 (0)2006/12/29
2007/01/02 17:19 2007/01/02 17:19
Posted by webdizen
Tags 자석 윈도우
No Trackback No Comment

Trackback URL : http://www.webdizen.net/blog/trackback/2544

Leave your greetings.

[로그인][오픈아이디란?]

«Prev  1  Next»

RSS HanRSS
Blog Image
webdizen
이 곳은 컴퓨터에 대해 연구하고, 공유하고, 소통하기 위한 연구실입니다. 개인적으로는 OLAP, Data Mining, Semantic Web, Data Modeling에 대해서 연구하고 있습니다.

Categories

전체 (2998)
Webdizen (134)
Life (6)
Diary (16)
Blog (9)
IDEA (1)
Travel (10)
Book (14)
Photo (7)
Movie (7)
Music (13)
Leisure Sports (10)
Funny (5)
Hardware (119)
Software (120)
Windows (5)
Unix & Linux (119)
Installation (4)
Kernel (10)
System (34)
Develop (22)
X-Window (0)
Applicaton (31)
Security (4)
Framework (2)
Hadoop (2)
Programming (805)
Algorithm & Data Structure (1)
Assembly (38)
UNIX/Linux C (95)
C++ (128)
STL (4)
Java (38)
Win32 API (92)
ATL/COM (44)
MFC (151)
.NET (26)
WCF/WPF (4)
C# (28)
Network Programming (17)
Database Programming (12)
OpenGL / DirectX (13)
Multimedia Programming (0)
Game Programming (21)
Parallel Distributed Progra... (0)
Reverse Engineering (0)
Debugging (9)
Python (1)
Ruby (1)
Ruby on Rails (1)
QT (4)
GTK (0)
JSP (0)
PHP (6)
ASP.NET (6)
ASP (3)
Development (28)
Useful Library (2)
Data Modeling (0)
Database (105)
Oracle (4)
MSSQL (41)
MySQL (2)
Data Warehouse (2)
Data Mining (3)
Network (66)
Web (78)
DHTML (4)
XHTML (1)
Javascript (1)
CSS (1)
AJAX (9)
XML (11)
Flex (1)
Silverlight (3)
Security (91)
DoS (1)
Kernel (10)
Scanning (3)
Sniffing (0)
Spoofing (4)
Overflow (28)
Web (11)
Shell (10)
Format String (14)
Window (2)
Embedded (70)
Multimedia (27)
Mobile (14)
Graphic (24)
Management (633)
Knowledge (581)
Hadoop (0)

Notice

  • 메타 블로그 사이트에 등록
  • 새해 맞이 블로그의 변화
  • 블로그 명칭 변경
  • 도메인(www.webdizen.net) 구...
  • TEXTCUBE 1.6.1로 업그레이드...

Tags

  • 시스템 사양
  • 에어론 의자
  • Alexa
  • SQL Server
  • 집중
  • 마이그레이션
  • SQL
  • RC카
  • Cataloging
  • 노천극장
  • 저장 프로시저
  • HTML
  • 세마포어
  • 계산기
  • SK Telecom
  • 추격자
  • pthread
  • Utilities
  • 의암관
  • Chat

Recent Articles

  • ASCII Code의 CRLF 제거 방법.
  • Hadoop 에서 c++ API 이용시....
  • Ubuntu Linux에서 Hadoop 구....
  • 내 심장을 한껏 뛰게한 "국가....
  • 스타 스키마 데이터베이스 설....

Recent Comments

  • ■ 온라인카지노 ▶ http://L....
    asdf 11/21
  • 그리고 혹시 해외여행자보험....
    kim 11/05
  • ★★실제 바다게임장과 똑같....
    asdf 11/04
  • sbsyama.co.to← 짱5000만당....
    asdf 11/04
  • ♡KicaZ??o(???) 바카라사....
    fdsf3fass 11/03

Recent Trackbacks

  • 파일 열기/저장하기 CFileDialog.
    은마군의 나태블록 02/11
  • World IT Show 2008.
    상우 :: Oranzie's BLOG 2008
  • cvs서버 설치하기.
    3인3색 2008
  • 속속 공개되는 Google Chart....
    PHP와 Web 2.0 2007
  • 마방진을 구하는 프로그램.
    Oranzie's BLOG 3 2007

Archive

  • 2009/09 (3)
  • 2009/08 (1)
  • 2009/03 (1)
  • 2009/02 (9)
  • 2009/01 (13)

Calendar

«   2009/11   »
일 월 화 수 목 금 토
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          

Bookmarks

    • Administration
      • IIS.NET
      • NTFAQ
      • OS의 모든 것
      • 리눅스포털
    • Database
      • SQL Server Central
      • SQL Team
    • Development
      • .NET Heaven
      • ASP Alliance
      • ASP.NET 2.0
      • Bullog.net
      • C# Corner
      • C++ (C PlusPlus.com)
      • C++ Reference
      • CodeGuru
      • CodePlex
      • DebugLab
      • Dev Articles
      • Devpia
      • DotNet Junkies
      • DotNet Zone
      • Driver Online
      • GOSU.NET
      • HOONS 닷넷
      • Joinc 팀블로그
      • KOSR
      • MSDN Home Page
      • OSR Online
      • Sky.ph - 개발자 커뮤니...
      • TAEYO.NET
      • The Code Project
      • WindowsClient.net
      • 김상욱의 개발자 Side
      • 조인시 위키
    • Human Networks
      • belief21c's e-space
      • I think I can
      • Invisible Rover's Blog :D
      • Rodman®
      • ■ Feel So Good~! ■
      • 까만 나비
      • 나를 가꾸는 시간.
      • 나만의 즐거움~~!
      • 단녕
      • 상우 :: Oranzie's BLOG
    • Information Technology
      • Microsoft TechNet
      • 지디넷코리아 - 글로벌...
    • Security
      • FoundStone
      • milw0rm
      • NewOrder
      • OpenRCE
      • Phrack.org
      • Reverse Engineering b1...
      • Reverse Engineering Team
      • RootKit
      • SecurityFocus
      • SecurityXploded by Nag...
      • Wow Hacker
      • Zone-H
Textcube
Louice Studio Inc.
Powered by Textcube. Original designed by Tistory.