DIBLOOK は、MDI アプリケーションです。MDI により複数のビットマップを同時に表示できます。[File Open] では既存のデバイスに依存しないビットマップ ファイル (.dib) またはデバイスに依存するビットマップ ファイル (.bmp) を開くことができます。ビットマップが必要な場合は、\SAMPLES\MFC\ADVANCED\SPEAKN\RES の .BMP と .DIB ファイルを使ってください。新しいビットマップ ドキュメントを作成することもできます。この場合は、以下のようにクリップボードを使って、ペイントブラシなどのアプリケーションからビットマップのコピーを行ってください。

別のアプリケーションから、ビットマップをクリップボードにコピーします。
 

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_palDIB として CDibDoc オブジェクトに格納します。DIBLOOK の、CDibView::OnDraw で DIB を表示するとき、DIBLOOK の Dibapi.cpp でインプリメントした Windows の ::PaintDIB ルーチンを呼び出します。この PaintDIB は、Windows 関数の ::SetDIBitsToDevice または ::StretchDIBits を呼び出し、DIB のカラー テーブルをカラー パレットとして使います。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 次パレットとして実現します。

このサンプルは、以下のキーワードをカバーしています。