보통 어플리케이션의 옵션 창에서 많이 볼 수 있는 다이얼로그를 만드는 방법을 살펴보겠습니다.

인터넷 익스플로러의 옵션 창입니다. 보는 바와 같이 탭 컨트롤을 이용하여 다중 다이얼로그를 좁은 공간에 효율적으로 배치하고 있습니다. 그럼 이 다이얼로그는 어떻게 구성되어 있을까요. class hierarchy를 살펴보겠습니다.

레이아웃 메니져를 통해 살표보니 위의 그림과 같이 나오는군요. 아시다시피 다이얼로그의 클래스 이름은 #32770 입니다. MS에서 정해놓은 이름이지요. 살표보면 루트 다이얼로그에 자식 다이얼로그가 7개, 탭컨트롤 1개, 버튼이 4개 있습니다.화면에는 확인, 취소, 적용 버튼이 있지만, 도움말 버튼이 숨어 있죠. (ie8 인데.. 왜 숨겨놨을까요.. @.@a)

사진에서도 확인할 수 있듯이 각 탭마다 서로 다른 다이얼로그가 있음을 바로 알 수 있습니다. 그럼 일반 탭에 있는 다이얼로그를 살짝 움직여 보겠습니다. 위치값만 바꾸면 되니 레이아웃 메니져에서 위치만 살짝 수정해주시면 아래와 같이 확인할 수 있죠.

자. 그럼 이런 옵션 다이얼로그를 직접 만들어 보겠습니다.

만드는 것은 그리 어렵지 않습니다. 다이얼로그를 각 탭의 갯수만큼만 더 만들어 주시면 되구요.
초반에 다이얼로그 위치를 잡을 때 아래와 같이 탭 컨트롤의 위치와 크기, 탭 버튼의 높이 정보를 이용해서 다이얼로그를 생성해 주시면 됩니다.

위치와 크기를 구하는 함수는 아래의 코드를 참고하세요.

  232     int iw,ih;

  233     CRect c,w,rc,th;

  234     GetWindowRect(&w);

  235     GetClientRect(&c);

  236     iw = (w.Width()-c.Width())/2;

  237     ih = (w.Height()-c.Height())-iw;

  238     m_ctrlTab.GetWindowRect(&rc);

  239     m_ctrlTab.GetItemRect(0, &th);

  240 

  241     rc.left        = rc.left - iw;

  242     rc.right    = rc.right - iw -2;

  243     rc.top        = rc.top - ih;

  244     rc.bottom    = rc.bottom - ih -2;

  245     rc.top        = rc.top + th.bottom;

  246     rc.DeflateRect(1,1);

  247 

  248     CTempDlg* p1 = new CTempDlg;

  249     p1->Create(CTempDlg::IDD, this);

  250     p1->MoveWindow(&rc, TRUE);

  251     p1->ShowWindow(SW_SHOW);

  252     m_pTempDlg = p1;


마지막으로 할 일은, xp 의 경우 탭 컨트롤의 바탕색이 일반 다이얼로그색이 아닌 밝은 은색으로 채워진다는 것인데, 이것을 다이얼로그에 직접 적용하려면 테마쪽 api 를 한번 호출해줘야 합니다.

다이얼로그 초기화 함수인 OnInitDialog() 에 밑에 코드를 한번 호출해 주세요.

   40 EnableThemeDialogTexture(GetSafeHwnd(), ETDT_ENABLETAB);


이제 정말 다 되었습니다.
아래의 그림의 첫 탭에는 xp 스타일을 적용한 것이구요, 3번째 탭에는 xp 스타일을 적용하지 않았을 때의 경우 입니다.


이렇게 간단하게 옵션 다이얼로그를 구성하는 방법에 대해 알아보았습니다.

p.s. aHR0cDovL3pleHRvci50aXN0b3J5LmNvbS9yc3M=




  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기