Freigeben über


DIBLOOK-Beispiel: Demonstriert die Verwendung von DIBs und Farbpaletten

Aktualisiert: November 2007

Das DIBLOOK-Beispiel demonstriert die Verwendung von geräteunabhängigen Bitmaps (DIBs) und die damit eng verbundene Verwendung der Farbpaletten.

DIBLOOK veranschaulicht außerdem ein Dokument, das ein extern definiertes Format (in diesem Fall das DIB-Dateiformat) verwendet. Dies steht im Kontrast zu einem intern definierten Dateiformat, das andernfalls beim Aufrufen der Serialize-Funktion des Dokuments durch das Framework impliziert wird, um die Dokumentinhalte auf einem Datenträger zu speichern. DIBLOOK demonstriert außerdem die Verwendung von Zwischenablage (CFile) und Bildlaufansichten.

Sicherheitshinweis:

Dieser Beispielcode dient dazu, ein Konzept zu veranschaulichen. Er sollte nicht für Anwendungen oder Websites verwendet werden, da dieser Code unter Umständen nicht die sicherste Codierungstechnik darstellt. Microsoft übernimmt keine Haftung für beiläufig entstandene Schäden oder Folgeschäden, falls der Beispielcode nicht bestimmungsgemäß verwendet wird.

So rufen Sie Beispiele und Anweisungen für ihre Installation ab

  • Klicken Sie in Visual Studio im Menü Hilfe auf Beispiele.

    Weitere Informationen finden Sie unter Suchen von Beispieldateien.

  • Die neueste Version und vollständige Liste mit Beispielen ist online unter Visual Studio 2008 Samples verfügbar.

  • Sie können auch Beispiele auf der Festplatte des Computers suchen. Standardmäßig werden Beispiele und eine Infodatei in einen Ordner unter \Programme\Visual Studio 9.0\Samples\ kopiert. Für Express Editions von Visual Studio sind alle Beispiele online verfügbar.

Erstellen und Ausführen des Beispiels

So erstellen Sie das DIBLOOK-Beispiel und führen es aus

  1. Öffnen Sie die Projektmappe DibLook.sln.

  2. Klicken Sie im Menü Erstellen auf Erstellen.

  3. Klicken Sie im Menü Debuggen auf Starten ohne Debuggen.

DIBLOOK ist eine MDI-Anwendung (Multiple Document Interface), die das gleichzeitige Anzeigen mehrerer Bitmaps ermöglicht. Öffnen Sie im Menü File mit dem Befehl Open eine vorhandene geräteunabhängige (.dib) oder eine geräteabhängige Bitmapdatei (.bmp). Als Alternative können Sie auch ein neues Bitmapdokument erstellen, indem Sie eine Bitmap aus einer anderen Anwendung (beispielsweise Paint) wie folgt über die Zwischenablage kopieren:

  • Kopieren Sie eine Bitmap aus einer anderen Anwendung in die Zwischenablage.

  • Wählen Sie im Menü File von DIBLOOK den Befehl New, um ein neues Bitmapdokument zu erstellen.

  • Wählen Sie im Menü Edit den Befehl Paste, um die Bitmap aus der Zwischenablage in das neue Dokument einzufügen.

Obwohl das Bild in DIBLOOK nicht bearbeitet werden kann, können Sie die Bitmap im Menü Datei unter Verwendung des Befehls Speichern unter in einer anderen Datei speichern. Unabhängig vom Ausgangsformat wird die Bitmap bei diesem Vorgang im geräteunabhängigen Bitmapformat gespeichert.

Extern definiertes Dokumentformat

DIBLOOK liest und speichert Bitmaps im geräteunabhängigen Standardbitmapformat von Windows. Im Arbeitsspeicher wird die Bitmap von Windows unter Verwendung eines nicht transparenten HDIB-Handles verwaltet. Das interne Format der Bitmap ist in der Anwendung sichtbar. Demnach speichert das DIBLOOK-Dokument die Bitmapbits oder die Farbtabelle nicht selbst. Stattdessen enthält CDibDoc ein Handle für die DIB-Datei (HDIB m_hDIB). Im Gegensatz zu einer Anwendung, deren Dokumentformat implizit entsprechend der Reihenfolge definiert ist, in der die Dokumentelemente in der CDocument::Serialize-Überschreibung serialisiert werden, ist das Dokumentformat der DIBLOOK-Anwendung extern definiert (typischerweise ein Standarddateiformat wie DIB).

CDocument::Serialize wird von DIBLOOK nicht überschrieben. Stattdessen überschreibt DIBLOOK die Funktionen CDocument::OnOpenDocument und OnSaveDocument. Beide Überschreibungen verwenden das vom Framework übergebene Argument pszPathName, um ein CFile-Objekt zu öffnen und die DIB-Datei zu lesen oder zu speichern. Der zum Lesen und Speichern der DIB-Datei erforderliche Code wird in der Datei Myfile.cpp bereitgestellt und kann von jeder Anwendung wiederverwendet werden, die DIB-Dateien lesen oder speichern muss.

Verwendung von DIB-Dateien und Farbpaletten

DIBLOOK demonstriert, wie eine DIB-Datei in einem Fenster angezeigt werden kann und die Farbpalette für dieses Fenster vorbereitet werden muss.

Nachdem die DIBLOOK-Anwendung die DIB aus einer Datei gelesen hat, wird auf der Grundlage der Farbtabelle der DIB-Datei ein CPalette-Objekt vorbereitet und die Palette als m_palhDIB im CDibDoc-Objekt gespeichert. Wenn die DIB-Datei von DIBLOOK in der CDibView::OnDraw-Funktion angezeigt wird, wird eine ::PaintDIB-Windows-Routine aufgerufen, die in der Datei Dibapi.cpp von DIBLOOK implementiert ist. PaintDIB ruft im Gegenzug die Windows-Funktion ::SetDIBitsToDevice oder ::StretchDIBits auf, wobei die Farbtabelle der DIB-Datei als Farbpalette verwendet wird. Die Routinen in der Datei Dibapi.cpp, die DIB-Dateien anzeigen, können von jeder kompatiblen Anwendung wiederverwendet werden.

DIBLOOK wählt eine Farbpalette aus, die optimal für das gegenwärtig aktive Fenster geeignet ist. Diese Farbpalette entspricht der Farbtabelle der DIB-Datei, die im aktiven untergeordneten MDI-Fenster angezeigt wird. Kurz bevor eine Anwendung den Eingabefokus von einer anderen Anwendung erhält, empfängt das Fenster der obersten Ebene die WM_QUERYNEWPALETTE-Meldung. Das CMainFrame-Fenster von DIBLOOK reagiert auf diese Meldung, indem es eine anwendungsdefinierte Meldung (WM_DOREALIZE) an alle Nachfolgerfenster sendet. In der Liste der Nachfolgerfenster sind alle möglichen Ansichten der verschiedenen geöffneten Dokumente enthalten. Im Gegenzug wählt jede Ansicht ihren Anzeigekontext aus der Vordergrund- oder Hintergrundpalette, je nachdem, ob es sich um die aktive Ansicht handelt.

Wenn eine andere Anwendung die Systempalette ändert, empfängt DIBLOOK die WM_PALETTECHANGED-Meldung. In diesem Fall sendet das CMainFrame-Fenster die anwendungsdefinierte Meldung (WM_DOREALIZE) erneut an jede Ansicht. Jede Ansicht wählt ihre Palette aus dem Anzeigekontext als Hintergrundpalette, liefert die Vordergrundpalette jedoch an die andere Anwendung.

Wenn der Fokus innerhalb der Anwendung von einer Ansicht zur anderen wechselt, wird die Palette für die gegenwärtig aktive Ansicht von DIBLOOK ausgewählt und realisiert (siehe CDibView::OnActivateView). Wenn die neue Palette realisiert wird, sendet Windows die WM_PALETTECHANGED-Meldung an die Fenster der obersten Ebene aller Anwendungen, einschließlich der von DIBLOOK. DIBLOOK behandelt die Meldung, indem die in den anderen Ansichten mit den anderen DIB-Dateien verknüpften Farbtabellen als Hintergrundpalette realisiert werden.

Schlüsselwörter

Dieses Beispiel demonstriert die Verwendung der folgenden Schlüsselwörter:

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

Hinweis:

In diesem und einigen anderen Beispielen wurden die Änderungen an den Visual C++-Assistenten, -Bibliotheken und -Compilern noch nicht nachvollzogen. Sie demonstrieren aber dennoch, wie Sie die gewünschte Aufgabe durchführen können.

Siehe auch

Weitere Ressourcen

MFC-Beispiele