C++ 대화 상자

2008. 11. 12. 14:11 from ▣ 참고/C++

   대화 상자 사용은 내용이 방대하여 여기에서 모든 내용을 설명할 수 없고 많이 쓰는 기능을 위주로 설명한다. Resource 의 Dialog를 이용하여 대화 상자 모양을 설정한다.


위 그림과 같이 Dialog 트리에서 마우스 오른쪽 버튼을 선택하여 Insert Dialog를 실행하면 IDD_DIALOG1이라는 대화 상자(기본적으로 OK버튼과 Cancel버튼이 들어 있는 대화상자)가 생성된다.


생성된 IDD_DIALOG1(오른쪽 대화 상자 부분)에서 마우스 오른쪽 버튼을 선택하여 Properties를 실행(Alt+Enter도 같은 기능)하면 다음과 같은 대화 상자가 생성된다.



  각 컨트롤에서 마우스 오른쪽 버튼을 선택하여 Properties를 실행(Alt+Enter도 같은 기능)하면 다음과 같은 대화 상자가 생성된다.


위의 대화 상자는 Control 마다 그 모양이 조금씩 다르다. 모든 Control은 ID로 구분을 하므로 ID는 존재한다. 각 ID에 ID만 보아도 Control의 기능을 알 수 있도록 이름을 설정한다(여기서는 편의상 기본값을 사용한다). Caption영역은 외부에 Text가 표시되는 Control의 경우 존재한다. 그외 설정은 대부분 손댈 필요는 없고 각 Control 세부 설명에서 설정할 필요가 있는 부분은 다시 설명한다.

화면 설계를 한 대화 상자를 선택하고 Class Wizard를 실행하면 다음과 같은 대화 상자가 생성된다.


OK 버튼을 선택하면 다음과 같은 대화 상자가 생성된다.


Name : Class 이름을 입력한다(여기에서는 CTestDialog라고 입력했다고 가정).

OK 버튼을 선택하면 Name에 입력한 Class 이름에 의해 파일이 생성되고(여기서는 TestDialog.cpp와 TestDialog.h 파일이 생성된다), Class Wizard가 화면에 나타난다. Class Wizard의 Member Variables 탭을 선택하면 Class Wizard 화면은 다음과 같이 된다.


Edit Box, Check Box

Edit Box와 Check Box는 간단한 I/F로 그 설정 값을 변수와 연결할 수 있다.

Edit Box에 설정한 ID인 IDC_EDIT1를 더블클릭하면 다음과 같은 대화 상자가 생성된다.


Member variable name : 연결할 변수 이름을 설정한다.

Variable type : 연결할 변수 타입을 설정한다. 대부분 CString 또는 int를 사용한다.

Check Box 또한 같은 방식으로 설정하고 Variable type는 BOOL 형태만 있다.

Spin

Spin의 경우 대부분 Edit Box의 Variable type를 int로 설정하여 삽입한 후 Edit Box옆에 붙여서 사용한다. Spin은 위쪽 화살표와 아래쪽 화살표가 같이 있는데 위쪽화살표를 누르면 Edit Box의 값이 1 증가하고 아래쪽 화살표를 누르면 EditBox의 값이 1 감소하도록 구성한다. 즉 Edit Box와 연계되어 동작을 수행한다.

따라서 연계하고자 하는 Edit Box 다음에 바로 Spin Control을 삽입해야 하고(탭 순서가 Edit Box 다음 바로 Spin Control), Spin Control의 Properties에서 설정을 몇 가지 해주어야 한다. Spin 컨트롤의 Properties(Spin Control에서 마우스 오른쪽 버턴을 눌어 생성된 팝업 메뉴 중 Properties를 실행)를 실행하여 나타난 대화 상자에서 Styles 탭을 선택하면 다음과 같은 대화 상자가 화면에 나타난다.


Auto buddy : Check 해준다.

Set buddy integer : Check 해준다.

No thousands : Check 해준다.

Wrap : Check 해준다.

Alignment : Right로 선택한다.

 

참고 : 탭 순서 바꾸기

탭 순서는 대화 상자의 기능이 아무리 좋아도 탭 순서(탭키를 눌렀을 때 옮겨 다니는 순서)가 잘 되어 있지 않으면 싸구려 프로그램 같고 또한 불편하다. 탭 순서는 Control의 삽입 순서 대로되고 그 순서를 바꾸고자 한다면 대화 상자 디자인 창을 띄웠을 때 추가되는 메뉴인 Layout의 부메뉴 Tab Order(Ctrl+D)를 선택하면 대화 상자는 다음과 같이 탭 순서가 표시된다.


마우스로 Control을 선택하면 탭 순서가 바뀐다(처음 선택한 Control은 1번, 두 번째 선택한 Control은 2번,.....). 참고로 Ctrl키를 누른 상황에서 마우스로 Control을 선택하면 그 번호는 바뀌지 않고 다음 선택하는 Control은 그 선택 Control을 기준으로 번호가 증가한다. 탭 순서 바꾸기 기능으로 Edit Box와 Spin Control을 연계한다.

 

Spin Control에서 위의 설정을 모두 해 주면 1가지 기능을 제외하면 모든 기능을 수행한다. 그 1가지 기능은 위쪽 화살표 키를 눌렀을 때 값이 감소하고 아래쪽 화살표 기를 눌렀을 때 값이 증가하며(원 기능과 반대)Range가 무조건 0~100까지로 된다. 이것은 Class Wizard에서 Spin Control ID를 더블클릭하여 생긴 대화 상자에서 변수화 연결한다(여기서는 변수를 m_SpinControl이라고 설정했다고 가정).


그 후 다음과 같이 Class Wizard의 Message Maps 탭을 선택한 후 WM_INITDIALOG 메시지와 연결되는 OnInitDialog함수를 생성한다.


OnInitDialog 함수에서 다음과 같이 Range를 설정하면 그 문제는 해결이 된다.

        m_SpinControl.SetRange(1, 20);   //Range가 1~20일때

주의 : 위의 경우와 같이 생성된 Control에 변화를 줄 경우 Control이 생성된 후 설정을 해야만 한다. 모든 Control이 생성된 후 호출되는 함수가 OnInitDialog이다.

 


Button

Button은 입력한 버튼을 마우스로 선택할 경우 실행되는 함수를 만들면 된다.


위와 같이 Class Wizard의 Message Maps 탭을 선택한 후 다음 그림과 같이 Object IDs를 Button Control ID로 선택하고 Message의 BN_CLICKED를 마우스로 더블클릭하면 다음과 같은 대화 상자가 생성된다.


 

함수 이름을 설정하고(되도록 그대로 사용), OK버튼을 선택하면 함수가 생성된다.

 


Radio Button

Radio Button은 여러개의 Radio Button 중 하나를 선택하도록 구성할 때 사용한다. 따라서 여러개의 Radio Button을 하나의 변수와 연결해야만 한다. Radio Button들을 하나의 변수로 연결하기 위해서는 그 Button들의 탭 순서가 순서 대로 설정되어야 하고, 가장 첫 Radio Button의 Properties에서 Group을 체크해야만 한다.


Group을 체크한 후 Class Wizard를 실행하여 Member Variable 탭을 선택하면 Group을 체크한 Radio Button의 ID가 추가된 것을 알 수 있다. 그 ID와 변수를 연결하면, 연결한 변수에 Radio Button을 선택한 값이( 순서대로 0, 1, ...) 입력된다.

 


Combo Box

  Combo Box는 주로 Radio Button의 기능과 비슷하게 여러 개의 선택항목중 하나를 선택할 때 주로 사용한다. Radio Button의 경우 항목이 작을 때 사용하고, Combo Box의 경우 항목이 많고 작은 공간에 그 기능을 구현하고자 할 때 사용한다.

Combo Box의 Properties를 선택하면 다음과 같이 Data라는 탭이 하나 더 추가된 것을 알 수 있다.


여기에 선택할 데이터를 설정한다. 한 줄 단위로 한 데이터이고 줄을 바꾸기 위해서는 Ctrl+Enter을 누르면 된다.

설정을 마치고 Class Wizard를 실행하여 Member Variable 탭을 선택하고 Combo Box의 ID와 변수를 연결하고자 하면 Variable Type이 CString만 된다는 것을 알 수 있다. 대부분 선택한 항목의 번호를 구하여 프로그램에서 사용하므로 CString이 아닌 int로 변수를 연결하는 것이 편하다.

Combo Box의 Properties에서 Style 탭을 선택하면 대화 상자는 다음과 같이 변한다.


Type : DropList로 선택한다. Class Wizard에서 변수 연결시 Variable Type을 int로 설정할 수 있게 한다.

Sort : 일반적으로 Check 하지 않는다. Sort 기능 필요시에는 Check.



List Box

  List Box는 Combo Box와 기능상 거의 비슷하다. 그러나 Combo Box는 선택항목의 갯수 및 문자열이 고정되어 있을 때 주로 사용하고, List Box는 그 선택항목이 가변일 때 주로 사용한다. 따라서 List Box의 Properties에는 Data 탭이 존재하지 않고 Source에서 데이터 항목(선택 항목)들을 추가해야만 한다. 참고로 Combo Box또한 Source에서 데이터 항목을 추가해서 사용할 수 있는데, 여기에서는 이 방법을 설명하지 않는다. 그러나 List Box와 거의 비슷하므로 도움말 만 조금 보면 구현하는 데 문제가 없을 것이다.

Class Wizard를 실행하여 Member Variable 탭을 선택하고 List Box의 ID에서 마우스로 더블클릭하면 다음과 같은 대화 상자가 생성된다.


Category를 Control로 선택하고 연결 변수를 입력한다(여기서는 m_List라고 입력했다고 가정).

 

OnInitDialog함수에 다음과 같이 추가하면 ListBox1~ListBox5의 5개 항목이 추가된다.

 const TCHAR *szListForm[] = {

  "ListBox1", "ListBox2", "ListBox3", "ListBox4", "ListBox5"

 };

         for(int i = 0; i < 5; i++)

                 m_List.AddString(szListForm[i]);


List Control

  List Control은 탐색기에서 파일을 표시하는 형태를 말한다. 보기 설정에 따라 큰 아이콘, 작은 아이콘, 자세히 등 다르게 표시할 수 있다. 그러나 대부분 대화 상자에서 사용하는 List Control은 탐색기에서 보기 설정을 자세히로 했을 경우 나타나는 모양을 주로 사용하므로 여기서는 그 모양만을 다룬다. List Control은 사용법도 다소 복잡할 뿐만 아니라 선택은 첫 번째 칼럼으로만 가능하므로 구현을 하여도 다소 불편하다. 따라서 필자는 구현 방법도 간단하게 만들고, 모든 칼럼에서 다 선택이 가능하도록 하는 Class를 제작하여 제공한다.

주로 사용하는 함수는 다음과 같다.

        //Column Title 설정

         void SetFieldTitle(TCHAR** pTitle, int* width, int nCount);

         //Column Style이 Text일 경우 Align 설정

         void SetColumnTextAlign(int nCol, int fmt);

        //Item을 삽입한다.  삽입시에도 첫번째 Column만 이함수 사용

         int InsertItemString(int nItemId, int nSubItemId, LPCTSTR str);

        //Item을 설정한다.

         void SetItemString(int nItemId, int nSubItemId, LPCTSTR str);


제공되는 Class의 이름은 ListCtrlEx.cpp 및 ListCtrlEx.h로 이 Class를 사용하기 위해서는 다음과 같이 몇가지 설정을 해주어야 한다.

ListCtrl Properties를 실행하여 Styles 탭을 선택하면 다음과 같이 화면에 나타난다.


여기에서 Owner draw fixed를 Check한다.

 다음은 Class Wizard를 실행하여 Member Variable 탭을 선택하고 List Control의 ID와 변수 연결시 Category를 Control로 선택하고 연결 변수를 입력한다(여기서는 m_ListCtrl라고 입력했다고 가정).

대화 상자의 .h 파일을 열어 보면 CListCtrl m_ListCtrl;이 추가된 것을 볼 수 있을 것이다. 여기에서 ListCtrlEx.h를 include 해 주고 CListCtrl m_ListCtrl; 대신 CListCtrlEx m_ListCtrl;를 입력한다.

그후 OnInitDialog 함수에 다음과 같이 추가하면 (ListCtrl1-1 ListCtrl1-2 ListCtrl1-3) ~ (ListCtrl5-1 ListCtrl5-2 ListCtrl5-3)의 Column 3개 Row 5개인 ListCtrl 항목이 추가된다.

  //Column Title 설정

       const TCHAR *szListCtrlTitle[] = {"Column 1", "Column 2","Column 3"};

         int nWidthForm[] = {100, 100, 100};

         m_ListCtrl.SetFieldTitle((char**)szListCtrlTitle, nWidthForm, 3);

        //각 항목에 데이타 설정

         CString strBuffer;

         for(i = 0; i < 5; i++){

                 for(j = 0; j < 3; j++){

                         strBuffer.Format("ListCtrl%d-%d", i+1, j+1);

                         if(j==0)        //Column의 처음일 경우

                                 m_ListCtrl.InsertItemString(i, j, strBuffer);

                         else

                                 m_ListCtrl.SetItemString(i, j, strBuffer);

                 }

         }

 

대화 상자 호출

 마지막으로 대화 상자를 화면상에 나타내기 위해서 다음과 같이 호출하면 된다.

 

CTestDialog dlg;

//대화상자 변수 초기화 루틴

if(!dlg.DoModal()!=IDOK)

return ;

//대화상자 설정값 읽어 오는 루틴

 

 

'▣ 참고 > C++' 카테고리의 다른 글

C++ RESOURCE 사용  (0) 2008.11.12
C++ DLL 제작  (0) 2008.11.12
C++ 프로그램 배포하기  (0) 2008.11.12
Posted by 티스토릴 :