DIBLOOK サンプル : DIB およびカラー パレットの使用例
更新 : 2007 年 11 月
DIBLOOK サンプルでは、デバイスに依存しないビットマップ (DIB: Device-Independent Bitmap)、およびこれに関連するカラー パレットの使用方法を示します。
また、ファイル形式が外部で定義されている (この場合は DIB ファイル形式) ドキュメントの例もあります。このファイル形式は、内部的に定義されたファイル形式とは対照的です。内部定義のファイル形式は、フレームワークが自動的にドキュメントの Serialize 関数を呼び出してドキュメントの内容をディスクに保存すると、自動的に指定されます。さらに、DIBLOOK には、クリップボード、CFile、およびスクロール ビューの使用例もあります。
セキュリティに関するメモ : |
---|
このサンプル コードは概念を示す目的で提供されているものです。必ずしも最も安全なコーディング手法に従っているわけではないので、アプリケーションまたは Web サイトでは使用しないでください。Microsoft は、サンプル コードが意図しない目的で使用された場合に、付随的または間接的な損害について責任を負いません。 |
サンプルとそのインストール手順を取得するには
Visual Studio で、[ヘルプ] メニューの [サンプル] をクリックします。
詳細については、「サンプル ファイルの格納場所」を参照してください。
使用できるサンプルの最新バージョンと完全な一覧については、オンラインの Visual Studio 2008 Samples のページを参照してください。
サンプルは、コンピュータのハード ディスク上にもあります。既定では、サンプルおよび Readme ファイルは、\Program Files\Visual Studio 9.0\Samples\ の下のフォルダにコピーされます。Visual Studio Express Edition の場合、すべてのサンプルはオンライン上にあります。
サンプルのビルドと実行
DIBLOOK サンプルをビルドおよび実行するには
ソリューション DibLook.sln を開きます。
[ビルド] メニューの [ビルド] をクリックします。
[デバッグ] メニューの [デバッグなしで開始] をクリックします。
DIBLOOK は、同時に複数のビットマップを表示できるマルチ ドキュメント インターフェイス (MDI: Multiple Document Interface) アプリケーションです。[File] メニューの [Open] をクリックすると、デバイスに依存しない既存のビットマップ (.dib) ファイルまたはデバイスに依存する既存のビットマップ (.bmp) ファイルを開くことができます。または、次のようにクリップボードを使用して、ペイントブラシなどのアプリケーションからビットマップをコピーし、新しいビットマップ ドキュメントを作成することもできます。
ほかのアプリケーションからビットマップをクリップボードにコピーします。
DIBLOOK の [File] メニューの [New] コマンドを使用して、新しいビットマップ ドキュメントを作成します。
[Edit] メニューの [Paste] コマンドを使用して、クリップボードから新しいドキュメントにビットマップをコピーします。
DIBLOOK ではイメージを編集できませんが、[File] メニューの [Save As] コマンドを使用してビットマップを別のファイルに保存できます。元の形式がデバイスに依存していた場合でも、ビットマップはデバイスに依存しないビットマップ形式で保存できます。
外部定義ドキュメント形式
DIBLOOK は、デバイスに依存しない標準 Windows ビットマップ形式でビットマップの読み取りと格納を行います。メモリに格納したビットマップは、非透過の HDIB ハンドルを使用して Windows によって管理されます。ビットマップの内部形式は、アプリケーションから参照できます。したがって、DIBLOOK のドキュメント自体にビットマップのビットまたはカラー テーブルは格納されません。その代わりに、CDibDoc は DIB (HDIB m_hDIB) へのハンドルを保持します。DIBLOOK は、ドキュメントの形式が外部で定義される (通常、DIB などの標準ファイル形式) アプリケーションです。これと対照的に、CDocument::Serialize のオーバーライドでドキュメント項目がシリアル化されるシーケンスに従って、ドキュメントの形式が暗黙に定義されるアプリケーションもあります。
DIBLOOK では、CDocument::Serialize はオーバーライドされません。代わりに、DIBLOOK では CDocument::OnOpenDocument と OnSaveDocument がオーバーライドされます。これらのオーバーライドでは、フレームワークによって渡される pszPathName を使用して、CFile オブジェクトを開き、DIB の読み取りまたは保存を行います。DIB ファイルの読み取りや保存のための実際のコードは、Myfile.cpp にあります。このコードは、DIB ファイルの読み取りや保存を必要とする、すべてのアプリケーションで再利用できます。
DIB およびカラー パレットの使用
DIBLOOK には、ウィンドウで DIB を表示する例、および DIB を表示するウィンドウ用にカラー パレットを準備する例があります。
DIBLOOK はファイルから DIB を読み取ると、DIB のカラー テーブルに基づいて CPalette オブジェクトを準備し、そのパレットを m_palhDIB として CDibDoc オブジェクトに格納します。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 を各下位ウィンドウに送ることにより、このメッセージを処理します。下位ウィンドウの一覧には、開いている可能性がある複数のドキュメントのすべてのビューが含まれています。さらに、各ビューは、ビューがアクティブかどうかに応じて、優先表示パレットまたは 2 次パレットとしてディスプレイ コンテキストに取り込まれます。
別のアプリケーションがシステム パレットを変更すると、DIBLOOK は WM_PALETTECHANGED メッセージを受け取ります。この場合も、CMainFrame ウィンドウは、アプリケーション定義メッセージ WM_DOREALIZE を各ビューに送ります。各ビューは、それぞれのパレットを 2 次パレットとしてディスプレイ コンテキストに取り込みます。ただし、別のアプリケーションには優先表示パレットが生成されます。
フォーカスがアプリケーションのビュー内で移行するとき、DIBLOOK は現在アクティブなビューのパレットを選択して実現します。CDibView::OnActivateView を参照してください。新しいパレットが実現されると、Windows は、WM_PALETTECHANGED メッセージをすべてのアプリケーションの最上位ウィンドウ (DIBLOOK のウィンドウも含む) に送ります。DIBLOOK は、ほかのビューの DIB に関連付けられているカラー テーブルを 2 次パレットとして実現することによって、このメッセージを処理します。
キーワード
このサンプルでは、次のキーワードを使用します。
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++ のウィザード、ライブラリ、およびコンパイラの変更が反映されていませんが、必要なタスクを実行する方法は示されています。 |