WINAPI - 컨트롤과의 통신
내장형 하드웨어/WINAPI / 2011. 9. 28. 15:40
- 핸들과 ID
→ 대화상자 내의 컨트롤들은 ID라는 고유의 이름을 가지는데 CreateWindow 함수로 직접 만들 때는 hMenu 인수로 ID를 지정하며 리소스 편집기를 사용할 때는 속성 대화사앚에서 지정한다.
→ 차일드 컨트롤도 일종의 윈도우이므로 윈도우 핸들을 가지며 일단 윈도우 핸들을 구하면 컨트롤을 마음대로 프로그래밍할 수 있다.
→ 차일드 컨트롤의 ID를 알고 있으면 다음 함수로 이 컨트롤의 윈도우 핸들을 구할 수 있다.
→ 예로 IDC_EDIT1이라는 에디트 컨트롤을 대화상자에 배치했다고 하면, 이 컨트롤을 숨기거나 이동시키고자 할 때는 ShowWindow나 MoveWindow 함수를 사용하는데 이 함수들은 컨트롤의 ID가 아닌 윈도우 핸들을 요구한다.
→ 이때 GetDlgItem(hDlg, IDC_EDIT1)함수로 이 윈도우 핸들을 구할 수 있다. 윈도우 핸들을 구했으면 GetWinodw/Text 함수로 컨트롤의 내용을 읽을수도 있고 SetWindowText로 변경할 수 도 있다.
→ 다음 함수는 GetDlgItem의 반대 함수이다.
→ 핸들만 알고 있는 상태에서 ID를 요구하는 함수 호출에 사용
→ 이 두함수를 이용하여 ID나 핸들을 알고 있을 때 반대쪽 값을 구할 수 있다.
- 일단 컨트롤은 윈도우이며 따라서 윈도우를 관리하기 위해서는 핸들이 필요하다.
→ 그러나 핸들은 운영체제가 일방적으로 발급하는 것이기 때문에 번호의 연속성이 없으며 따라서 반복적인 처리에는 사용할 수 없다.
- 따라서 연속성을 가질 수 있고 사용자가 직접 번호를 지정할 수 있는 ID가 필요하다.
→ 일련의 컨트롤에 연속적인 번호를 가지는 ID를 주면 이 컨트롤들을 for 루프로 돌리면서 반복적인 작업을 할 수 있다.
- 대화 상자가 차일드 컨트롤을 프로그래밍 하는 주된 방법은 SendMessage 함수로 메시지를 보내는 것인데 이 함수는 대상 윈도우의 핸들을 구한다. 만약 ID만 알고 있다면 다음 코드로 컨트롤의 핸들을 구해 메시지를 보낼 수 있다.
SendMessage(GetDlgItem(hDlg, ID), ...
→ 이 두 호출문을 합친 함수가 바로 다음 함수로 부모 상자의 핸들과 컨트롤의 ID만으로 편리하게 메시지를 보낼 수 있다.
- 대화 상자와 컨트롤간에 교환할 수 있는 정보의 종류는 크게 문자열과 정수형 두 가지가 있다.
- 정수형도 유사하다.
- 나이 값을 표현하는 Age 변수의 값을 IDC_EDIT1이라는 에디트 컨트롤에 출력
→ 대화상자 내의 컨트롤들은 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);
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);
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 변수로 다시 읽어 들인다.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;
}
'내장형 하드웨어 > 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 |