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&amt; 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, &amt;rcDest, pDoc->GetHDIB(),
&amt;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&amt; 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(&amt;brush);
CRect rectClip;
pDC->GetClipBox(&amt;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("请选择一个图像先!");
}