Condividi tramite


Esempio DIBLOOK: utilizzo di tavolozze dei colori e di DIB

Aggiornamento: novembre 2007

Nell'esempio DIBLOOK viene illustrato l'utilizzo delle bitmap indipendenti dalla periferica (DIB, device-independent bitmap) e quello strettamente correlato delle tavolozze dei colori.

In DIBLOOK viene illustrato anche un documento con un formato file definito esternamente, in questo caso il formato file DIB. Questo formato si contrappone al formato file definito internamente, utilizzato quando il framework chiama automaticamente la funzione Serialize del documento per memorizzare il contenuto del documento su disco. In DIBLOOK viene illustrato anche l'utilizzo degli Appunti, di CFile e delle visualizzazioni a scorrimento.

Nota sulla sicurezza:

Questo esempio di codice viene fornito solo a scopo dimostrativo e non deve essere utilizzato in applicazioni o siti Web, poiché potrebbe non implementare le tecniche migliori a livello di sicurezza. Microsoft esclude ogni responsabilità per danni diretti o indiretti derivanti dall'utilizzo dell'esempio di codice per scopi diversi da quelli previsti.

Per ottenere gli esempi e le istruzioni per l'installazione:

  • In Visual Studio scegliere Esempi dal menu ?.

    Per ulteriori informazioni, vedere Individuazione dei file di esempio.

  • La versione più recente e l'elenco completo degli esempi sono disponibili in linea alla pagina Visual Studio 2008 Samples.

  • È anche possibile trovare gli esempi sul disco rigido del computer. Per impostazione predefinita, gli esempi e il file Leggimi vengono copiati in una cartella nel percorso \Programmi\Visual Studio 9.0\Samples\. Per le versioni Express di Visual Studio, tutti gli esempi sono disponibili in linea.

Generazione ed esecuzione dell'esempio

Per generare ed eseguire l'esempio DIBLOOK

  1. Aprire il file di soluzione DibLook.sln.

  2. Scegliere Genera dal menu Genera.

  3. Scegliere Avvia senza eseguire debug dal menu Debug.

DIBLOOK è un'applicazione con interfaccia a documenti multipli (MDI, Multiple Document Interface) che consente di visualizzare più immagini bitmap contemporaneamente. Utilizzare File, Open per aprire un file DIB indipendente dalla periferica (Device-Independent Bitmap) oppure un file BMP dipendente dalla periferica esistente. In alternativa, è possibile creare un nuovo documento bitmap copiando una bitmap da un'altra applicazione, ad esempio Paint, negli Appunti, nel modo indicato di seguito:

  • Dall'altra applicazione, copiare una bitmap negli Appunti.

  • Utilizzare il comando New del menu File di DIBLOOK per creare un nuovo documento bitmap.

  • Utilizzare il comando Paste del menu Edit per copiare la bitmap dagli Appunti nel nuovo documento.

Sebbene non sia possibile modificare l'immagine in DIBLOOK, è possibile salvare la bitmap in un altro file, utilizzando il comando Save as del menu File. La bitmap viene salvata nel formato indipendente dalla periferica, anche se il formato originale era dipendente dalla periferica.

Formato documento definito esternamente

In DIBLOOK le bitmap vengono lette e memorizzate nel formato DIB standard di Windows. Quando si trova in memoria, la bitmap viene gestita da Windows mediante un handle HDIB opaco. Il formato interno della bitmap è visibile all'applicazione. Quindi, il documento di DIBLOOK non memorizza i bit della bitmap oppure la tabella dei colori. CDibDoc invece conserva un handle alla DIB (HDIB m_hDIB). DIBLOOK costituisce un'applicazione il cui formato di documento viene definito esternamente, in genere come un formato file standard come DIB, a differenza di un'applicazione il cui formato di documento viene definito in modo implicito in base alla sequenza di serializzazione degli elementi del documento nell'override di CDocument::Serialize.

In DIBLOOK non viene eseguito l'override di CDocument::Serialize. Viene invece eseguito l'override di CDocument::OnOpenDocument e OnSaveDocument. In entrambi gli override viene utilizzato pszPathName, passato dal framework, per aprire un oggetto CFile e leggere o salvare l'immagine DIB. Il codice effettivo per leggere e salvare il file DIB viene fornito in Myfile.cpp e può essere riutilizzato da qualsiasi applicazione in cui è necessario leggere e salvare file DIB.

Utilizzo di DIB e tavolozze dei colori

In DIBLOOK viene illustrato come visualizzare una DIB in una finestra e come preparare la tavolozza dei colori per la finestra in cui viene visualizzata la DIB.

Dopo la lettura della DIB da un file, viene preparato un oggetto CPalette basato sulla tabella dei colori della DIB e viene memorizzata la tavolozza come m_palhDIB nell'oggetto CDibDoc. Quando l'immagine DIB viene visualizzata in CDibView::OnDraw di DIBLOOK, viene chiamata una routine ::PaintDIB Windows implementata nel file Dibapi.cpp di DIBLOOK. PaintDIB a propria volta chiama la funzione Windows ::SetDIBitsToDevice o ::StretchDIBits, utilizzando la tabella dei colori dell'immagine DIB come tavolozza dei colori. Le routine di visualizzazione della DIB in Dibapi.cpp possono essere riutilizzate da qualsiasi applicazione in cui vengono visualizzate DIB.

In DIBLOOK viene selezionata la tavolozza dei colori ottimale per la finestra attualmente attiva. Viene selezionata una tavolozza dei colori che corrisponde alla tabella dei colori della DIB visualizzata nella finestra figlio MDI attiva. Quando un'applicazione sta per ricevere lo stato attivo da un'altra applicazione, la finestra di primo livello riceve il messaggio WM_QUERYNEWPALETTE. Nella finestra CMainFrame di DIBLOOK, il messaggio viene gestito inviando un messaggio definito dall'applicazione, WM_DOREALIZE, a ciascuna delle finestre derivate. L'elenco delle finestre derivate include tutte le visualizzazioni dei possibili documenti aperti. Ciascuna visualizzazione effettua una selezione nel relativo contesto di visualizzazione come tavolozza di primo piano o di sfondo, in base allo stato corrente, attivo o disattivo.

Se la tavolozza di sistema viene modificata da un'altra applicazione, DIBLOOK riceve il messaggio WM_PALETTECHANGED. In questo caso, dalla finestra CMainFrame viene nuovamente inviato a ciascuna visualizzazione il messaggio definito dall'applicazione, WM_DOREALIZE. Ciascuna visualizzazione, però, seleziona la relativa tavolozza nel contesto di visualizzazione come tavolozza di sfondo restituendo la tavolozza di primo piano all'altra applicazione.

Quando lo stato attivo viene spostato all'interno dell'applicazione da una visualizzazione a un'altra, in DIBLOOK viene selezionata e creata la tavolozza per la visualizzazione correntemente attiva (vedere CDibView::OnActivateView). Una volta creata la nuova tavolozza, mediante Windows viene inviato il messaggio WM_PALETTECHANGED a tutte le finestre di primo livello delle applicazioni, incluse quelle di DIBLOOK. DIBLOOK gestisce il messaggio creando come tavolozza di sfondo le tabelle dei colori associate alle DIB nelle altre visualizzazioni.

Parole chiave

Nell'esempio vengono illustrate le seguenti parole chiave:

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:

Alcuni esempi, tra cui il presente, non sono stati cambiati per riflettere le modifiche apportate alle procedure guidate, alle librerie e al compilatore di Visual C++, tuttavia forniscono comunque le istruzioni per completare l'attività desiderata.

Vedere anche

Altre risorse

Esempi relativi ad MFC