태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.


댓글 하나가 운영자에겐 커다란 힘이 됩니다!

1. 함수의 원형
 
    HWND ChildWindowFromPoint(HWND hWndParent, POINT Point);
 
 
2. 함수의 기능
 
    좌표값을 이용하여 특정 윈도우에 존재하는 자식윈도우(컨트롤 포함)의 핸들 값을 얻는 함수이다.
    여기서 좌표값은 해당 윈도우의 클라이언트 좌표계(아래 그림 참조)를 사용한다.
 
   
 

3. 함수의 매개변수에 대한 설명
 
    3.1 hWndParent
 
        자신이 찾고자 하는 자식윈도우를 포함하고 있는 윈도우의 핸들을 명시한다. 아래와 같은
        대화상자가 있고 해당 대화상자 내부에 있는 "Button1" 이라는 버튼의 핸들을 찾고자 한다면
        먼저 해당 버튼을 포함하고 있는 대화상자의 핸들을 얻어야 하는데 이것은 FindWindow와
        같은 함수를 사용하여 간단하게 얻을수 있다.
 
        // 대화상자는 윈도우 클래스명이 동일하기 때문에 클래스명으로 구분하기 힘들다. 따라서
        // 대화상자의 타이틀 이름을 이용하여 해당 대화상자를 찾으면 된다.
        HWND h_parent_wnd = ::FindWindow(NULL, "TestApp - www.tipssoft.com, (주)팁스웨어");
 
        
 
 
    3.2 Point
 
        이 변수에 명시한 좌표값을 기준으로 해당 위치에 존재하는 자식 윈도우의 핸들을 얻는다.
        위 그림에서 "Button1" 이라는 버튼의 핸들을 얻고자 한다면 (30, 25) 정도의 좌표를
        명시해주면 된다.
 
        HWND h_parent_wnd = ::FindWindow(NULL, "TestApp - www.tipssoft.com, (주)팁스웨어");
        if(h_parent_wnd != NULL){
            POINT pos = {30, 25};
            HWND h_child_wnd = ::ChildWindowFromPoint(h_parent_wnd, pos);
            // "Button1" 이라는 버튼을 찾았다면 해당 핸들이 h_child_wnd에 저장될 것이다.
        }
 

4. 함수의 반환값
 
    지정한 좌표에서 찾은 자식윈도우의 핸들을 반환한다. 해당 위치에 자식윈도우가 눈에 보이지 않도록
    숨겨져있거나 비활성상태로 되어있더라도 찾아서 핸들을 반환한다. 또한 해당 위치에 자식 윈도우가
    존재하지 않는다면 대상 윈도우의 핸들이 반환된다. 즉, 대화상자위에 버튼을 검색하고자 했지만
    해당 위치에 버튼이 존재하지 않고 대화상자의 바탕이였다면 대화상자의 핸들이 반환된다.
    그리고 명시한 좌표값이 검색 대상 윈도우의 영역을 벗어났을 때만 NULL이 반환된다.
 
    POINT pos = {30, 25};
    HWND h_child_wnd = ::ChildWindowFromPoint(h_parent_wnd, pos);
 
    if(h_child_wnd == NULL){
        // 좌표가 h_parent_wnd 윈도우의 영역을 벗어난 경우.
    } else {
        if(h_child_wnd == h_parent_wnd){
            // 검색된 윈도우가 부모 윈도우라면 해당 위치에는 자식윈도우가 존재하지 않는다는 뜻이다.
        } else {
            // 지정한 위치에서 자식윈도우를 찾은 경우.
        }
    }
 
 
5. 함수의 주의사항
 
    검색 대상윈도우 내부에 자식윈도우가 겹쳐져 있고 겹쳐진 좌표를 명시했다면 시스템 Z-order 순서상
    가장 마지막에 있는 자식윈도우의 핸들이 반환된다. 즉, 겹쳐진 두 자식윈도우 중에서 현재 눈에
    보이는 윈도우의 핸들이 반환된다.

관리자   08-01-21 07:25
위 소스를 MFC 형식으로 사용한다면 아래와 같이 변경하시면 됩니다. FindWindow 함수와
ChildWindowFromPoint 함수 모두 CWnd 클래스의 멤버 함수이기 때문에 ::를 제거하고 사용하면
CWnd 클래스의 함수를 사용하게 됩니다.

CWnd *p_parent_wnd = FindWindow(NULL, "TestApp - www.tipssoft.com, (주)팁스웨어");
if(p_parent_wnd != NULL){
    CWnd *p_child_wnd = ChildWindowFromPoint(p_parent_wnd, CPoint(30, 25));
    if(p_child_wnd == NULL){
        // 좌표가 p_parent_wnd 윈도우의 영역을 벗어난 경우.
    } else {
        if(p_child_wnd == p_parent_wnd){
            // 검색된 윈도우가 부모 윈도우라면 해당 위치에는 자식윈도우가 존재하지
            // 않는다는 뜻이다.
        } else {
            // 지정한 위치에서 자식윈도우를 찾은 경우.
        }
    }
}

[주의 사항] FindWindow, ChildWindowFromPoint가 반환하는 CWnd * 형식의 값은 임시적으로
            생성된 객체의 주소값이기 때문에 전역 변수 또는 멤버 변수에 저장한 후,
            계속 사용하면 문제가 발생할수 있습니다. 즉, 해당 작업을 하는 그 순간에만
            사용하고 더 이상 사용하면 안된다는 뜻입니다.
출처 : http://www.tipssoft.com/bulletin/tb.php/FAQ/76

위의 정보가 도움이 되셨나요? 그렇다면 댓글 하나만 남겨주세요.
댓글 하나가 운영자에겐 커다란 힘이 됩니다!

  1. 바람의 아그들

    | 2009/12/03 10:18 | PERMALINK | EDIT | REPLY |

    잘 보고 가요~

  2. 땡감

    | 2010/02/13 21:17 | PERMALINK | EDIT | REPLY |

    감사합니다 쉽고 정확한 설명 좋네요

Write your message and submit
« PREV : 1 : ... 263 : 264 : 265 : 266 : 267 : 268 : 269 : 270 : 271 : ... 436 : NEXT »