Share via


DLGCBR32 샘플: 대화 상자에 상태 표시줄 및 도구 모음 추가 설명

업데이트: 2007년 11월

DLGCBR32 샘플에서는 대화 상자에 상태 표시줄 및 도구 모음을 추가하는 방법을 보여 줍니다. 또한 모덜리스 대화 상자를 MFC 응용 프로그램의 주 창으로 사용하는 데 관련된 여러 가지 기술도 보여 줍니다.

MFC 응용 프로그램에서는 상태 표시줄 및 도구 모음 등의 컨트롤 막대를 프레임 창에 추가할 수 있습니다. 그러나 대부분의 응용 프로그램에서는 간단한 대화 상자 기반 사용자 인터페이스로 충분합니다. MFC에서는 대화 상자에 컨트롤 막대를 추가하기 위한 기본 제공 지원이 없습니다.

보안 정보:

이 샘플 코드는 개념을 보여 주기 위해 제공되며 가장 안전한 코드 작성 방법을 제시하지 않을 수 있으므로 응용 프로그램이나 웹 사이트에서 사용할 수 없습니다. Microsoft는 샘플 코드를 원래 용도 이외의 다른 용도로 사용하는 경우 발생하는 부수적이나 파생적인 손해에 대해 책임을 지지 않습니다.

샘플 및 이를 설치하기 위한 지침을 가져오려면

  • Visual Studio의 도움말 메뉴에서 샘플을 클릭합니다.

    자세한 내용은 샘플 파일 찾기를 참조하십시오.

  • 최신 버전 및 전체 샘플 목록은 Visual Studio 2008 Samples 페이지에서 온라인으로 사용할 수 있습니다.

  • 컴퓨터의 하드 디스크에서도 샘플을 찾을 수 있습니다. 기본적으로 샘플과 추가 정보 파일은 \Program Files\Visual Studio 9.0\Samples\ 아래의 폴더에 복사됩니다. Visual Studio Express Edition의 경우에는 모든 샘플이 온라인에 있습니다.

샘플 빌드 및 실행

DLGCBR32 샘플을 빌드하고 실행하려면

  1. 솔루션 파일인 Dlgcbr32.sln을 엽니다.

  2. 빌드 메뉴에서 빌드를 클릭합니다.

  3. 디버그 메뉴에서 디버깅하지 않고 시작을 클릭합니다.

대화 상자에 컨트롤 막대 추가

대화 상자에 컨트롤 막대를 추가하려면 일반적인 방법으로 컨트롤 막대를 만든 다음 대화 상자의 클라이언트 영역 내에 클라이언트 막대를 위한 공간을 만듭니다. 컨트롤 막대가 올바르게 작동하기 위해서는 대화 상자에 프레임 창의 일부 기능이 중복되어야 합니다. 또한 컨트롤 막대에 대해 ON_UPDATE_COMMAND_UI 처리기가 작동하도록 하려면 새 컨트롤 막대 클래스를 파생시키고 WM_IDLEUPDATECMDUI 메시지를 처리해야 합니다. 해당 대화 상자가 응용 프로그램의 주 창이 아닌 경우에는 해당 대화 상자의 컨트롤 막대에 WM_IDLEUPDATECMDUI 메시지를 전달하도록 부모 프레임 창도 수정해야 합니다.

대화 상자의 클라이언트 영역 내에 컨트롤 막대를 위한 공간을 만들려면 대화 상자의 OnInitDialog 함수에서 다음 단계를 따릅니다.

  1. 컨트롤 막대를 만듭니다. RepositionBars의 reposQuery 옵션을 사용하여 컨트롤 막대에 필요한 공간을 확인합니다.

    CRect rcClientStart;
    CRect rcClientNow;
    GetClientRect(rcClientStart);
    RepositionBars(AFX_IDW_CONTROLBAR_FIRST,
                   AFX_IDW_CONTROLBAR_LAST,
                   0, reposQuery, rcClientNow);
    
  2. 대화 상자의 위쪽 또는 왼쪽 클라이언트 영역에서 컨트롤을 이동하여 컨트롤 막대에 사용될 공간을 확보합니다. 대화 상자에 메뉴가 있는 경우에는 해당 메뉴에 사용될 공간도 확보해야 합니다.

    CPoint ptOffset(rcClientNow.left - rcClientStart.left,
                    rcClientNow.top - rcClientStart.top);
    CRect rcChild;
    CWnd* pwndChild = GetWindow(GW_CHILD);
    while (pwndChild)
        {
           pwndChild->GetWindowRect(rcChild);
           ScreenToClient(rcChild);
           rcChild.OffsetRect(ptOffset);
           pwndChild->MoveWindow(rcChild, FALSE);
           pwndChild = pwndChild->GetNextWindow();
        }
    
  3. 컨트롤 막대에 사용되는 공간 크기만큼 대화 상자 창의 크기를 늘립니다.

    CRect rcWindow;
    GetWindowRect(rcWindow);
    rcWindow.right += rcClientStart.Width() - rcClientNow.Width();
    rcWindow.bottom += rcClientStart.Height() - rcClientNow.Height();
    MoveWindow(rcWindow, FALSE);
    
  4. RepositionBars를 사용하여 컨트롤 막대의 위치를 지정합니다.

상태 표시줄의 첫 번째 창을 메뉴 항목 텍스트로 업데이트하려면 대화 상자 클래스에서 WM_MENUSELECT, WM_ENTERIDLE, WM_SETMESSAGESTRINGWM_POPMESSAGESTRING을 처리해야 합니다. 또한 이러한 메시지에 대한 CFrameWnd 처리기의 기능도 복제해야 합니다. 이러한 메시지 처리기의 예를 보려면 샘플 프로그램의 CModelessMain 클래스를 참조하십시오.

도구 모음 단추에 대한 도구 설명을 표시하려면 TTN_NEEDTEXTWTTN_NEEDTEXTA 알림을 처리해야 합니다.

다른 상태 표시줄 창과 도구 모음 단추에 대해 ON_UPDATE_COMMAND_UI 처리기가 작동하도록 하려면 새 컨트롤 막대 클래스를 파생시키고 WM_IDLEUPDATECMDUI에 대한 메시지 처리기를 구현해야 합니다. OnUpdateCmdUI의 기본 컨트롤 막대 구현에서는 부모 창이 프레임 창인 것으로 가정하기 때문에 이 작업이 꼭 필요합니다. 그러나 OnUpdateCmdUICCmdTarget 포인터만 필요로 하는 함수에 부모 창 포인터를 전달하기만 합니다. 따라서 사용자가 전달하는 부모 창 포인터가 컴파일러 요구 사항을 충족시키는 CFrameWnd 포인터라는 사실을 임시로 OnUpdateCmdUI에 알릴 수 있습니다. 예를 들면 다음과 같습니다.

LRESULT CDlgToolBar::OnIdleUpdateCmdUI(WPARAM wParam, LPARAM lParam)
{
   if (IsWindowVisible())
   {
      CFrameWnd* pParent = (CFrameWnd*)GetParent();
      if (pParent)
         OnUpdateCmdUI(pParent, (BOOL)wParam);
   }
   return OL;
}

주 창이 아닌 대화 상자에 WM_IDLEUPDATECMDUI 메시지를 전달하려면 프레임 창 클래스에 대화 상자 포인터를 저장하고 해당 클래스에 WM_IDLEUPDATECMDUI 처리기를 만듭니다. 이 처리기는 CWnd::SendMessageToDescendants를 사용하여 대화 상자 자식 창에 WM_IDLEUPDATECMDUI 메시지를 보내야 합니다. 그런 다음 프레임 창 내에서 메시지에 대한 기본 처리를 수행합니다.

참고:

이 샘플을 비롯한 일부 샘플은 Visual C++ 마법사, 라이브러리 및 컴파일러의 변경 내용을 반영하도록 수정되지 않았지만 해당 작업의 수행 방법을 보여 줍니다.

참고 항목

기타 리소스

MFC 샘플