블로그 이미지
이태원에서 사는 다섯식구의 무직 가장. 흰둥에미

카테고리

분류 전체보기 (184)
Itaewon (2)
ryu's?? (1)
20121210이전 (20)
20130827이전 (147)
soo'study (13)
Total39,071
Today5
Yesterday7

'dialog'에 해당되는 글 1건

  1. 2013.01.15 8장. 대화상자

사용자와의 대화

- 응용 프로그램과 사용자와의 대화 수단으로 간단하게는 버튼, 에디트, 리스트 박스 등의 컨트롤이 사용됨.

  많은 양의 정보를 효율적으로 입력받기 위해 주로 대화상자(Dialog)를 사용한다.

  동작 방식에 따라 크게 모달형과 모달리스형으로 나뉘어짐.

  모달 다이얼로그

  - 대화상자를 닫기 전에 다른 윈도우로 전환할 수 없으며 반드시 확인버튼이나 취소버튼을 눌러 대화상자를 닫아야 함.

    하지만 다른 프로그램의 실행까지 방해하지는 않기 때문에, 다른 프로그램으로는 전환할 수 있다.

  모달리스 다이얼로그

  - 대화상자를 열어 놓은 채로 다른 윈도우로 전환할 수 있는 대화상자

    모달 다이얼로그에 비해, 프로그래밍하기 까다로움.


About

- 기본적으로 대화상자 템플릿과 대화상자 프로시저가 필요함

  대화상자 템플릿 - 대화상자의 모양과 대화상자 내의 컴트롤 배치 상태가 저장되는 이진 정보, 편집기로 만들수 있음

  대화상자 프로시저 - 대화상자에서 발생하는 메시지를 처리함.

  int DialogBox(HINSTANCE hInstance, LPCTSTR lpTemplate, HWND hWndParent, DLGPROC lpDialogFunc);

  - 첫 번째 인수는 대화상자 리소스를 가진 인스턴스의 핸들, 두 번째 인수는 대화상자 템플릿의 리소스 ID이다.

    세 번째 인수는 대화상자를 소유할 부모 윈도우, 네 번째 인수는 대화상자 프로시저의 이름임.

    대화상자를 닫으면 DialogBox 함수가 리턴하는데 이때 리턴하는 값은 대화상자의 종료 함수인 EndDialog함수가 지정하는 값.


대화상자 프로시저

- 대화상자 프로시저와 윈도우 프로시저 비교

  - 윈도우 프로시저는 LRESULT(long)형의 값을 리턴, 대화상자 프로시저는 BOOL형의 값을 리턴

    윈도우 프로시저는 메시지를 처리했을 때 0을 리턴하고, 따로 관여하지 않는 메시지는 DefWindowProc로 보내지만,

    대화상자 프로시저는 메시지를 제대로 처리했으면 TRUE를 리턴하고 메시지를 처리하지 못했으면 FALSE를 리턴해야 함.

    즉 관여하지 않는 메시지는 FALSE를 리턴해주면 됨.

    대화상자 프로시저는 WM_CREATE 메시지 대신 WM_INITDIALOG 메시지를 받아들이며, 이 곳에서 필요한 초기화를 함.

    대화상자의 컨트롤들에 의해 발생되는 통지 메시지는 WM_COMMAND에서 처리해준다.

    일반 윈도우와 마찬가지로 LOWORD(wParam)에 메시지를 보낸 컨트롤의 ID가 전달, HIWORD(wParam)에 통지 코드가 전달됨.

  BOOL EndDialog(HWND hDlg, int nResult);

  - 이 함수가 호출되면 모달 대화상자가 닫힌다.

    두 번째 인수 nResult는 대화상자를 호출한 DialogBox함수의 리턴값으로 전달됨, 주로 취소 여부를 리턴


대화상자 프로젝트

- 대화상자가 메인 윈도우가 되는 형태의 프로그램을 대화상자 기반의 프로그램(Dialog Base)이라 함.

  대화상자의 부모는 HWND_DESKTOP으로 지정(NULL과 동일)하여 대화상자가 메인 윈도우가 되게 함.

  메인 윈도우가 없으므로 윈도우 프로시저는 필요없고, 대화상자 프로시저가 필요함.


컨트롤의 종류

크기조정 및 이동

컨트롤 편집

정렬

- 리소스 편집기를 잘 쓰자.

  각 컨트롤들은 각각의 속성이 있고, 필요한 정보를 속성창을 이용해 편집할 수도 있음.


컨트롤의 값 읽기

- 핸들과 ID

  대화상자 내의 컨트롤들은 ID라는 고유의 이름을 가지는데 CreateWindow 함수로 직접 만들 때는 hMenu인수로 ID를 지정,

  리소스 편집기를 사용할 때는 속성 대화상자에서 지정.

  HWND GetDlgItem(HWND hDlg, int nIDDlgItem);

  - 차일드 컨트롤의 ID를 알고 있으면,

    위 함수에 대화상자의 핸들과 컨트롤의 ID를 인수로 주고, 차일드 컨트롤의 윈도우 핸들을 구할 수 있다.

  int GetDlgCtrlID(HWND hwndCtl);

  - 위의 함수와 반대 함수로, 차일드 컨트롤의 윈도우 핸들을 이용해 컨트롤의 ID를 얻는다.

  핸들은 특성상 운영체제가 일방적으로 발급하기에 번호의 연속성이 없으며, 반복적인 처리가 불가능.

  따라서 사용자가 직접 번호를 지정할 수 있는 ID가 필요하다.

  LONG SendDlgItemMessage(HWND hDlg, int nID, UINT Msg, WPARAM wParam, LPARAM lParam);

  - SendMessage(GetDlgItem(hDlg,ID)...)과 같은 역할을 하는 함수이다.

- 정수와 문자열

  대화상자와 컨트롤간에 교환할 수 있는 정보의 종류는 크게 문자열과 정수형 두 가지가 있음.

  UINT GetDlgItemText(HWND hDlg, int nID, LPTSTR lpString, int nMaxCount);

  BOOL SetDlgItemText(HWND hDlg, int nID, LPCTSTR lpString);

  - hDlg는 대화상자의 윈도우 핸들, nID는 컨트롤의 ID, lpString은 읽어올 문자열 버퍼(또는 쓸 문자열) , nMaxCount는 버퍼길이

  UINT GetDlgItemInt(HWND hDlg, int nID, BOOL* lpTranslated, BOOL bSigned);

  BOOL SetDlgItemInt(HWND hDlg, int nID, UINT nValue, BOOL bSigned);

  - bSigned가 TRUE일 경우 부호있는 정수값, FALSE일 경우 부호를 무시하고 무조건 양수

    lpTranslated 인수는 정수를 읽어들일 때 에디트에 숫자 이외의 문자가 있거나 숫자가 너무 클 경우 발생한 에러를 지정.

    (에러 검사가 필요없을 땐, NULL 지정, 에디트의 경우 ES_NUMBER스타일을 주면 숫자만 입력가능함.)

    nValue는 컨트롤에 쓸 정수

- 논리형

  - BOOL형과 열거형도 대화상자를 통해 입력받을 수 있음.

    BOOL형은 체크 박스, 열거형은 라디오 버튼이나 리스트 박스를 사용.

    BOOL CheckDlgButton(HWND hDlg, int nIDButton, UINT uCheck);

    - uCheck에 원하는 체크 상태를 인수로 전달하면 버튼의 체크 상태를 변경

      SendMessage(GetDlgItem(hDlg,nIDButton), BM_SETCHECK, uCheck, 0);의 변형

      SendDlgItemMessage(hDlg, nIDButton, BM_SETCHECK, uCheck, 0);의 변형

    UINT IsDlgButtonChecked(HWND hDlg, int nIDButton);

    - 체크 상태를 리턴해준다.

      SendMessage(GetDlgItem(hDlg,nIDButton), BM_GETCHECK, 0, 0);의 변형

      SendDlgItemMessage(hDlg, nIDButton, BM_GETCHECK, 0, 0);의 변형

    함수 이름에 Dlg가 있지만 일반 윈도우의 차일드에 대해서도 사용할 수 있음.


InfoDlg

- 윈도우와 차일드 대화상자와의 통신

  윈도우의 전역변수를 통해 필요한 정보를 공유하고,

  대화상자에서 변경 및 적용된 내용(WM_COMMAND를 이용)에 따라 윈도우를 갱신해줌.


DlgCheck

- InfoDlg와 비슷한 예제로써, 대화상자를 통해 입력받는 값이 BOOL형과 열거형

  라디오 버튼 중 체크된 버튼을 구할 때는 모든 라디오 버튼에게 일일이 질문을 해서 체크된 버튼을 찾는 방법밖에 없음

  MFC에는 아래와 같은 역할을 하는 함수가 존재

  int GetCheckedRadioButton(HWND hDlg, int First, int Last)
  {
       int id;
       for (int id=First; id<=Last; ++id)
       {
           if (BST_CHECKED == IsDlgButtonChecked(hDlg, id)) return id;
       }
       return -1;
  }


독서 도우미

- 대화상자를 메인으로, 타이머, 체크박스, 버튼, 에디트, 스태틱 컨트롤 등을 이용하여 작성.


모달리스형 대화상자.

- 대화상자를 열어놓은 채로 메인 윈도우를 조작할 수 있기 때문에, 모달형 대화상자보다 복잡하며 사용하기도 어려움.

  골치아픈 문제가 발생할 수도 있으며, 메인 윈도우가 변경된 값을 즉각 인지할 수 있어야 함.

  BOOL IsWindow(HWND hWnd);

  - hWnd가 유효한 윈도우 핸들인지 검사하는 함수로써, 모달리스 다이얼로그는 부모 윈도우를 조작할 수 있으므로,

    동일한 대화상자가 두 개 만들어지는 현상을 체크하기 위해서 사용.

  HWND CreateDialog(HINSTANCE hInstance, LPCTSTR lpTemplate, HWND hWndParent, DLGPROC lpDialogFunc);

  - 모달형 대화상자를 위한 DialogBox와 동일한 인수를 갖지만, 호출후에 다이얼로그가 나타나진 않는다.

    따라서 ShowWindow(HWND hWnd, int nShow); 함수를 이용해 화면에 나타나게 해야함.

  대화상자를 닫을 때는, DestroyWindow함수를 사용해야 하며, 대화상자 핸들에는 NULL을 대입해서 다시 사용할 수 있게 해줘야함.

  BOOL IsDialogMessage(HWND hDlg, LPMSG lpMsg);

  - lpMsg가 hDlg의 핸들을 갖는 대화상자를 위한 메시지인지 검사하고, 맞으면 대화상자로 이 메시지를 전달하고 TRUE를 리턴,

    아니면 FALSE를 리턴




'20130827이전 > WinAPI' 카테고리의 다른 글

10장. MFC 소개  (0) 2013.01.15
9장. API 실습  (0) 2013.01.15
8장. 대화상자  (0) 2013.01.15
7장. 컨트롤  (0) 2013.01.14
6장. 그래픽  (0) 2013.01.14
5장. 리소스  (0) 2013.01.13
Posted by 흰둥에미

최근에 달린 댓글

최근에 받은 트랙백

글 보관함