블로그 이미지
하루, 글. 그림. 영상매체. 표현을 도와주는 기기들. 도전 중. 동화다아아
    동화다아아

    카테고리

    분류 전체보기 (176)
    잡담 (1)
    IT 기기-리뷰&뉴스 (7)
    리뷰 - 도서 (1)
    리뷰 - 영상 (0)
    리뷰 - 그림/음악 (1)
    내장형 하드웨어 (163)
    Total
    Today
    Yesterday
    - 컨트롤(Control)이란 사용자와의 인터페이스를 이루는 도구
    - 인터페이스를 이룬다는 말은 사용자로부터 명령과 입력을 받아들이고 출력결과를 보여준다는 뜻이므로 컨트롤은 곧 입출력 도구를 뜻한다.

    - 윈도우즈 3.1부터 지원하는 컨트롤에는 버튼, 에디트, 리스트 박스, 콤보 박스, 스크롤 바, 스태틱 등 여섯가지에 불과했는데 이 여섯가지를 표준 컨트롤이라고 한다. 현재는 컨트롤의 수가 거의 무한대에 이른다.



    -윈도우를 만들 때는 WNDCLASS 형의 구조체를 정의하고 RegisterClass 함수로 등록한 후 CreateWindow 함수를 호출한다. 그러나 컨트롤은 윈도우즈가 운영체제 차원에서 제공하기 때문에 윈도우 클래스를 등록할 필요없이 미리 등록되어 있는 윈도우 클래스를 사용하기만 하면 된다.
    - 이 윈도우 클래스들은 시스템 부팅시에 운영체제에 의해 등록되므로 윈도우 클래스를 따로 등록할 필요없이 CreateWindow 함수의 첫번재 인수로 클래스 이름만 주면 해당 컨트롤을 만들 수 있다.

    - 예제

    LRESULT OnCreate(HWND hWnd, WPARAM wParam, LPARAM lParam)
    {
     CreateWindow(TEXT("button"), TEXT("Click Me"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, 20, 20, 100, 25, hWnd, (HMENU)0, g_hInst, NULL);
     CreateWindow(TEXT("button"), TEXT("ME Two"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, 20, 50, 100, 25, hWnd, (HMENU)1, g_hInst, NULL);
     return 0;
    }
    LRESULT OnCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
    {
     switch(LOWORD(wParam)) // ID에 따른 분기
     {
     case 0:
      MessageBox(hWnd, TEXT("First Button Clicked"), TEXT("Button"), MB_OK);
      break;
     
     case 1:
      MessageBox(hWnd, TEXT("Second Button Clicked"), TEXT("Button"), MB_OK);
      break;
     }
     return 0;
    }
    → 출력 결과

    → 여기서 버튼은 "메시지 박스를 보여주어라"는 명령을 사용자로부터 받아들이는 도구로 사용되었다. 버튼 컨트롤 만들기와 만들어진 버튼이 눌러졌을 때의 처리 방법을 확인 할 수 있는 것이다.


    - 컨트롤은 윈도우이기는 하지만 홀로 사용될 수 없으며 반드시 부모 윈도우의 차일드로 존재해야 한다. 컨트롤은 부통 부모 윈도우가 만들어 질 때 즉, WM_CREATE 메시지가 발생했을 때 만든다. 컨트롤도 하나의 윈도우이므로 CreateWindow 함수를 호출하여 만들었다.
    CreateWindow(TEXT("button"), TEXT("Clic Me"), WS_CHILD | WS_VISIBLE |
    BS_PUSHBUTTON, 20, 20, 100, 25, hWnd, (HMENU)0, g_hInst, NULL);



    → "button"
    → CreateWindow 함수의 첫 번째 인수는 만들고자 하는 윈도우의 윈도우 클래스이다. 컨트롤은 운영체제에 의해 윈도우 클래스가 미리 등록되어 있으므로 별도로 등록할 필요없이 이 인수에 만들고자 하는 컨트롤의 윈도우 클래스 명을 적어주면 된다. "button" 윈도우 클래스를 지정했으므로 버튼이 만들어 질 것이다. 대소문자는 구분하지 않는다.

    → "Click Me"
    → 두 번째 인수는 윈도우의 타이틀 바에 나타날 바에 나타날 윈도우의 제목이되 컨트롤에 따라 캡션이 나타날 위치가 달라진다. 보통 윈도우라면 타이틀 바에 캡션이 나타나지만 버튼은 버튼 위에 캡션이 나타나며 체크, 라디오 버튼은 그 오른쪽에 캡션이 나타난다. 리스트 박스나 스크롤 바처럼 캡션이 필요없고 내용만 있는 컨트롤은 NULL을 지정하면 된다. 이 인수에 "Click Me"라는 캡션을 주었으므로 버튼 위에 이 문자열이 나타날 것이다.

    → 스타일
    → 세 번째 인수는 윈도우의 속성값이다. 컨트롤은 차일드 윈도우이므로 예외없이 WS_CHILD 스타일은 반드시 주어야 한다. 또한 WS_VISIBLE 스타일을 주어야 ShowWindow 함수를 호출하지 않아도 컨트롤이 화면에 나타나므로 컨트롤의 경우 이 두 스타일 값은 거의 예외없이 지정하는 것이 정석이다. 그 외 컨트롤에 따른 고유한 스타일을 추가로 지정한다.

    →  위치
    → 네 번째 부터 일곱 번째 인수까지는 윈도우의 위치와 크기를 지정한다. 컨트롤의 경우는 부모 윈도우의 작업영역을 기준으로 한 좌표가 사용된다. 위 예제의 경우 부모 윈도우의 작업영역 좌상단에서 (20, 20)에 버튼이 위치하며 폭은 100, 높이는 25픽셀이다.

    →  부모 윈도우
    → 8번째 인수는 컨트롤의 부모 윈도우를 지정하는데 컨트롤은 차일드이므로 반드시 부모 윈도우가 있어야 한다. 예제에서는 메인 윈도우의 핸들인 hWnd를 적어줌으로써 부모 윈도우를 지정했다. 그래서 여기서 만들어진 버튼 컨트롤은 hWnd 윈도우의 작업영역을 기준으로 한 좌표에 생성되며 무슨 일이 생기면 hWnd에게 통지 메시지를 보내고 또한 hWnd가 파괴될 때 같이 파괴된다.

    → 자식 윈도우는 항상 부모의 위 쪽에 나타나며 부모와 운명을 같이 한다. 부모가 최소화되거나 숨겨지거나 파괴되면 자식도 같이 된다.
    → 메인 윈도우를 생성할 때는 부모 윈도우를 NULL로 지정하는데 이는 부모가 없다는 뜻이 아니라 데스크탑을 부모로 한다는 뜻이다. WM_CREATE에서 생성되는 컨트롤의 부모는 통상 이 메시지를 처리하고 있는 부모인 hWnd가 된다.

    → ID
    → CreateWindow의 9번째 인수는 윈도우에서 사용할 메뉴의 핸들이다. 단 차일드 컨트롤은 메뉴를 가지지 않으므로 이 인수를 컨트롤의 ID지정 용도로 사용한다.
    → 컨트롤의 ID는 컨트롤간의 구분을 위해 사용하는 것이므로 한 부모 아래의 컨트롤끼리 중복되지 않는 한 자유롭게 지정할 수 있다. 예제에서는 두 버튼에 각각 ID 0, ID 1을 주어 구분하는데 원래 이 인수가 메뉴를 지정하므로 (HMENU)형으로 캐스팅해야 한다.

    → 인스턴스의 핸들
    → 10 번째 인수는 이 윈도우를 만드는 인스턴스의 핸들인데 WinMain의 첫 번째 인수로 전달받은 hInstance의 사본인 g_hInst를 넘겨주면 된다.

    → 11번째 인수는 사용자 정의 데이터이며 MDI에서 사용하는 구조체인데 일단 무시하고 NULL로 지정하면 된다.

    → 예제의 WM_CREATE에서 CreateWindow 함수를 두 번 호출하여 두 개의 버튼 컨트롤을 만들었다. 컨트롤을 생성한 후에 CreateWindow 함수는 생성된 차일드 컨트롤의 윈도우 핸들을 리턴하는데 핸들이 필요할 경우 별도의 변수에 핸들값을 저장해 두면 된다.
    → 이 예제는 버튼의 윈도우 핸들을 쓰지 않으며 ID만 사용하므로 리턴값을 무시하였다. 부모 없는 고아는 존재할 수 없으며 부모가 파괴될 때 차일드는 자동으로 파괴되므로 생성한 컨트롤을 일부러 파괴할 필요는 없다.

    - 부모와의 통신
     → 컨트롤은 자신에게 무슨 일이 일어났을 때, 예를 들어 버튼을 클릭했다거나 에디트에 문자열을 입력했다거나 할 경우 부모 윈도우로 통지 메시지(Notification Message)를 보내 어떤 사건이 발생했는지를 알린다. 부모 윈도우는 차일드 컨트롤이 보내는 통지 메시지를 받아 적절한 처리를 해야 한다.
     → 버튼을 클릭할 경우 WM_COMMAND 메시지를 부모 윈도우에게 보내며 이때 전달되는 정보는 다음과 같다.
     인수 설명 
     HIWORD(wParam)  통지 코드
     LOWORD(wParam)  컨트롤의 ID
     lParam  메시지를 보낸 차일드 윈도우의 윈도우 핸들
     → 컨트롤의 ID는 CreateWindow의 아홉 번째 인수에서 지정한 정수값이며 어떤 컨트롤이 통지 메시지를 보냈는지를 알려준다.
     → 통지 코드는 차일드 컨트롤이 왜 메시지를 보냈는가를 나타내는 값이다.
     → 버튼의 경우 통지 코드는 항상 사용자가 자신을 클릭했다는 의미의 BN_CLICKED이므로 이 값은 특별히 검사할 필요가 없지만 통지코드가 여러 개인 컨트롤은 이 값을 검사해 보아야 한다.

     → 부모 윈도우는 WM_COMMAND에서 LOWORD(wParam)값을 조사하여 어떤 컨트롤이 눌러졌는지에 따라 적절한 처리를 한다.

    ID  핸들 
    버튼1   0  hB1
    버튼2  1  hB2
    - 버튼 1을 예로 들면
     → wParam에서 통지 메시지는 BN_CLICKED, 컨트롤 IDsms 0이 되며
     → lParam에서 메시지를 보낸 차일드 윈도우(컨트롤)의 윈도우 핸들은 hB1이다.





    '내장형 하드웨어 > WINAPI' 카테고리의 다른 글

    WINAPI - 라디오 버튼  (0) 2011.09.21
    WINAPI - 체크 박스  (0) 2011.09.20
    WINAPI - Font  (0) 2011.09.16
    WINAPI - 비트맵 출력, 메모리 DC  (0) 2011.09.15
    WINAPI - RopMode2 실습  (0) 2011.09.09
    Posted by 동화다아아
    , |

    최근에 달린 댓글

    최근에 받은 트랙백

    글 보관함