DRAWCLI 샘플: 액티브 컨테이너 지원과 응용 프로그램별 기능 통합 설명

업데이트: 2007년 11월

DRAWCLI 샘플은 비주얼 편집 컨테이너 지원을 포함하는 개체 지향 그리기 응용 프로그램입니다. MFC 액티브 컨테이너 샘플, 즉 CONTAINER, OCLIENT 및 DRAWCLI 중에서 DRAWCLI 샘플은 액티브 컨테이너 지원과 응용 프로그램별 기능(여기서는 그리기 기능)을 통합하는 것을 가장 잘 보여 줍니다. 또한 DRAWCLI는 "모양" 및 "그리기 도구" 클래스(CDrawObjCDrawTool) 디자인에서 효과적인 C++ 다형성을 효과적으로 사용하는 방법을 보여 줍니다.

보안 정보:

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

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

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

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

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

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

샘플 빌드 및 실행

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

  1. drawcli.sln 솔루션을 엽니다.

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

  3. 프로젝트의 디버그 디렉터리에서 DRAWCLI 응용 프로그램을 열고 실행합니다.

DRAWCLI의 Windows 로고 기능

또한 DRAWCLI는 Windows 로고 규격도 설명합니다. 모든 MFC 응용 프로그램은 Win32 실행 파일, 긴 파일 이름 지원, UNC 경로 이름 지원, 시스템 색과 메트릭 사용 등 Windows 로고의 일부 요구 사항을 충족시킵니다. DRAWCLI는 다음 기능을 포함하여 Windows 로고의 나머지 요구 사항을 충족시킵니다.

  • ActiveX 지원. DRAWCLI는 복합 파일 형식으로 파일을 저장하고 현재 위치에서 활성화를 지원하며 끌어서 놓기 작업의 끌어 놓기 대상으로 사용되는 액티브 컨테이너입니다.

  • MAPI 지원. DRAWCLI는 사용자가 문서를 메일 첨부 파일로 보낼 수 있도록 File 메뉴에 "Send as Mail" 메시지를 제공합니다.

  • 큰 아이콘과 작은 아이콘 등록, .ini 파일 대신 시스템 레지스트리 사용을 포함하고 설치 및 제거 프로그램을 사용하는 셸 지침 규격. 후자의 경우 DRAWCLI에는 설치 및 제거 프로그램을 만들기 위한 Stirling Software의 도구 키트인 InstallSHIELD와 호환되는 스크립트가 포함됩니다.

또한 DRAWCLI는 Windows 응용 프로그램에 대한 다음 권장 사항을 충족시킵니다.

  • 탭 속성 페이지 사용

  • Windows 공용 컨트롤 사용

  • 마우스 오른쪽 단추 클릭에 대한 응답으로 바로 가기 메뉴 표시

  • 요약 정보를 문서에 저장

DRAWCLI의 사용자 인터페이스는 다른 개체 지향 그리기 프로그램의 인터페이스와 비슷합니다.

액티브 컨테이너 지원을 응용 프로그래별 기능과 통합

DRAWCLI 샘플은 원래 MFC 클래스를 사용하여 개발된 독립 실행형 그리기 응용 프로그램이었습니다. 그런 다음 DRAWCLI의 독립 실행형 버전은 응용 프로그램 마법사의 ActiveX 컨테이너 기능을 사용하여 만든 DRAWCLI의 두 번째 기초 버전에 통합되었습니다. 이 프로세스는 ActiveX 비주얼 편집 서버에서 SCRIBBLE에 서버 지원을 추가하는 방식과 유사합니다.

MFC ActiveX 컨테이너 응용 프로그램 디자인은 사용자가 기존 독립 실행형 MFC(doc/view) 응용 프로그램에 ActiveX 기능을 추가하고 있는지 아니면 응용 프로그램 마법사에서 생성한 ActiveX 컨테이너 응용 프로그램으로 시작하고 있는지에 관계없이 반드시 같아야 합니다. 다음은 DRAWCLI를 응용 프로그램별 코드와 ActiveX 컨테이너별 코드로 구분하는 방법에 대한 간단한 설명입니다.

  • Drawobj.cpp에서 구현되는 CDrawObj 클래스는 파생된 "모양" 클래스의 기본 클래스입니다. 이 기본 클래스는 모양 적중 테스트, 모양 이동 및 모양 크기 조정 등을 처리합니다. 다형성을 사용함으로써 DRAWCLI는 CDrawObj's의 인터페이스를 사용하여 서로 다른 클래스의 개체와 상호 작용할 수 있습니다.

  • CDrawRectCDrawPoly 클래스는 CDrawObj에서 파생됩니다. CDrawRect는 사각형, 모퉁이가 둥근 사각형, 타원 및 선을 그리는 데 사용되고, CDrawPoly는 다각형을 그리는 데 사용됩니다. 이 두 클래스는 DRAWCLI의 ActiveX 컨테이너 기능에 대해 독립적입니다.

  • 또한 CDrawOleObj 클래스도 CDrawObj에서 파생되며 포함된 개체를 나타내는 데 사용됩니다. CDrawOleObj는 ActiveX별 작업을 아래에서 설명하는 포함된 CDrawItem 개체에 위임합니다. CDrawOleObjCDrawObj에서 파생되므로 DRAWCLI에서 일반적인 모양 작업의 경우 포함되는 개체는 다른 모양 개체와 같이 취급됩니다.

  • COleClientItem에서 파생된 CDrawItem 클래스는 포함 개체에 대한 모든 ActiveX별 동작을 처리합니다. CDrawItem 구현은 CONTAINEROCLIENT 샘플의 COleClientItem 파생 클래스 구현과 비슷합니다.

  • CDrawDoc 클래스는 COleDocument에서 파생됩니다. COleDocument 개체는 CDrawObj 개체의 CObList를 유지 관리합니다. CDrawDocEdit Paste, Paste Link, Links 등 여러 개의 ActiveX 컨테이너별 메뉴 명령을 기본 클래스 COleDocument에 위임합니다.

  • CDrawView 클래스는 CScrollView에서 파생됩니다. CDrawView의 ActiveX별 구현은 CONTAIN 및 OCLIENT 샘플의 뷰 클래스 구현과 비슷합니다. DRAWCLI의 그리기 관련 사용자 인터페이스는 CDrawView에서도 구현됩니다.

키워드

이 샘플에서는 다음의 키워드를 보여 줍니다.

AfxGetApp; AfxGetMainWnd; AfxMessageBox; AfxOleInit; AfxRegisterWndClass; AfxThrowMemoryException; CArchive::Close; CArchive::IsStoring; CBitmap::CreateCompatibleBitmap; CBrush::CreateBrushIndirect; CBrush::CreateSolidBrush; CCmdTarget::BeginWaitCursor; CCmdTarget::EndWaitCursor; CCmdUI::Enable; CCmdUI::SetCheck; CCmdUI::SetRadio; CColorDialog::DoModal; CColorDialog::GetColor; CControlBar::EnableDocking; CControlBar::GetBarStyle; CControlBar::SetBarStyle; CDC::Attach; CDC::BitBlt; CDC::CreateCompatibleDC; CDC::DPtoLP; CDC::DrawFocusRect; CDC::FillRect; CDC::GetClipBox; CDC::GetDeviceCaps; CDC::HIMETRICtoDP; CDC::IntersectClipRect; CDC::IsPrinting; CDC::LPtoDP; CDC::LineTo; CDC::MoveTo; CDC::OffsetViewportOrg; CDC::OffsetWindowOrg; CDC::PatBlt; CDC::SelectObject; CDC::SetBkColor; CDC::SetBrushOrg; CDC::SetMapMode; CDC::SetViewportExt; CDC::SetViewportOrg; CDC::SetWindowExt; CDC::SetWindowOrg; CDialog::DoModal; CDocTemplate::SetContainerInfo; CDocument::GetFirstViewPosition; CDocument::GetNextView; CDocument::GetTitle; CDocument::OnNewDocument; CDocument::OnOpenDocument; CDocument::OnSaveDocument; CDocument::SetModifiedFlag; CDocument::SetTitle; CDocument::UpdateAllViews; CFrameWnd::DockControlBar; CFrameWnd::EnableDocking; CFrameWnd::LoadFrame; CFrameWnd::OnCreateClient; CGdiObject::UnrealizeObject; CMDIChildWnd::Create; CMenu::GetSubMenu; CMenu::LoadMenu; CMenu::TrackPopupMenu; CObList::AddTail; CObList::GetCount; CObList::GetHeadPosition; CObList::GetNext; CObList::IsEmpty; CObList::RemoveAll; CObList::RemoveAt; CObject::AssertValid; CObject::Dump; CObject::IsKindOf; CObject::Serialize; COleClientItem::Close; COleClientItem::CreateCloneFrom; COleClientItem::CreateFromData; COleClientItem::CreateStaticFromData; COleClientItem::Deactivate; COleClientItem::Delete; COleClientItem::DoVerb; COleClientItem::Draw; COleClientItem::GetActiveView; COleClientItem::GetClipboardData; COleClientItem::GetDocument; COleClientItem::GetExtent; COleClientItem::GetInPlaceWindow; COleClientItem::GetItemState; COleClientItem::GetType; COleClientItem::IsInPlaceActive; COleClientItem::OnChange; COleClientItem::OnChangeItemPosition; COleClientItem::OnGetItemPosition; COleClientItem::Release; COleClientItem::SetItemRects; COleClientItem::UpdateLink; COleDataObject::AttachClipboard; COleDataObject::GetFileData; COleDataObject::IsDataAvailable; COleDataSource::CacheGlobalData; COleDataSource::SetClipboard; COleInsertDialog::CreateItem; COleInsertDialog::DoModal; COleInsertDialog::GetSelectionType; CPen::CreatePen; CPen::CreatePenIndirect; CPrintDialog::CreatePrinterDC; CRect::BottomRight; CRect::Height; CRect::InflateRect; CRect::IntersectRect; CRect::IsRectEmpty; CRect::NormalizeRect; CRect::OffsetRect; CRect::SetRect; CRect::TopLeft; CRect::Width; CRectTracker::Draw; CRgn::CreateEllipticRgnIndirect; CRgn::CreatePolygonRgn; CRgn::CreateRoundRectRgn; CRgn::RectInRegion; CScrollView::GetDeviceScrollPosition; CScrollView::SetScrollSizes; CStatusBar::Create; CStatusBar::SetIndicators; CString::MakeLower; CToolBar::Create; CView::DoPreparePrinting; CView::GetDocument; CView::IsSelected; CView::OnActivateView; CView::OnBeginPrinting; CView::OnDragEnter; CView::OnDragLeave; CView::OnDragOver; CView::OnDraw; CView::OnDrop; CView::OnEndPrinting; CView::OnInitialUpdate; CView::OnPrepareDC; CView::OnPreparePrinting; CView::OnPrint; CView::OnScrollBy; CView::OnUpdate; CWinApp::AddDocTemplate; CWinApp::EnableShellOpen; CWinApp::InitInstance; CWinApp::LoadStdProfileSettings; CWinApp::RegisterShellFileTypes; CWinApp::SetRegistryKey; CWnd::DoDataExchange; CWnd::GetCapture; CWnd::GetParentFrame; CWnd::Invalidate; CWnd::InvalidateRect; CWnd::OnCreate; CWnd::OnDestroy; CWnd::OnEraseBkgnd; CWnd::OnLButtonDblClk; CWnd::OnLButtonDown; CWnd::OnLButtonUp; CWnd::OnMouseMove; CWnd::OnSetFocus; CWnd::OnSize; CWnd::PreCreateWindow; CWnd::ScreenToClient; CWnd::SetCapture; CWnd::SetFocus; CWnd::ShowWindow; CWnd::UpdateWindow; DragAcceptFiles; Ellipse; GetACP; GetKeyState; GetMapMode; GetVersion; GlobalFree; GlobalLock; GlobalUnlock; LOWORD; LineTo; LoadCursor; MAKELONG; MoveTo; MulDiv; Polygon; RGB; Rectangle; RegisterClipboardFormat; ReleaseCapture; RoundRect; SelectObject; SetCursor; free; malloc; memcpy; min; realloc; wcstombs

참고:

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

참고 항목

기타 리소스

MFC 샘플