Давайте создадим приложение SDI с помощью AppWizard и пусть оно назвается GraphWork. Теперь наша задача считать файл BMP c диска и отобразить на экране. Создаем пункт меню:
Теперь привяжем этот пункт меню к функции в классе документа:
void CGraphWorkDoc::OnInsertImage() { ...... }
Нам в классе документа нужно объявить две переменные - дескриптор изображения HBITMAP и класс CBitmap.
class CGraphWorkDoc : public CDocument { ...... // Implementation public: HBITMAP hBitmap; CBitmap m_bmpBitmap; virtual ~CGraphWorkDoc(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif ...... };
Вот теперь можно и функцию написать:
void CGraphWorkDoc::OnInsertImage() { CString m_sFileName; CFileDialog fileDialog(TRUE,NULL,"*.bmp"); int result = fileDialog.DoModal(); if (result==IDOK) { m_sFileName=fileDialog.GetPathName(); HBITMAP hBitmap = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), m_sFileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); m_bmpBitmap.Detach(); m_bmpBitmap.Attach(hBitmap); UpdateAllViews(NULL); } }
Что написано ? Узнать имя BMP файла для начала. Потом прочитать его, используя LoadImage(), и связать с классом CBitmap, а затем обновить вид.
Рисовать мы будем его в функции OnDraw() вида:
void CGraphWorkView::OnDraw(CDC* pDC) { CGraphWorkDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); CDC dcTemp; dcTemp.CreateCompatibleDC(pDC); dcTemp.SelectObject(pDoc->m_bmpBitmap); BITMAP bm; if (pDoc->m_bmpBitmap.GetSafeHandle()!=NULL) pDoc->m_bmpBitmap.GetBitmap(&bm); pDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&dcTemp,0,0,SRCCOPY); }
Здесь мы создаем контекст памяти и выбираем в этот контекст объект CBitmap, потом получаем информацию о размере изображения и выводим на экран BitBlt(). BMP файлы есть, например, в каталоге Windows. Оттуда я и взял файл установка.bmp.