Ejemplo DIBLOOK: ilustra el uso de mapas de bits independientes del dispositivo (DIB) y paletas de colores

Actualización: noviembre 2007

El ejemplo DIBLOOK ilustra el uso de mapas de bits independientes del dispositivo (DIB) y el uso relacionado de las paletas de colores.

DIBLOOK también ilustra el uso de un documento que tiene un formato de archivo definido externamente (en este caso, el formato de archivo DIB). Esto contrasta con un formato de archivo definido internamente, implícito cuando el marco de trabajo llama automáticamente a la función Serialize del documento para almacenar el contenido del documento en el disco. DIBLOOK ilustra además el uso del Portapapeles, la clase CFile y las vistas con barra de desplazamiento.

Nota de seguridad:

Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que quizás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para obtener ejemplos e instrucciones para su instalación:

  • En el menú Ayuda de Visual Studio, haga clic en Ejemplos.

    Para obtener más información, vea Localizar archivos de ejemplo.

  • La lista de ejemplos completa con la versión más reciente está disponible en línea en la página Visual Studio 2008 Samples.

  • También encontrará ejemplos en el disco duro de su equipo. De manera predeterminada, los ejemplos y el archivo Léame se copian en una carpeta bajo \Archivos de programa\Visual Studio 9.0\Samples\. Para las versiones Express de Visual Studio, todos los ejemplos están en línea.

Generar y ejecutar el ejemplo

Para generar y ejecutar el ejemplo DIBLOOK

  1. Abra la solución DibLook.sln.

  2. En el menú Generar, haga clic en Generar.

  3. En el menú Depurar, haga clic en Iniciar sin depurar.

DIBLOOK es una aplicación con interfaz de múltiples documentos (MDI) que permite ver varios mapas de bits simultáneamente. Utilice File Open para abrir un archivo de mapa de bits independiente del dispositivo (.dib) o un archivo de mapa de bits dependiente del dispositivo (.bmp). Como alternativa, puede crear un documento de mapa de bits nuevo copiando un mapa de bits desde otra aplicación, como Paint, a través del Portapapeles, de la manera siguiente:

  • En la otra aplicación, copie un mapa de bits al Portapapeles.

  • Utilice el comando New de DIBLOOK del menú File para crear un documento de mapa de bits nuevo.

  • Utilice el comando Paste del menú Edit para copiar el mapa de bits desde el Portapapeles al nuevo documento.

Aunque no puede editar la imagen en DIBLOOK, puede guardar el archivo de mapa de bits en otro archivo mediante el comando Save As del menú File. El mapa de bits se guarda en un formato independiente del dispositivo, aunque su formato original sea dependiente del dispositivo.

Formato de documento definido externamente

DIBLOOK lee y almacena mapas de bits en el formato de mapa de bits independiente del dispositivo estándar de Windows. Mientras el mapa de bits está en la memoria, Windows lo administra con un identificador HDIB opaco. El formato interno del mapa de bits es visible para la aplicación. Por tanto, el documento de DIBLOOK no almacena los bits del mapa de bits ni la tabla de colores. En lugar de ello, CDibDoc mantiene un identificador del archivo DIB (HDIB m_hDIB). DIBLOOK es una aplicación cuyo formato de documento está definido externamente (suele ser un formato de archivo estándar, como DIB), que contrasta con las aplicaciones cuyo formato de documento está definido implícitamente en función de la secuencia en la que serializa los elementos del documento en el código que reemplaza CDocument::Serialize.

DIBLOOK no reemplaza CDocument::Serialize, sino CDocument::OnOpenDocument y OnSaveDocument. En ambos casos, se utiliza el parámetro pszPathName, que se pasa desde el marco de trabajo, para abrir un objeto CFile y leer o guardar el archivo DIB. El código para leer y guardar el archivo DIB lo proporciona el archivo Myfile.cpp; este código lo puede reutilizar cualquier aplicación que necesite leer y guardar archivos DIB.

Utilizar archivos DIB y Paletas de colores

DIBLOOK ilustra la forma de utilizar un archivo DIB en una ventana y la forma de preparar la paleta de colores para la ventana que muestra el contenido del archivo DIB.

Después de que DIBLOOK lea el archivo DIB desde un archivo, prepara un objeto CPalette basado en la tabla de colores del archivo DIB y almacena la paleta como m_palhDIB en el objeto CDibDoc. Cuando DIBLOOK muestra el archivo DIB en CDibView::OnDraw, llama a una rutina ::PaintDIB de Windows implementada en el archivo Dibapi.cpp de DIBLOOK. PaintDIB llama a su vez a la función de Windows ::SetDIBitsToDevice o ::StretchDIBits, con la tabla de colores del archivo DIB como paleta de colores. Las rutinas de presentación del archivo DIB incluidas en Dibapi.cpp se pueden reutilizar en cualquier aplicación que muestre archivos DIB.

DIBLOOK selecciona una paleta de colores óptima para la ventana activa actualmente. Selecciona una paleta de colores correspondiente a la tabla de colores del archivo DIB mostrado en la ventana MDI secundaria activa actualmente. Cuando una aplicación va a recibir el foco de entrada (desde otra aplicación), su ventana de nivel superior recibe el mensaje WM_QUERYNEWPALETTE. La ventana CMainFrame de DIBLOOK controla este mensaje enviando un mensaje definido por la aplicación, WM_DOREALIZE, a cada una de las ventanas secundarias. La lista de ventanas secundarias incluye todas las vistas de los documentos que estén abiertos. A su vez, cada vista selecciona para su contexto de presentación una paleta de primer plano o de fondo, en función de si es la ventana activa o no.

Si otra aplicación cambia la paleta del sistema, DIBLOOK recibe el mensaje WM_PALETTECHANGED. En este caso, la ventana CMainFrame vuelve a enviar el mensaje definido por la aplicación, WM_DOREALIZE, a cada vista. Cada vista selecciona su paleta en el contexto de presentación como paleta de fondo, cediendo la paleta de primer plano a la otra aplicación.

Cuando el foco cambia en la aplicación de una vista a otra, DIBLOOK selecciona y genera la paleta para la vista activa (vea CDibView::OnActivateView). Cuando se genera la nueva paleta, Windows envía el mensaje WM_PALETTECHANGED a todas las ventanas de nivel superior de la aplicación, incluidas las de DIBLOOK. DIBLOOK procesa el mensaje generando las tablas de colores asociadas a los otros archivos DIB de las demás vistas como una paleta de fondo.

Palabras clave

En este ejemplo, se muestra el uso de las siguientes palabras clave:

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

Nota:

Algunos ejemplos, como éste, no se han modificado para reflejar los cambios en los asistentes, las bibliotecas y el compilador de Visual C++, pero, aun así, muestran cómo realizar la tarea deseada.

Vea también

Otros recursos

Ejemplos de MFC