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

    카테고리

    분류 전체보기 (176)
    잡담 (1)
    IT 기기-리뷰&뉴스 (7)
    리뷰 - 도서 (1)
    리뷰 - 영상 (0)
    리뷰 - 그림/음악 (1)
    내장형 하드웨어 (163)
    Total
    Today
    Yesterday
    - 핸들과 ID
     → 대화상자 내의 컨트롤들은 ID라는 고유의 이름을 가지는데 CreateWindow 함수로 직접 만들 때는 hMenu 인수로 ID를 지정하며 리소스 편집기를 사용할 때는 속성 대화사앚에서 지정한다.
     → 차일드 컨트롤도 일종의 윈도우이므로 윈도우 핸들을 가지며 일단 윈도우 핸들을 구하면 컨트롤을 마음대로 프로그래밍할 수 있다.
     → 차일드 컨트롤의 ID를 알고 있으면 다음 함수로 이 컨트롤의 윈도우 핸들을 구할 수 있다.

    HWND GetDlgItem(HWND hDlg, int nIDDlgItem);
     → 첫 번째 인수로 대화상자의 핸들을 주고, 두 번째 인수로 컨트롤의 ID를 주면 이 컨트롤은 윈도우 핸들을 리턴.
     → 예로 IDC_EDIT1이라는 에디트 컨트롤을 대화상자에 배치했다고 하면, 이 컨트롤을 숨기거나 이동시키고자 할 때는 ShowWindow나 MoveWindow 함수를 사용하는데 이 함수들은 컨트롤의 ID가 아닌 윈도우 핸들을 요구한다.
     → 이때 GetDlgItem(hDlg, IDC_EDIT1)함수로 이 윈도우 핸들을 구할 수 있다. 윈도우 핸들을 구했으면 GetWinodw/Text 함수로 컨트롤의 내용을 읽을수도 있고 SetWindowText로 변경할 수 도 있다.

     → 다음 함수는 GetDlgItem의 반대 함수이다.
    int GetDlgCtrlD(HWND hwndCtl);
     → 이 함수는 차일드 컨트롤의 윈도우 핸들로부터 ID를 구한다.
     → 핸들만 알고 있는 상태에서 ID를 요구하는 함수 호출에 사용
     → 이 두함수를 이용하여 ID나 핸들을 알고 있을 때 반대쪽 값을 구할 수 있다.

    - 일단 컨트롤은 윈도우이며 따라서 윈도우를 관리하기 위해서는 핸들이 필요하다.
     → 그러나 핸들은 운영체제가 일방적으로 발급하는 것이기 때문에 번호의 연속성이 없으며 따라서 반복적인 처리에는 사용할 수 없다.

    - 따라서 연속성을 가질 수 있고 사용자가 직접 번호를 지정할 수 있는 ID가 필요하다.
     → 일련의 컨트롤에 연속적인 번호를 가지는 ID를 주면 이 컨트롤들을 for 루프로 돌리면서 반복적인 작업을 할 수 있다.

    - 대화 상자가 차일드 컨트롤을 프로그래밍 하는 주된 방법은 SendMessage 함수로 메시지를 보내는 것인데 이 함수는 대상 윈도우의 핸들을 구한다. 만약 ID만 알고 있다면 다음 코드로 컨트롤의 핸들을 구해 메시지를 보낼 수 있다.

    SendMessage(GetDlgItem(hDlg, ID), ...
     → 이 두 호출문을 합친 함수가 바로 다음 함수로 부모 상자의 핸들과 컨트롤의 ID만으로 편리하게 메시지를 보낼 수 있다.
    LONG SendDlgItemMessage(HWND hDlg, int nID, UINT Msg, WPARAM wParam, LPARAM lPara,);
     → hDlg 대화상자의 nID 컨트롤에게 Msg 메시지를 보내는데 GetDlgItem과 SendMessage를 호출하는 래퍼 함수라 할 수 있다.

    - 대화 상자와 컨트롤간에 교환할 수 있는 정보의 종류는 크게 문자열과 정수형 두 가지가 있다.
    UINT GetDlgItemText(HWND hDlg, int nID, LPTSTR lpString, int nMaxCount);
    BOOL SetDlgItemText(HWND hDlg, int nID, LPCTSTR lpString);

    - 정수형도 유사하다.
    UINT GetDlgItemInt(HWND hDlg, int nID, LPTSTR lpString, int nMaxCount);
    BOOL SetDlgItemInt(HWND hDlg, int nID, LPCTSTR lpString);

    - 나이 값을 표현하는 Age 변수의 값을 IDC_EDIT1이라는 에디트 컨트롤에 출력
    /////////////////////////////////////////////////////////////////////////////////
    BOOL OnInitDialog(HWND hDlg, WPARAM wParam, LPARAM lParam)
    {
      SetDlgItemInt(hDlg, IDC_EDIT1, Age, FALSE);
      return TRUE;
      }

    BOOL OnDlgCommand(HWND hDlg, WPARAM wParam, LPARAM lParam)
    {
      switch(LOWORD(wParam))
      {
      case IDOK:
        Age = GetDlgItemInt(hDlg, IDC_EDIT1, NULL, FALSE);
        EndDialog(hDlg, IDOK);
        break;
      case IDCANCEL:
        EndDialog(hDlg, IDOK);
        break;
      }
      return TRUE;
    }

     → 대화상자가 열릴 때 Age의 값을 IDC_EDIT1에 표시하고 대화상자를 닫기 전에 사용자가 편집한 결과를 Age 변수로 다시 읽어 들인다.


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

    WINAPI - 모델리스형 대화상자  (0) 2011.10.06
    WINAPI - DlgCheck  (0) 2011.09.29
    WINAPI - 대화상자  (0) 2011.09.27
    WINAPI - 스크롤 바  (0) 2011.09.26
    WINAPI - EDIT  (1) 2011.09.23
    Posted by 동화다아아
    , |

    최근에 달린 댓글

    최근에 받은 트랙백

    글 보관함