www.pudn.com > Direct.rar > DirectView.cpp


// DirectView.cpp : implementation of the CDirectView class 
// 
 
#include "stdafx.h" 
#include "Direct.h" 
 
#include "DirectDoc.h" 
#include "DirectView.h" 
#include "MainFrm.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CDirectView 
 
IMPLEMENT_DYNCREATE(CDirectView, CScrollView) 
 
BEGIN_MESSAGE_MAP(CDirectView, CScrollView) 
	//{{AFX_MSG_MAP(CDirectView) 
	ON_WM_ERASEBKGND() 
	ON_COMMAND(ID_EDIT_COPY, OnEditCopy) 
	ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateEditCopy) 
	ON_COMMAND(ID_EDIT_PASTE, OnEditPaste) 
	ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdateEditPaste) 
	ON_COMMAND(ID_DETECT_HPROJECTION, OnDetectHprojection) 
	ON_COMMAND(ID_DETECT_MINUS, OnDetectMinus) 
	ON_COMMAND(ID_DETECT_TEMPLATE, OnDetectTemplate) 
	ON_COMMAND(ID_DETECT_THRESHOLD, OnDetectThreshold) 
	ON_COMMAND(ID_DETECT_VPROJECTION, OnDetectVprojection) 
	//}}AFX_MSG_MAP 
	// Standard printing commands 
	ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint) 
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint) 
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview) 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CDirectView construction/destruction 
 
CDirectView::CDirectView() 
{ 
	// TODO: add construction code here 
 
} 
 
CDirectView::~CDirectView() 
{ 
} 
 
BOOL CDirectView::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	// TODO: Modify the Window class or styles here by modifying 
	//  the CREATESTRUCT cs 
 
	return CScrollView::PreCreateWindow(cs); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CDirectView drawing 
 
void CDirectView::OnDraw(CDC* pDC) 
{ 
	BeginWaitCursor(); 
 
	CDirectDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
 
	HDIB hDIB = pDoc->GetHDIB(); 
	if (hDIB != NULL) 
	{ 
		LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB); 
		int cxDIB = (int) pDoc->GetDibImage()->DIBWidth(lpDIB); 
		int cyDIB = (int) pDoc->GetDibImage()->DIBHeight(lpDIB); 
 
		::GlobalUnlock((HGLOBAL) hDIB); 
		 
		CRect rcDIB; 
		rcDIB.top = rcDIB.left = 0; 
		rcDIB.right = cxDIB; 
		rcDIB.bottom = cyDIB; 
		 
		CRect rcDest; 
		 
		if (pDC->IsPrinting()) 
		{ 
			// 是打印,计算输出图像的位置和大小,以便符合页面 
			 
			// 获取打印页面的水平宽度(象素) 
			int cxPage = pDC->GetDeviceCaps(HORZRES);			 
			// 获取打印页面的垂直高度(象素) 
			int cyPage = pDC->GetDeviceCaps(VERTRES);			 
			// 获取打印机每英寸象素数 
			int cxInch = pDC->GetDeviceCaps(LOGPIXELSX); 
			int cyInch = pDC->GetDeviceCaps(LOGPIXELSY); 
			 
			// 计算打印图像大小(缩放,根据页面宽度调整图像大小) 
			rcDest.top = rcDest.left = 0; 
			rcDest.bottom = (int)(((double)cyDIB * cxPage * cyInch) 
					/ ((double)cxDIB * cxInch)); 
			rcDest.right = cxPage; 
			 
			// 计算打印图像位置(垂直居中) 
			int temp = cyPage - (rcDest.bottom - rcDest.top); 
			rcDest.bottom += temp/2; 
			rcDest.top += temp/2; 
		} 
		else    
		{ 
			// 不必缩放图像 
			rcDest = rcDIB; 
		} 
		 
		pDoc->GetDibImage()->PaintDIB(pDC->m_hDC, &rcDest, pDoc->GetHDIB(), 
			&rcDIB, pDoc->GetDocPalette()); 
	} 
	 
	EndWaitCursor(); 
} 
 
void CDirectView::OnInitialUpdate() 
{ 
	CScrollView::OnInitialUpdate(); 
 
	// TODO: calculate the total size of this view 
 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CDirectView printing 
 
BOOL CDirectView::OnPreparePrinting(CPrintInfo* pInfo) 
{ 
	// 设置总页数为一。 
	pInfo->SetMaxPage(1); 
 
	return DoPreparePrinting(pInfo); 
} 
 
void CDirectView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add extra initialization before printing 
} 
 
void CDirectView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add cleanup after printing 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CDirectView diagnostics 
 
#ifdef _DEBUG 
void CDirectView::AssertValid() const 
{ 
	CScrollView::AssertValid(); 
} 
 
void CDirectView::Dump(CDumpContext& dc) const 
{ 
	CScrollView::Dump(dc); 
} 
 
CDirectDoc* CDirectView::GetDocument() // non-debug version is inline 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDirectDoc))); 
	return (CDirectDoc*)m_pDocument; 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CDirectView message handlers 
 
BOOL CDirectView::OnEraseBkgnd(CDC* pDC)  
{ 
	// 主要是为了设置子窗体默认的背景色 
	// 背景色由文档成员变量m_refColorBKG指定 
 
	CDirectDoc* pDoc = GetDocument(); 
	CBrush brush(pDoc->m_refColorBKG);                                               
	CBrush* pOldBrush = pDC->SelectObject(&brush); 
		 
	CRect rectClip; 
	pDC->GetClipBox(&rectClip);			// 获取重绘区域	 
	pDC->PatBlt(rectClip.left, rectClip.top, rectClip.Width(),  
		rectClip.Height(), PATCOPY); 
 
	pDC->SelectObject(pOldBrush);                                                   
 
	return TRUE; 
} 
 
void CDirectView::OnEditCopy()  
{ 
	// 复制当前图像 
 
	CDirectDoc* pDoc = GetDocument(); 
	 
	if (OpenClipboard()) 
	{ 
		BeginWaitCursor(); 
		EmptyClipboard(); 
		 
		// 复制当前图像到剪贴板 
		SetClipboardData (CF_DIB, pDoc->GetDibImage()-> 
			CopyHandle((HANDLE) pDoc->GetHDIB()) ); 
 
		CloseClipboard(); 
		EndWaitCursor(); 
	} 
} 
 
void CDirectView::OnUpdateEditCopy(CCmdUI* pCmdUI)  
{ 
	// 如果当前DIB对象不空,复制菜单项有效 
	pCmdUI->Enable(GetDocument()->GetHDIB() != NULL); 
} 
 
void CDirectView::OnEditPaste()  
{ 
	// 粘贴图像 
	 
	HDIB hNewDIB = NULL; 
	CDirectDoc* pDoc = GetDocument(); 
	 
	if (OpenClipboard()) 
	{ 
		BeginWaitCursor(); 
 
		// 读取剪贴板中的图像 
		hNewDIB = (HDIB)pDoc->GetDibImage()->CopyHandle(::GetClipboardData(CF_DIB)); 
 
		CloseClipboard(); 
		 
		if (hNewDIB != NULL) 
		{ 
			pDoc->ReplaceHDIB(hNewDIB);		// 替换DIB,同时释放旧DIB对象		 
			pDoc->InitDIBData();			// 更新DIB大小和调色板		 
			pDoc->SetModifiedFlag(TRUE);	// 设置脏标记	 
			SetScrollSizes(MM_TEXT, pDoc->GetDocSize());	// 重新设置滚动视图大小		 
			OnDoRealize((WPARAM)m_hWnd,0);	// 实现新的调色板		 
			pDoc->UpdateAllViews(NULL);		// 更新视图 
		} 
 
		EndWaitCursor(); 
	} 
} 
 
void CDirectView::OnUpdateEditPaste(CCmdUI* pCmdUI)  
{ 
	// 如果当前剪贴板中有DIB对象,粘贴菜单项有效 
	pCmdUI->Enable(::IsClipboardFormatAvailable(CF_DIB)); 
} 
 
LRESULT CDirectView::OnDoRealize(WPARAM wParam, LPARAM) 
{ 
	ASSERT(wParam != NULL); 
 
	CDirectDoc* pDoc = GetDocument();	 
	if (pDoc->GetHDIB() == NULL) 
	{ 
		return 0L; 
	} 
	 
	CPalette* pPal = pDoc->GetDocPalette(); 
	if (pPal != NULL) 
	{ 
		CMainFrame* pAppFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd; 
		ASSERT_KINDOF(CMainFrame, pAppFrame); 
		 
		CClientDC appDC(pAppFrame); 
 
		// All views but one should be a background palette. 
		// wParam contains a handle to the active view, so the SelectPalette 
		// bForceBackground flag is FALSE only if wParam == m_hWnd (this view) 
		CPalette* oldPalette = appDC.SelectPalette(pPal,((HWND)wParam)!=m_hWnd);	 
		if (oldPalette != NULL) 
		{ 
			UINT nColorsChanged = appDC.RealizePalette(); 
			if (nColorsChanged > 0) 
			{ 
				pDoc->UpdateAllViews(NULL); 
			} 
			appDC.SelectPalette(oldPalette, TRUE); 
		} 
		else 
		{ 
			TRACE0("\tCCh1_1View::OnPaletteChanged中调用SelectPalette()失败!\n"); 
		} 
	} 
	 
	return 0L; 
} 
 
void CDirectView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView)  
{ 
	CScrollView::OnActivateView(bActivate, pActivateView, pDeactiveView); 
 
	if (bActivate) 
	{ 
		ASSERT(pActivateView == this); 
		OnDoRealize((WPARAM)m_hWnd, 0);   // same as SendMessage(WM_DOREALIZE); 
	} 
} 
 
void CDirectView::CalcWindowRect(LPRECT lpClientRect, UINT nAdjustType)  
{ 
	CScrollView::OnInitialUpdate(); 
	ASSERT(GetDocument() != NULL); 
	 
	SetScrollSizes(MM_TEXT, GetDocument()->GetDocSize()); 
} 
 
void CDirectView::OnDetectHprojection()  
{ 
	//水平投影 
 
	CDirectDoc* pDoc = GetDocument(); 
		 
	LPSTR	lpDIB;				// 指向DIB的指针	 
	LPSTR   lpDIBBits;			// 指向DIB象素指针 
 
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); 
	 
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的投影,其它的可以类推) 
	if (pDoc->GetDibImage()->DIBNumColors(lpDIB) != 256) 
	{ 
		MessageBox("目前只支持256色位图的运算!", "系统提示" ,  
			MB_ICONINFORMATION | MB_OK); 
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
		 
		return; 
	} 
	 
	BeginWaitCursor(); 
 
	// 找到DIB图像象素起始位置 
	lpDIBBits = pDoc->GetDibImage()->FindDIBBits(lpDIB); 
	 
	// 调用HprojectDIB()函数对DIB进行水平投影 
	if (pDoc->GetDibImage()->HprojectDIB(lpDIBBits, 
		pDoc->GetDibImage()->DIBWidth(lpDIB),  
		pDoc->GetDibImage()->DIBHeight(lpDIB))) 
	{	 
		pDoc->SetModifiedFlag(TRUE);		// 设置脏标记		 
		pDoc->UpdateAllViews(NULL);			// 更新视图 
	} 
	else 
	{ 
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
	} 
	 
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
	EndWaitCursor(); 
} 
 
void CDirectView::OnDetectMinus()  
{ 
	// 获取文档 
	CDirectDoc* pDoc = GetDocument(); 
	 
	LPSTR lpDIB,lpDIBBK;				// 指向DIB的指针	 
	LPSTR    lpDIBBits,lpDIBBitsBK;		// 指向DIB象素指针	 
	long lWidth,lHeight;				//图像的宽度与高度 
	HDIB hDIBBK; 
 
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());	 
	 
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的水平镜像,其它的可以类推) 
	if (pDoc->GetDibImage()->DIBNumColors(lpDIB) != 256) 
	{ 
		MessageBox("目前只支持256色位图的平移!", "系统提示" ,  
			MB_ICONINFORMATION | MB_OK); 
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
	 
		return; 
	} 
	 
	BeginWaitCursor(); 
 
	// 找到DIB图像象素起始位置 
	lpDIBBits = pDoc->GetDibImage()->FindDIBBits(lpDIB); 
	 
	lWidth = pDoc->GetDibImage()->DIBWidth(lpDIB); 
	lHeight = pDoc->GetDibImage()->DIBHeight(lpDIB); 
	CFileDialog dlg(TRUE,"bmp","*.bmp"); 
	if(dlg.DoModal() == IDOK) 
	{ 
	 	CFile file; 
	 	CFileException fe; 
  
	 	CString strPathName;  
		strPathName = dlg.GetPathName(); 
  
		VERIFY(file.Open(strPathName,CFile::modeRead|CFile::shareDenyWrite,&fe)); 
 
		TRY 
		{ 
 			hDIBBK = pDoc->GetDibImage()->ReadDIBFile(file); 
		} 
		CATCH (CFileException, eLoad) 
		{ 
	 		file.Abort(); 
 
			EndWaitCursor(); 
 
			hDIBBK = NULL; 
 
			return; 
		} 
		END_CATCH 
 	 
		if (hDIBBK == NULL) 
		{ 
 			CString strMsg; 
 			strMsg = "读取图像时出错!可能是不支持该类型的图像文件!"; 
 			MessageBox(strMsg, NULL, MB_ICONINFORMATION | MB_OK); 
 
 			EndWaitCursor(); 
 	 
 			return; 
 		} 
 	} 
	else 
	{ 
 		EndWaitCursor(); 
 		 
		return; 
	} 
 
	lpDIBBK = (LPSTR) ::GlobalLock((HGLOBAL) hDIBBK); 
	 
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的差影,其它的可以类推) 
	if (pDoc->GetDibImage()->DIBNumColors(lpDIBBK) != 256) 
	{ 
		MessageBox("目前只支持256色位图!", "系统提示" ,  
			MB_ICONINFORMATION | MB_OK); 
		::GlobalUnlock((HGLOBAL) hDIBBK); 
 
		return; 
	} 
	 
	BeginWaitCursor(); 
 
	// 找到DIB图像象素起始位置 
	lpDIBBitsBK = pDoc->GetDibImage()->FindDIBBits(lpDIBBK); 
	 
	// 调用AddMinusDIB()函数相减两幅DIB 
	if(pDoc->GetDibImage()->AddMinusDIB(lpDIBBits,lpDIBBitsBK,lWidth,lHeight,false)) 
	{		 
		pDoc->SetModifiedFlag(TRUE);		// 设置脏标记		 
		pDoc->UpdateAllViews(NULL);			// 更新视图 
	} 
	else 
	{ 
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
	} 
 
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
	::GlobalUnlock((HGLOBAL) hDIBBK); 
 
	EndWaitCursor(); 
} 
 
void CDirectView::OnDetectTemplate()  
{ 
	CDirectDoc* pDoc = GetDocument(); 
		 
	LPSTR lpDIB,lpTemplateDIB;				// 指向DIB的指针	 
	LPSTR    lpDIBBits,lpTemplateDIBBits;	// 指向DIB象素指针	 
	long lWidth,lHeight;					//图像的宽度与高度	 
	long lTemplateWidth,lTemplateHeight;	//模板的宽度与高度 
	HDIB hTemplateDIB; 
 
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); 
	 
	 
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的水平镜像,其它的可以类推) 
	if (pDoc->GetDibImage()->DIBNumColors(lpDIB) != 256) 
	{ 
		MessageBox("目前只支持256色位图的平移!", "系统提示" ,  
			MB_ICONINFORMATION | MB_OK); 
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
 
		return; 
	} 
	 
	BeginWaitCursor(); 
 
	// 找到DIB图像象素起始位置 
	lpDIBBits = pDoc->GetDibImage()->FindDIBBits(lpDIB); 
	 
	lWidth = pDoc->GetDibImage()->DIBWidth(lpDIB); 
	lHeight = pDoc->GetDibImage()->DIBHeight(lpDIB); 
	CFileDialog dlg(TRUE,"bmp","*.bmp"); 
	if(dlg.DoModal() == IDOK) 
	{ 
	 	CFile file; 
	 	CFileException fe; 
  
	 	CString strPathName; 
		strPathName = dlg.GetPathName(); 
  
		VERIFY(file.Open(strPathName,CFile::modeRead|CFile::shareDenyWrite,&fe)); 
 
		TRY 
		{ 
 			hTemplateDIB = pDoc->GetDibImage()->ReadDIBFile(file); 
		} 
		CATCH (CFileException, eLoad) 
		{ 
	 		file.Abort(); 
 
			EndWaitCursor(); 
 
			hTemplateDIB = NULL; 
 
			return; 
		} 
		END_CATCH 
 	 
		if (hTemplateDIB == NULL) 
		{ 
 			CString strMsg; 
 			strMsg = "读取图像时出错!可能是不支持该类型的图像文件!"; 
 			MessageBox(strMsg, NULL, MB_ICONINFORMATION | MB_OK); 
 
 			EndWaitCursor(); 
 
 			return; 
 		} 
 	} 
	else 
	{ 
 		EndWaitCursor(); 
 
		return; 
	} 
 
	lpTemplateDIB = (LPSTR) ::GlobalLock((HGLOBAL) hTemplateDIB); 
	 
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的模板匹配,其它的可以类推) 
	if (pDoc->GetDibImage()->DIBNumColors(lpTemplateDIB) != 256) 
	{ 
		MessageBox("目前只支持256色位图!","系统提示",MB_ICONINFORMATION|MB_OK); 
 
		::GlobalUnlock((HGLOBAL) hTemplateDIB); 
 
		return; 
	} 
 
	BeginWaitCursor(); 
 
	// 找到DIB图像象素起始位置 
	lpTemplateDIBBits = pDoc->GetDibImage()->FindDIBBits(lpTemplateDIB); 
	 
	lTemplateWidth = pDoc->GetDibImage()->DIBWidth(lpTemplateDIB); 
	lTemplateHeight = pDoc->GetDibImage()->DIBHeight(lpTemplateDIB); 
	if(lTemplateHeight > lHeight || lTemplateWidth > lWidth ) 
	{ 
		MessageBox("模板尺寸大于源图像尺寸!", "系统提示" ,  
			MB_ICONINFORMATION | MB_OK); 
		::GlobalUnlock((HGLOBAL) hTemplateDIB); 
 
		return; 
	} 
	// 调用TemplateMatchDIB()函数进行模板匹配 
	if (pDoc->GetDibImage()->TemplateMatchDIB(lpDIBBits,lpTemplateDIBBits,  
		lWidth,lHeight, lTemplateWidth,lTemplateHeight)) 
	{ 
		pDoc->SetModifiedFlag(TRUE);		// 设置脏标记		 
		pDoc->UpdateAllViews(NULL);			// 更新视图 
	} 
	else 
	{ 
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
	} 
 
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
	::GlobalUnlock((HGLOBAL) hTemplateDIB); 
 
	EndWaitCursor(); 
} 
 
void CDirectView::OnDetectThreshold()  
{ 
	//阈值分割 
 
	CDirectDoc* pDoc = GetDocument(); 
	 
	LPSTR	lpDIB;			// 指向DIB的指针 
	LPSTR   lpDIBBits;		// 指向DIB象素指针 
 
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); 
	 
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的阈值分割,其它的可以类推) 
	if (pDoc->GetDibImage()->DIBNumColors(lpDIB) != 256) 
	{ 
		MessageBox("目前只支持256色位图的运算!", "系统提示" ,  
			MB_ICONINFORMATION | MB_OK); 
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
 
		return; 
	} 
	 
	BeginWaitCursor(); 
 
	// 找到DIB图像象素起始位置 
	lpDIBBits = pDoc->GetDibImage()->FindDIBBits(lpDIB); 
	 
	// 调用ThresholdDIB()函数对DIB进行阈值分割 
	if (pDoc->GetDibImage()->ThresholdDIB(lpDIBBits, 
		pDoc->GetDibImage()->DIBWidth(lpDIB),  
		pDoc->GetDibImage()->DIBHeight(lpDIB))) 
	{		 
		pDoc->SetModifiedFlag(TRUE);		// 设置脏标记		 
		pDoc->UpdateAllViews(NULL);			// 更新视图 
	} 
	else 
	{ 
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
	} 
	 
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
 
	EndWaitCursor(); 
} 
 
void CDirectView::OnDetectVprojection()  
{ 
	//垂直投影 
 
	CDirectDoc* pDoc = GetDocument(); 
		 
	LPSTR	lpDIB;				// 指向DIB的指针	 
	LPSTR   lpDIBBits;			// 指向DIB象素指针 
 
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); 
	 
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的投影,其它的可以类推) 
	if (pDoc->GetDibImage()->DIBNumColors(lpDIB) != 256) 
	{ 
		MessageBox("目前只支持256色位图的运算!", "系统提示" ,  
			MB_ICONINFORMATION | MB_OK); 
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
 
		return; 
	} 
	 
	BeginWaitCursor(); 
 
	// 找到DIB图像象素起始位置 
	lpDIBBits = pDoc->GetDibImage()->FindDIBBits(lpDIB); 
	 
	// 调用VprojectDIB()函数对DIB进行垂直投影 
	if (pDoc->GetDibImage()->VprojectDIB(lpDIBBits,  
		pDoc->GetDibImage()->DIBWidth(lpDIB),  
		pDoc->GetDibImage()->DIBHeight(lpDIB))) 
	{ 
		pDoc->SetModifiedFlag(TRUE);		// 设置脏标记		 
		pDoc->UpdateAllViews(NULL);			// 更新视图 
	} 
	else 
	{ 
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
	} 
	 
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
 
	EndWaitCursor(); 
}