www.pudn.com > WhiteBalance.rar > WhiteBalanceView.cpp


// WhiteBalanceView.cpp : implementation of the CWhiteBalanceView class 
// 
 
#include "stdafx.h" 
#include "WhiteBalance.h" 
 
#include "WhiteBalanceDoc.h" 
#include "WhiteBalanceView.h" 
 
#include "Choose.h" 
#include "Custom.h" 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CWhiteBalanceView 
 
IMPLEMENT_DYNCREATE(CWhiteBalanceView, CScrollView) 
 
BEGIN_MESSAGE_MAP(CWhiteBalanceView, CScrollView) 
	//{{AFX_MSG_MAP(CWhiteBalanceView) 
	ON_COMMAND(ID_CHOOSE_FORMIMAGE, OnChooseFormimage) 
	ON_WM_ERASEBKGND() 
	ON_WM_LBUTTONDOWN() 
	ON_COMMAND(ID_CUSTOM_WHITE, OnCustomWhite) 
	ON_WM_CANCELMODE() 
	ON_WM_CAPTURECHANGED() 
 
	//}}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() 
 
///////////////////////////////////////////////////////////////////////////// 
// CWhiteBalanceView construction/destruction 
 
CWhiteBalanceView::CWhiteBalanceView() 
{ 
	// TODO: add construction code here 
    g_pDlgChoose=NULL; 
} 
 
CWhiteBalanceView::~CWhiteBalanceView() 
{ 
//	delete g_pDlgChoose; 
} 
 
BOOL CWhiteBalanceView::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	// TODO: Modify the Window class or styles here by modifying 
	//  the CREATESTRUCT cs 
 
	return CScrollView::PreCreateWindow(cs); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CWhiteBalanceView drawing 
 
void CWhiteBalanceView::OnDraw(CDC* pDC) 
{ 
	// 显示等待光标 
	BeginWaitCursor(); 
	 
	// 获取文档 
	CWhiteBalanceDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	 
	// 获取DIB 
	HDIB hDIB = pDoc->GetHDIB(); 
	 
	// 判断DIB是否为空 
	if (hDIB != NULL) 
	{ 
		LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB); 
		 
		// 获取DIB宽度 
		int cxDIB = (int) ::DIBWidth(lpDIB); 
		 
		// 获取DIB高度 
		int cyDIB = (int) ::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; 
		} 
		 
		// 输出DIB 
		::PaintDIB(pDC->m_hDC, &rcDest, pDoc->GetHDIB(), 
			&rcDIB, pDoc->GetDocPalette()); 
	} 
	 
	// 恢复正常光标 
	EndWaitCursor(); 
 
 
	// TODO: add draw code for native data here 
} 
 
void CWhiteBalanceView::OnInitialUpdate() 
{ 
	CScrollView::OnInitialUpdate(); 
 
	CSize sizeTotal; 
	// TODO: calculate the total size of this view 
	sizeTotal.cx = sizeTotal.cy = 100; 
	SetScrollSizes(MM_TEXT, sizeTotal); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CWhiteBalanceView printing 
 
BOOL CWhiteBalanceView::OnPreparePrinting(CPrintInfo* pInfo) 
{ 
	// default preparation 
	return DoPreparePrinting(pInfo); 
} 
 
void CWhiteBalanceView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add extra initialization before printing 
} 
 
void CWhiteBalanceView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add cleanup after printing 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CWhiteBalanceView diagnostics 
 
#ifdef _DEBUG 
void CWhiteBalanceView::AssertValid() const 
{ 
	CScrollView::AssertValid(); 
} 
 
void CWhiteBalanceView::Dump(CDumpContext& dc) const 
{ 
	CScrollView::Dump(dc); 
} 
 
CWhiteBalanceDoc* CWhiteBalanceView::GetDocument() // non-debug version is inline 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CWhiteBalanceDoc))); 
	return (CWhiteBalanceDoc*)m_pDocument; 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CWhiteBalanceView message handlers 
 
void CWhiteBalanceView::OnChooseFormimage()  
{ 
		CWhiteBalanceDoc* pDoc = GetDocument(); 
		ASSERT_VALID(pDoc); 
		// TODO: Add your command handler code here 
		pDoc->m_ChangeFlag=1; 
		pDoc->m_ChooseFI=1; 
		if (pDoc->m_WhCh) 
		{ 
			 
			g_pDlgChoose=new CChoose; 
			g_pDlgChoose->Create(IDD_DIALOG_CHOOSE,this); 
			g_pDlgChoose->ShowWindow(SW_SHOW); 
	 
		} 
		else 
		AfxMessageBox("请选择一个图像先!"); 
} 
 
BOOL CWhiteBalanceView::OnEraseBkgnd(CDC* pDC)  
{ 
	// TODO: Add your message handler code here and/or call default 
	CWhiteBalanceDoc* 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 CWhiteBalanceView::OnLButtonDown(UINT nFlags, CPoint point)  
{ 
	// TODO: Add your message handler code here and/or call default 
	 
	CWhiteBalanceDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	if (pDoc->m_ChooseFI=1) 
	{ 
		 
		LPSTR	lpDIB; 
		lpDIB = (LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB()); 
		 
		LPSTR lpDIBBits = ::FindDIBBits(lpDIB); 
		 
 //       FinalProcess(RGB(255,255,255),pDoc); 
        
 
		BYTE R,G,B; 
		 
		if(::GetPtRGB(lpDIBBits,::DIBWidth(lpDIB),::DIBHeight(lpDIB), 
			point.x,point.y,R,G,B)) 
		{ 
			COLORREF clr(RGB(R,G,B)); 
			pDoc->m_Color=clr; 
			g_pDlgChoose->SetColor(clr,pDoc); 
        	 
			FinalProcess(clr,pDoc); 
 
		} 
 
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
		CScrollView::OnLButtonDown(nFlags, point); 
	} 
 
} 
 
 
void CWhiteBalanceView::FinalProcess(COLORREF clr, CWhiteBalanceDoc *pDoc) 
{ 
 
	if (pDoc->m_ChangeFlag==1) 
	{ 
		 
		if(pDoc->GetHDIB()==NULL) 
			return; 
		 
		HDIB hDib=pDoc->GetHDIB(); 
		LPSTR lpTemp; 
		lpTemp= (LPSTR) ::GlobalLock(hDib); 
		 
		BYTE R,G,B; 
		DOUBLE rscale,gscale,bscale; 
		R=GetRValue(clr); 
		G=GetGValue(clr); 
		B=GetBValue(clr); 
		rscale=(DOUBLE)255/(DOUBLE)R; 
		gscale=(DOUBLE)255/(DOUBLE)G; 
		bscale=(DOUBLE)255/(DOUBLE)B; 
 
		::ResetDIBBits(::FindDIBBits(lpTemp),::DIBWidth(lpTemp), 
			           ::DIBHeight(lpTemp),rscale,gscale,bscale); 
		 
		pDoc->UpdateAllViews(NULL); 
		::GlobalUnlock(hDib); 
	} 
	else 
		return; 
} 
 
void CWhiteBalanceView::OnCustomWhite()  
{ 
	// TODO: Add your command handler code here 
	CWhiteBalanceDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	if (pDoc->m_WhCh) 
	{ 
		 
		CCustom dlg(pDoc); 
		dlg.DoModal(); 
		FinalProcess(pDoc->m_Color,pDoc); 
	} 
	else 
		AfxMessageBox("请选择一个图像先!"); 
}