Образец DIBLOOK: демонстрация использования рисунков формата DIB и цветовых палитр
Обновлен: Ноябрь 2007
Образец DIBLOOK демонстрирует использование файлов DIB, а также родственные задачи по использованию цветовых палитр.
В образце DIBLOOK также показан документ, который имеет формат файла, определяемый внешним образом (в данном случае — формат файла DIB). Такой формат отличается от формата, определяемого внутренним образом, который подразумевается в прочих случаях, когда платформа автоматически вызывает функцию Serialize документа для сохранения его содержимого на диске. В образце DIBLOOK также показано использование буфера обмена, класса CFile и режимов прокрутки.
Примечание о безопасности. |
---|
Этот образец кода служит для демонстрации основных принципов и не предназначен для использования в приложениях или на веб-узлах, поскольку не может считаться примером наиболее безопасного кода. Корпорация Майкрософт не несет ответственности за случайные или косвенные убытки в случае использования образца кода не по назначению. |
Чтобы получить образцы и инструкции по их установке, выполните следующие действия.
В меню Справка среды Visual Studio выберите пункт Примеры.
Дополнительные сведения см. в разделе Поиск файлов примеров.
Самая последняя версия и полный список образцов доступны в Интернете на странице образцов Visual Studio 2008.
Кроме того, образцы находятся на жестком диске компьютера. По умолчанию образцы кода и файл Readme копируются в папку, находящуюся в папке \Program Files\Visual Studio 9.0\Samples\. Все образцы кода для экспресс-выпусков Visual Studio находятся в Интернете.
Построение и запуск образца
Построение и запуск образца DIBLOOK
Откройте решение DibLook.sln.
В меню Построение выберите команду Построить.
В меню Отладка выберите пункт Запуск без отладки.
Образец DIBLOOK является приложением с интерфейсом MDI, которое позволяет одновременно просматривать несколько растровых изображений. Выберите в меню File команду Open, чтобы открыть существующий DIB-файл или BMP-файл. Также можно создать новый документ, скопировав растровое изображение из другого приложения, такого как Paint, через буфер обмена, как показано далее.
Вставьте растровое изображение в буфер обмена из другого приложения.
Используйте команду New в меню File DIBLOOK, чтобы создать новый документ растрового изображения.
С помощью команды Paste из меню Edit скопируйте растровое изображение из буфера обмена в новый документ.
В приложении DIBLOOK нельзя редактировать растровое изображение, однако его можно сохранить в другой файл с помощью команды Save As из меню File. Растровое изображение сохраняется в формате DIB (не зависящем от устройства), даже если исходный формат зависел от устройства.
Формат документа, определяемый внешним образом
Образец DIBLOOK считывает и сохраняет растровые изображения в стандартом формате Windows, не зависящем от устройства. Windows управляет изображением, находящимся в памяти, с помощью непрозрачного дескриптора HDIB. Внутренний формат растрового изображения является видимым для приложения. Поэтому в самом документе DIBLOOK не сохраняются биты растрового изображения или таблица цветов. Вместо этого в объекте CDibDoc содержится дескриптор для файла DIB (HDIB m_hDIB). Формат документов в приложении DIBLOOK определяется внешним образом (обычно это стандартный формат файла, такой как DIB), в то время как в других приложениях формат документов определяется неявным образом в соответствии с последовательностью, в которой приложение выполняет сериализацию элементов документа в переопределенной версии метода CDocument::Serialize.
В приложении DIBLOOK не переопределяется метод CDocument::Serialize. Вместо этого переопределяются методы CDocument::OnOpenDocument и OnSaveDocument. В обеих переопределенных версиях используется параметр pszPathName, передаваемый платформой, чтобы открыть объект CFile и считать или сохранить DIB-файл. Фактический код, выполняющий считывание и сохранение DIB-файла, находится в файле Myfile.cpp. Этот код может использоваться в любом приложении, где нужно считывать и сохранять DIB-файлы.
Использование рисунков формата DIB и цветовых палитр
В образце DIBLOOK показано, как отобразить рисунок формата DIB в окне и как подготовить цветовую палитру для окна, в котором отображается рисунок DIB.
После считывания рисунка DIB из файла приложение DIBLOOK подготавливает объект CPalette на основе таблицы цветов рисунка DIB и сохраняет палитру в виде поля m_palhDIB в объекте CDibDoc. Когда приложение DIBLOOK отображает рисунок DIB в методе CDibView::OnDraw, выполняется вызов подпрограммы Windows ::PaintDIB, реализованной в модуле Dibapi.cpp приложения DIBLOOK. Подпрограмма PaintDIB в свою очередь вызывает функцию Windows ::SetDIBitsToDevice или ::StretchDIBits, используя в качестве цветовой палитры таблицу цветов рисунка DIB. Подпрограммы в файле Dibapi.cpp, выполняющие отображение рисунков DIB, могут использоваться любым приложением, отображающим рисунки DIB.
Приложение DIBLOOK выбирает цветовую палитру, которая оптимально подходит для окна, активного в настоящий момент. Цветовая палитра выбирается в соответствии с таблицей цветов рисунка формата DIB, который отображается в активном дочернем окне интерфейса MDI. Когда приложение готовится к получению фокуса ввода (переходящего из другого приложения), его окно верхнего уровня получает сообщение WM_QUERYNEWPALETTE. Окно CMainFrame приложения DIBLOOK обрабатывает это сообщение и отправляет сообщение WM_DOREALIZE, определяемое приложением, в каждое из окон-потомков. В список окон-потомков входят все представления открытых документов (возможно, нескольких). Каждое представление, в свою очередь, выбирает в контексте отображения палитру фона или переднего плана, в зависимости от того, является ли представление активным.
Если другое приложение изменяет системную палитру, приложение DIBLOOK получает сообщение WM_PALETTECHANGED. В этом случае окно CMainFrame снова отправляет сообщение WM_DOREALIZE, определяемое приложением, в каждое представление. Каждое представление выбирает свою палитру в контексте отображения в качестве палитры фона, при этом отправляя палитру переднего плана в другое приложение.
Когда фокус перемещается от одного представления к другому в рамках приложения, DIBLOOK выбирает и реализует палитру для активного представления (см. описание метода CDibView::OnActivateView). После реализации новой палитры Windows отправляет сообщение WM_PALETTECHANGED всем окнам верхнего уровня в приложениях, включая окна приложения DIBLOOK. Приложение DIBLOOK обрабатывает это сообщение, устанавливая в качестве палитры фона таблицы цветов, сопоставленные с другими рисунками DIB в остальных представлениях.
Ключевые слова
В этом образце показаны следующие ключевые слова:
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
Примечание. |
---|
Некоторые образцы, включая данный, не модифицировались с учетом изменений в мастерах, библиотеках и компиляторе Visual C++, однако по-прежнему демонстрируют выполнение требуемой задачи. |