DIBLOOK 샘플: DIB 및 색상표 사용

업데이트: 2007년 11월

DIBLOOK 샘플에서는 DIB(장치 독립적 비트맵)의 사용 방법을 보여 주고, 이와 밀접하게 관련된 색상표의 사용 방법을 보여 줍니다.

DIBLOOK에서는 외부 정의 파일 형식(이 경우에는 DIB 파일 형식)의 문서도 보여 줍니다. 이는 프레임워크에서 자동으로 문서의 Serialize 함수를 호출하여 해당 문서의 내용을 디스크에 저장할 때의 내부 정의 파일 형식과 비교하기 위한 것입니다. DIBLOOK에서는 클립보드, CFile 및 스크롤 뷰의 사용 방법도 보여 줍니다.

보안 정보:

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

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

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

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

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

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

샘플 빌드 및 실행

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

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

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

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

DIBLOOK은 동시에 여러 비트맵을 볼 수 있는 MDI(다중 문서 인터페이스) 응용 프로그램입니다. 기존의 장치 독립적 비트맵 파일(.dib)이나 장치 종속 비트맵 파일(.bmp)을 열려면 File Open을 사용합니다. 또한 다음과 같이 클립보드를 사용하여 그림판 등의 다른 응용 프로그램에서 비트맵을 복사하는 방법으로 새 비트맵 문서를 만들 수도 있습니다.

  • 다른 응용 프로그램에서 클립보드로 비트맵을 복사합니다.

  • DIBLOOK의 File 메뉴에 있는 New 명령을 사용하여 새 비트맵 문서를 만듭니다.

  • Edit 메뉴에 있는 Paste 명령을 사용하여 클립보드의 비트맵을 새 문서로 복사합니다.

DIBLOOK에서 이미지를 편집할 수는 없지만 File 메뉴의 Save As 명령을 사용하여 다른 파일에 비트맵을 저장할 수는 있습니다. 비트맵은 원본 형식이 장치 종속적인 경우에도 장치 독립적 비트맵 형식으로 저장됩니다.

외부 정의 문서 형식

DIBLOOK에서는 비트맵을 표준 Windows 장치 독립적 비트맵 형식으로 읽고 저장합니다. 메모리의 비트맵은 Windows에서 불투명 HDIB 핸들을 사용하여 관리됩니다. 비트맵의 내부 형식은 해당 응용 프로그램에서 볼 수 있습니다. 따라서 DIBLOOK의 문서 자체에서 비트맵 비트나 색상표를 저장하지는 않습니다. 대신 CDibDoc가 DIB(HDIB m_hDIB)에 대한 핸들을 보유합니다. CDocument::Serialize 재정의에서 문서 항목을 serialize하는 순서에 따라 문서 형식이 암시적으로 정의되는 응용 프로그램과 달리, DIBLOOK은 문서 형식이 대개 DIB 등의 표준 파일 형식으로 외부에서 정의되는 응용 프로그램입니다.

DIBLOOK에서는 CDocument::Serialize를 재정의하지 않으며, 대신 CDocument::OnOpenDocumentOnSaveDocument를 재정의합니다. 두 경우 모두 프레임워크에 의해 전달되는 pszPathName을 사용하여 CFile 개체를 열고 DIB를 읽거나 저장합니다. DIB 파일을 읽고 저장하기 위한 실제 코드는 Myfile.cpp에서 제공합니다. 이 코드는 DIB 파일을 읽고 저장해야 하는 모든 응용 프로그램에서 다시 사용할 수 있습니다.

DIB 및 색상표 사용

DIBLOOK에서는 창에 DIB를 표시하는 방법과 DIB를 표시하는 창에 사용할 색상표를 준비하는 방법을 보여 줍니다.

DIBLOOK은 파일에서 DIB를 읽은 다음 해당 DIB의 색상표에 따라 CPalette 개체를 준비하고 해당 색상표를 CDibDoc 개체에 m_palhDIB로 저장합니다. DIBLOOK이 CDibView::OnDraw에서 DIB를 표시할 때는 DIBLOOK의 Dibapi.cpp 파일에서 구현된 Windows ::PaintDIB 루틴을 호출합니다. 그런 다음에는 PaintDIB가 해당 DIB의 색상표를 기본 색상표로 사용하여 Windows 함수인 ::SetDIBitsToDevice 또는 ::StretchDIBits를 호출합니다. Dibapi.cpp의 DIB 표시 루틴은 DIB를 표시하는 모든 응용 프로그램에서 다시 사용할 수 있습니다.

DIBLOOK에서는 현재 활성화된 창에 최적인 색상표를 선택합니다. DIBLOOK에서는 현재 활성화된 MDI 자식 창에 표시된 DIB의 색상표와 일치하는 색상표를 선택합니다. 한 응용 프로그램에서 다른 응용 프로그램으로 입력 포커스가 이동할 때 포커스를 받는 응용 프로그램의 최상위 창에서는 WM_QUERYNEWPALETTE 메시지를 받습니다. DIBLOOK의 CMainFrame 창에서는 응용 프로그램 정의 메시지인 WM_DOREALIZE를 각 하위 창에 보내는 방법으로 이 메시지를 처리합니다. 하위 창 목록에는 열려 있는 문서의 모든 뷰가 표시됩니다. 그런 다음 각 뷰에서는 해당 뷰가 활성 뷰인지 비활성 뷰인지 여부에 따라 색상표 디스플레이 컨텍스트를 전경 또는 배경으로 선택합니다.

다른 응용 프로그램에서 시스템 색상표를 변경하면 DIBLOOK은 WM_PALETTECHANGED 메시지를 받습니다. 이 경우 CMainFrame 창에서는 다시 응용 프로그램 정의 메시지인 WM_DOREALIZE를 각 뷰에 보냅니다. 각 뷰에서는 색상표의 디스플레이 컨텍스트가 배경으로 선택되지만 다른 응용 프로그램에서는 전경으로 선택됩니다.

응용 프로그램 내의 한 뷰에서 다른 뷰로 포커스가 이동하면 DIBLOOK에서는 현재 활성화된 뷰에 대해 색상표를 선택하여 나타냅니다(CDibView::OnActivateView 참조). 새 색상표가 나타나면 Windows에서는 DIBLOOK을 포함하여 모든 응용 프로그램의 최상위 창에 WM_PALETTECHANGED 메시지를 보냅니다. DIBLOOK에서는 다른 뷰의 다른 DIB와 연관된 색상표를 배경 팔레트로 나타냄으로써 메시지를 처리합니다.

키워드

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

AfxGetApp, CCmdTarget::BeginWaitCursor, CCmdTarget::EndWaitCursor, CCmdUI::Enable, CDC::RealizePalette, CDC::SelectPalette, CDialog::DoModal, CDocument::DeleteContents, CDocument::OnNewDocument, CDocument::OnOpenDocument, CDocument::OnSaveDocument, CDocument::ReportSaveLoadException, CDocument::SetModifiedFlag, CDocument::SetPathName, CDocument::UpdateAllViews, CFile::Abort, CFile::Close, CFile::GetLength, CFile::Open, CFile::Read, CFile::ReadHuge, CFile::Write, CFile::WriteHuge, CFrameWnd::GetActiveView, CFrameWnd::LoadFrame, CMDIFrameWnd::MDIGetActive, CObject::AssertValid, CObject::Dump, CPalette::CreatePalette, CScrollView::SetScrollSizes, CStatusBar::Create, CStatusBar::SetIndicators, CString::LoadString, CToolBar::Create, CToolBar::LoadBitmap, CToolBar::SetButtons, CView::DoPreparePrinting, CView::GetDocument, CView::OnActivateView, CView::OnDraw, CView::OnInitialUpdate, CView::OnPreparePrinting, CWinApp::AddDocTemplate, CWinApp::EnableShellOpen, CWinApp::InitInstance, CWinApp::LoadStdProfileSettings, CWinApp::RegisterShellFileTypes, CWnd::DoDataExchange, CWnd::OnCreate, CWnd::OnPaletteChanged, CWnd::OnQueryNewPalette, CWnd::OpenClipboard, CWnd::SendMessage, CWnd::SendMessageToDescendants, CWnd::ShowWindow, CWnd::UpdateWindow, CloseClipboard, DragAcceptFiles, EmptyClipboard, GetClipboardData, GetDeviceCaps, GlobalAlloc, GlobalFree, GlobalLock, GlobalSize, GlobalUnlock, IsClipboardFormatAvailable, MessageBox, SelectPalette, SetClipboardData, SetDIBitsToDevice, SetStretchBltMode, StretchDIBits, memcpy

참고:

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

참고 항목

기타 리소스

MFC 샘플