Шаг 327 - Читаем BMP файл с диска

Давайте создадим приложение SDI с помощью AppWizard и пусть оно назвается GraphWork. Теперь наша задача считать файл BMP c диска и отобразить на экране. Создаем пункт меню:

327_1.gif (4665 b)

Теперь привяжем этот пункт меню к функции в классе документа:

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.

327_2.gif (4944 b)


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 27.02.2001