DIBLOOK, exemple : illustre l'utilisation des fichiers DIB et des palettes de couleurs
Mise à jour : novembre 2007
L'exemple DIBLOOK illustre l'utilisation des bitmaps indépendantes du périphérique (DIB, Device-Independent Bitmap), ainsi que l'utilisation très similaire des palettes de couleurs.
DIBLOOK illustre également un document qui possède un format de fichier défini de façon externe (en l'occurrence, le format de fichier DIB). Cela s'oppose au format de fichier défini de façon interne, qui est généralement implicite lorsque l'infrastructure appelle automatiquement la fonction Serialize du document pour stocker son contenu sur disque. DIBLOOK illustre en détail l'utilisation du Presse-papiers, CFile, et les vues à défilement.
Note de sécurité : |
---|
Cet exemple de code est fourni pour illustrer un concept et ne doit pas être utilisé dans des applications ou des sites Web, car il peut ne pas illustrer les pratiques de programmation les plus sûres. Microsoft n'assume aucune responsabilité pour tout dommage indirect ou consécutif en cas d'utilisation de l'exemple de code à des fins autres que celles prévues. |
Pour obtenir des exemples et des instructions d'installation :
Dans le menu ? (Aide) de Visual Studio, cliquez sur Exemples.
Pour plus d'informations, consultez Recherche des fichiers d'exemple.
La liste la plus récente et la plus complète d'exemples est disponible en ligne à partir de la page Visual Studio 2008 Samples.
Des exemples sont également disponibles sur le disque dur de votre ordinateur. Des exemples et un fichier Readme sont stockés par défaut dans un dossier sous \Program Files\Visual Studio 9.0\Samples\. Pour les éditions Express de Visual Studio, tous les exemples sont disponibles en ligne.
Génération et exécution de l'exemple
Pour générer et exécuter l'exemple DIBLOOK
Ouvrez la solution DibLook.sln.
Dans le menu Générer, cliquez sur Générer.
Dans le menu Déboguer, cliquez sur Exécuter sans débogage.
DIBLOOK est une application d'interface multidocument (MDI, Multiple Document Interface) qui vous permet d'afficher plusieurs bitmaps en même temps. Utilisez la commande File Open pour ouvrir un fichier .dib ou .bmp existant. Vous pouvez également créer un document bitmap en copiant une bitmap à partir d'une autre application, par exemple Paint, via le Presse-papiers, en procédant comme suit :
Dans l'application secondaire, copiez une bitmap vers le Presse-papiers.
Dans le menu File, utilisez la commande DIBLOOK New pour créer un document bitmap.
Dans le menu Edit, utilisez la commande Paste pour copier la bitmap du Presse-papiers vers le nouveau document.
Bien que vous ne puissiez pas modifier l'image dans DIBLOOK, vous pouvez enregistrer la bitmap dans un autre fichier en cliquant dans le menu File sur Save As. La bitmap est enregistrée au format .dib, même si son format d'origine était .bmp.
Format de document défini de façon externe
DIBLOOK lit et stocke les bitmaps au format .dib Windows standard. Lorsqu'elle est en mémoire, la bitmap est managée par Windows à l'aide d'un handle HDIB opaque. Le format interne de la bitmap est visible par l'application. Par conséquent, le document DIBLOOK ne stocke pas lui-même les bits de la bitmap ou la table des couleurs. En fait, CDibDoc contient un handle du fichier DIB (HDIB m_hDIB). DIBLOOK est une application dont le format de document est défini de façon externe (en règle générale, il s'agit d'un format de fichier standard tel que DIB), par opposition à une application dont le format de document est défini implicitement, d'après la séquence selon laquelle les éléments du document sont sérialisés au cours de la substitution CDocument::Serialize.
DIBLOOK ne se substitue pas à CDocument::Serialize. En fait, DIBLOOK se substitue à CDocument::OnOpenDocument et OnSaveDocument. Ces deux substitutions utilisent pszPathName, passé par l'infrastructure, pour ouvrir un objet CFile, et lire ou enregistrer le fichier DIB. Le code réel pour la lecture et l'enregistrement du fichier DIB est fourni dans Myfile.cpp ; ce code est réutilisable par n'importe quelle application ayant besoin de lire et d'enregistrer des fichiers DIB.
Utilisation de fichiers DIB et de palettes de couleurs
DIBLOOK illustre la préparation de la palette de couleurs et l'affichage d'un fichier DIB dans une fenêtre.
Une fois que DIBLOOK a lu le fichier DIB, il prépare un objet CPalette basé sur la table des couleurs du fichier DIB et stocke la palette en tant que m_palhDIB dans l'objet CDibDoc. Lorsque DIBLOOK affiche le fichier DIB dans CDibView::OnDraw, il appelle une routine ::PaintDIB Windows implémentée dans le fichier Dibapi.cpp de DIBLOOK. PaintDIB appelle à son tour la fonction Windows ::SetDIBitsToDevice ou ::StretchDIBits, en utilisant la table des couleurs du fichier DIB comme palette de couleurs. Les routines d'affichage de fichiers DIB dans Dibapi.cpp sont réutilisables par n'importe quelle application affichant des fichiers DIB.
DIBLOOK sélectionne une palette de couleurs optimale pour la fenêtre active. DIBLOOK sélectionne une palette de couleurs correspondant à la table des couleurs du fichier DIB affiché dans la fenêtre enfant MDI active. Lorsqu'une application est sur le point de recevoir le focus (en provenance d'une autre application), sa fenêtre de niveau supérieur reçoit le message WM_QUERYNEWPALETTE. La fenêtre CMainFrame de DIBLOOK gère ce message en envoyant un message défini par l'application, WM_DOREALIZE, à chacune des fenêtres enfants. La liste des fenêtres enfants comprend toutes les vues des multiples documents ouverts possibles. Dès lors, chaque vue sélectionne sa palette dans le contexte d'affichage comme une palette de premier plan ou d'arrière-plan, selon que la vue est active ou non.
Si une autre application modifie la palette système, DIBLOOK reçoit le message WM_PALETTECHANGED. Dans ce cas, la fenêtre CMainFrame renvoie le message défini par l'application, WM_DOREALIZE, à chaque vue. Chaque vue sélectionne sa palette dans le contexte d'affichage comme une palette d'arrière-plan, tout en cédant la palette de premier plan à l'autre application.
Lorsque le focus passe dans l'application d'une vue à une autre, DIBLOOK sélectionne et réalise la palette de la vue active (consultez CDibView::OnActivateView). Une fois la nouvelle palette constituée, Windows envoie le message WM_PALETTECHANGED à toutes les fenêtres d'applications de niveau supérieur, y compris celles de DIBLOOK. DIBLOOK gère le message en réalisant en tant que palette d'arrière-plan les tables des couleurs associées aux autres fichiers DIB des autres vues.
Mots clés
Cet exemple illustre l'utilisation des mots clés suivants :
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
Remarque : |
---|
Certains exemples, tels que celui-ci, n'ont pas été modifiés pour refléter les changements apportés aux Assistants, aux bibliothèques et au compilateur Visual C++, mais ils illustrent bien l'exécution de la tâche souhaitée. |