DIBLOOK 範例:說明 DIB 和色板的用法

更新:2007 年 11 月

DIBLOOK 範例會解說與裝置無關之點陣圖 (DIB) 的用法以及如何使用之間關聯性高的色板。

DIBLOOK 也會說明一個具有外部定義檔案格式 (在本例中是指 DIB 檔案格式) 的文件。外部定義檔案格式和內部定義的檔案格式不同,這種檔案格式會在架構自動呼叫文件的 Serialize 函式將文件內容儲存在磁碟時暗示。DIBLOOK 會進一步說明剪貼簿、CFile 和捲動檢視的用法。

安全性注意事項:

這個程式碼範例僅供概念說明之用,同時因為範例中的程式碼撰寫並沒有周全的顧及所有安全性問題,所以本範例不適用於實際執行的應用程式或網站中。如果使用者擅自將範例程式碼用於其他意圖而導致連帶事件或重大損害時,Microsoft 將不承擔任何責任。

若要取得範例和指示以便進行安裝:

  • 按一下 Visual Studio [說明] 功能表上的 [範例]。

    如需詳細資訊,請參閱尋找範例檔案

  • 最新版的完整範例清單可從 Visual Studio 2008 範例網頁 (英文) 取得。

  • 您也可以將範例置於電腦硬碟中。根據預設,範例和讀我檔案都會複製到 \Program Files\Visual Studio 9.0\Samples\ 下的資料夾中。對於所有的 Visual Studio Express 版,所有範例都可在線上找到。

建置和執行範例

若要建置並執行 DIBLOOK 範例

  1. 開啟 DibLook.sln 方案。

  2. 在 [建置] 功能表上按一下 [建置]。

  3. 在 [偵錯] 功能表上,按一下 [啟動但不偵錯]。

DIBLOOK 是一個讓您可同時檢視多個點陣圖的多重文件介面 (MDI) 應用程式。使用 [開啟舊檔] 來開啟現有的與裝置無關點陣圖 (.dib) 檔或與裝置相關點陣圖 (.bmp) 檔。或者,您可參考下列示範步驟,使用剪貼簿複製另一個應用程式 (例如小畫家) 的點陣圖,來建立新的點陣圖文件:

  • 複製其他應用程式點陣圖到剪貼簿

  • 使用 [檔案] 功能表的 DIBLOOK [新增] 命令,建立新的點陣圖文件

  • 使用 [編輯] 功能表的 [貼上] 命令,將剪貼簿的點陣圖複製到新文件中

雖然無法在 DIBLOOK 中編輯影像,但是您可以使用 [檔案] 功能表的 [另存新檔] 命令,將該點陣圖儲存至另一個檔案中。即使該點陣圖的原始格式是與裝置相關,點陣圖會仍會以與裝置無關點陣圖格式儲存。

外部定義的文件格式

DIBLOOK 會讀取和儲存標準 Windows 與裝置無關點陣圖格式的點陣圖。然而在記憶體中,該點陣圖會由 Windows 使用不透明 HDIB 控制代碼來管理。點陣圖的內部格式就該應用程式而言會是可見的,因此,DIBLOOK 文件本身並不會儲存點陣圖位元或是色彩表。而是 CDibDoc 會為 DIB (HDIB m_hDIB) 預留控制代碼。DIBLOOK 是具有外部定義文件格式 (通常是某些標準檔案格式標準,例如,DIB) 的應用程式,而有些應用程式恰好相反,因為這類應用程的文件格式是採隱含定義,而且是根據該應用程式序列化 CDocument::Serialize 覆寫中文件項目的順序。

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。任何顯示 DIB 的應用程式都可以重複使用 Dibapi.cpp 中的 DIB 顯示常式。

DIBLOOK 會選取最適用於目前使用中視窗的色板。DIBLOOK 會選取與目前作用中 MDI 子視窗中顯示的 DIB 色彩表相符的色板。當應用程式即將接收輸入焦點 (從另一個應用程式轉移出來) 時,其頂層視窗會接收 WM_QUERYNEWPALETTE 訊息。DIBLOOK 的 CMainFrame 視窗處理這則訊息的方法為:將應用程式定義的訊息 WM_DOREALIZE 傳送至每一個子代視窗 (Descendant Window)。子代視窗的清單包含所有可能的多個開啟文件的檢視。每一個檢視便可依序根據該檢視作用中與否,來選取其顯示內容做為前景或背景色板。

如果另一個應用程式變更系統調色盤,DIBLOOK 便會接收到 WM_PALETTECHANGED 訊息。在這種情況下,CMainFrame 視窗會再度將應用程式定義的 WM_DOREALIZE 訊息,傳送至每個檢視。每個檢視會將其色板選入顯示內容做為背景色板,但是卻會為其他應用程式產生前景色板。

當焦點在應用程式內由某個檢視轉移至另一個檢視時,DIBLOOK 便會為目前作用中檢視選取並擁有色板 (請參考 CDibView::OnActivateView)。有新色板之後,Windows 會將 WM_PALETTECHANGED 訊息傳送至所有應用程式的頂層視窗,其中包括 DIBLOOK 的頂層視窗。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 範例