1. 대화상자(Dialog)
1) 대화상자
대화상자란 여러 개의 컨트롤들을 배치하여 한꺼번에 사용하기 위한 윈도우입니다.
대화상자의 종류로는 Modal형과 Modeless형 2가지가 있으며 윈도우가 제공해주는 공통대화상자도 있습니다.
공통대화상자도 Modal과 Modeless형 2가지로 구성되어 있습니다.
Modal형은 대화상자를 닫기 전에 인스턴스 안에 있는 다른 윈도우로 전환할 수 없으며 반드시 OK버튼이나 Cancel 버튼을 눌러 대화상자를 닫아야 다른 윈도우로 전환할 수 있습니다.
프로그램 내에서만 적용이 되며 다른 프로그램의 전환은 이루어 집니다.
Modeless(Modeless)형은 대화상자가 열린 상태에서도 프로그램 내의 다른 윈도우로 전환할 수 있는 대화상자입니다.
대화상자를 API에서 만들기 위해서는 리소스에서 제공하는 대화상자가 있어야 하며 이 대화상자의 메시지를 처리할 수 있는 메시지 처리 함수가 있어야 합니다.
2) 대화상자의 메시지 처리 함수 만들기
BOOL CALLBACK 함수명(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
대화상자의 메시지를 처리하는 함수를 만들 때 주의할 점은 윈도우 메시지 처리함수는 LRESULT를 리턴하지만 대화상자 메시지 처리함수는 BOOL 타입으로 리턴합니다.
사실은 BOOL도 int 타입입니다.
윈도우 메시지 처리함수는 메시지 처리를 하지 않는 경우 DefWindowProc()를 호출하여 넘기지만 대화상자 메시지 처리함수는 그런 경우 FALSE를 리턴합니다.
메시지 처리를 하는 경우는 TRUE를 리턴합니다.
대화상자 프로시저에서는 WM_PAINT나 WM_DESTROY 메시지를 별도로 할 필요가 없습니다.
WM_CREATE 메시지를 받지 않기 때문입니다.
대화상자는 지역변수나 전역변수의 형태로 존재하므로 호출되는 개념으로 보기 때문입니다.
대신 대화상자가 처음 보여질 때 발생하는 메시지인 WM_INITDIALOG를 이용합니다.
이 메시지가 발생하면 대화상자는 자식 컨트롤 중의 하나에게 SetFocus()를 호출하여 포커스를 주게 됩니다.
대화상자는 메시지 큐를 이용하지 않고 전부 비 큐 메시지로 처리합니다.
3) 프로젝트에서 대화상자(Modal형) 호출과 닫기
DialogBox(인스턴스 핸들, MAKEINTRESOURCE(다이얼로그ID), 부모 윈도우 핸들, 다이얼로그 메시지 처리 함수);
Modal 대화상자 닫기
BOOL EndDialog(HWND hDlg, INT_PTR nResult);
hDlg: 다이얼로그 핸들
nResult: 부모 윈도우에게 전달할 값
예제) 다이얼로그를 리소스에서 생성하고 호출하기
3) 대화 상자 기반 프로젝트 만들기
클라이언트 영역이 보이지 않고 오로지 대화상자만 있는 프로젝트를 생성할 수 있습니다.
이 때는 리소스에 다이얼로그를 생성한 후 다이얼로그 메시지 처리 함수를 정의하고 WinMain에서 다이얼로그를 호출하기만 하면 됩니다.
예제)
2. Modal과 Modeless의 차이
Modeless 대화상자는 사용자가 직접 화면에 출력하고 파괴해야 합니다.
CreateDialog(인스턴스 핸들,리소스 이름,부모윈도우,메시지처리함수)로 생성해야 하고 ShowWindow(윈도우 핸들, 보여지는 옵션)을 이용해서 직접 화면에 표시해야 하며 DestroyWindow(윈도우핸들)을 호출해서 직접 파괴해야 합니다.
3. 대화상자와 컨트롤
1) 대화상자에 컨트롤 배치
도구 상자에서 대화상자로 드래그 하면 대화상자에 배치가 되며 [서식] 메뉴에서 맞춤이나 간격 등을 조절할 수 있습니다.
2) 컨트롤과 대화상자의 값과 메시지 전달 함수
- HWND GetDlgItem(HWND hDlg, int nIDDlgItem)
1번째 인수로 대화상자의 핸들을 주고 두 번째 인수로 컨트롤의 ID를 주면 컨트롤의 윈도우 핸들을 리턴합니다.
컨트롤을 움직이거나 보이고 숨기고자 하는 경우 MoveWindow, ShowWindow 등을 사용하게 되는데 이 때 윈도우 핸들을 요구하므로 사용하는 함수입니다.
- int GetDlgCtrlID(HWND hwndCtl)
컨트롤의 윈도우 핸들로부터 ID를 구해주는 함수입니다.
- UINT GetDlgItemText( HWND hDlg, int nIDDlgItem, LPTSTR lpString, int nMaxCount );
- BOOL SetDlgItemText( HWND hDlg, int nIDDlgItem, LPCTSTR lpString );
1번째 인수는 대화상자의 윈도우 핸들이며 2번째 인수 nIDDlgItem은 값을 읽거나 쓸 컨트롤의 ID입니다.
lpString은 대입하고자 하는 문자열, 또는 문자열을 읽을 버퍼이며 문자열을 읽을 때는 버퍼의 길이를 nMaxCount로 입력해 주어야 한다.
- UINT GetDlgItemInt( HWND hDlg, int nIDDlgItem, BOOL *lpTranslated, BOOL bSigned );
- BOOL SetDlgItemInt( HWND hDlg, int nIDDlgItem, UINT uValue, BOOL bSigned );
1번째, 2번째 인수는 문자열의 경우와 동일합니다.
GetDlgItemInt는 해당 컨트롤에 입력된 정수 값을 읽어 리턴 값으로 둘려주되 GetDlgItemInt는 3번째 인수는 BOOL형 포인터에 에러가 있었는지 없었는지를 대입해줍니다.
4번째 인수 bSigned가 TRUE일 경우는 부호 있는 정수 값을 읽어주며 FALSE일 경우는 부호를 무시하고 무조건 양수로 읽어줍니다.
- BOOL CheckDlgButton( HWND hDlg, int nIDButton, UINT uCheck );
- UINT IsDlgButtonChecked( HWND hDlg, int nIDButton);
CheckDlgButton 함수는 부모 윈도우의 핸들과 버튼의 ID 그리고 원하는 체크 상태를 인수로 전달하면 체크 상태를 변경해 줍니다.
IsDlgButtonChecked는 체크 상태를 읽어 오는 함수입니다.
예제) Modal과 Modeless를 활용한 예제
2. Modeless 대화상자로 문자열을 입력 받아서 메시지 박스에 출력하는 예제
예제) 체크 박스와 라디오 버튼을 읽어 내는 예제
4. 공통 대화 상자
MS-WINDOWS가 자주 사용하는 대화상자를 미리 만들어서 제공해주는 대화상자입니다.
1) 파일 열기 대화 상자
BOOL GetOpenFileName(LPOPENFILENAME lpofn);
파일 열기 대화상자를 출력해주며 확인 버튼을 누르면 lpofn에 여러 가지 값들을 리턴합니다.
LPOPENFILENAME의 주요 멤버
lpstrFilter: 파일 형식에 사용될 필터이며 널 문자를 기준으로 "파일 형식\0필터"와 입력lpstrFile: 파일명 텍스트 상자에 나타낼 파일명을 지정하게 되는데 없을 경우는 NULL로 지정
이 멤버는 사용자가 최종적으로 선택한 파일의 이름(완전 경로)을 리턴하는 용도로 nMaxFile: lpstrFile의 길이
pstrFileTitle: 파일의 이름을 돌려받기 위한 버퍼
MaxFileTitle: lpstrFileTitle의 길이를 지정
lpstrInitialDir: 파일 찾기를 시작할 디렉토리를 지정
lpstrTitle: 대화상자의 캡션
2) 파일 저장 대화 상자
BOOL GetSaveFileName(LPOPENFILENAME lpofn);
파일 열기 대화상자를 출력해주며 확인 버튼을 누르면 lpofn에 여러 가지 값들을 리턴합니다.
3) 폰트 대화상자
ChooseFont(LPCHOOSEFONT cf);
폰트 대화상자를 호출하여 폰트를 cf에 저장
4) 색상 대화상자
ChooseColor(LPCHOOSECOLOR CC);
색상 대화상자를 호출하여 폰트를 cc에 저장
Cc의 값 중에서 rgbResult가 색상을 저장
'C & C++ > C & C++' 카테고리의 다른 글
[Tip] ESC 로 종료 안되게 (0) | 2011.04.25 |
---|---|
[API] 윈도우 관련 함수와 메시지 (0) | 2011.04.25 |
[API] 리소스 사용 (0) | 2011.04.25 |
[API] API 메시지 처리 (0) | 2011.04.25 |
[API] 화면 출력 API (0) | 2011.04.25 |
댓글